]> Dogcows Code - chaz/openbox/commitdiff
make those apps stay/map on screen!! fuck stupid apps. thats right im talking to...
authorDana Jansens <danakj@orodu.net>
Mon, 28 Jul 2003 18:06:55 +0000 (18:06 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 28 Jul 2003 18:06:55 +0000 (18:06 +0000)
openbox/client.c
openbox/client.h
openbox/event.c
openbox/screen.c

index a6830193fa591fee71ada7348d09d19d0966e421..70873a4377a889dc4b6cd7b701cf08f03f28a489 100644 (file)
@@ -300,7 +300,7 @@ void client_manage(Window window)
     dispatch_client(Event_Client_New, self, 0, 0);
 
     /* make sure the window is visible */
-    client_move_onscreen(self);
+    client_move_onscreen(self, TRUE);
 
     screen_update_areas();
 
@@ -454,27 +454,61 @@ void client_unmanage(ObClient *self)
     client_set_list();
 }
 
-void client_move_onscreen(ObClient *self)
+void client_move_onscreen(ObClient *self, gboolean rude)
+{
+    int x = self->area.x;
+    int y = self->area.y;
+    if (client_find_onscreen(self, &x, &y,
+                             self->area.width, self->area.height, rude)) {
+        client_configure(self, OB_CORNER_TOPLEFT, x, y,
+                         self->area.width, self->area.height,
+                         TRUE, TRUE);
+    }
+}
+
+gboolean client_find_onscreen(ObClient *self, int *x, int *y, int w, int h,
+                              gboolean rude)
 {
     Rect *a;
-    int x = self->frame->area.x, y = self->frame->area.y;
+    int ox = *x, oy = *y;
+
+    frame_client_gravity(self->frame, x, y); /* get where the frame
+                                                would be */
 
     /* XXX watch for xinerama dead areas */
+
     a = screen_area(self->desktop);
-    if (x >= a->x + a->width - 1)
-        x = a->x + a->width - self->frame->area.width;
-    if (y >= a->y + a->height - 1)
-        y = a->y + a->height - self->frame->area.height;
-    if (x + self->frame->area.width - 1 < a->x)
-        x = a->x;
-    if (y + self->frame->area.height - 1< a->y)
-        y = a->y;
-
-    frame_frame_gravity(self->frame, &x, &y); /* get where the client
-                                                 should be */
-    client_configure(self, OB_CORNER_TOPLEFT, x, y,
-                     self->area.width, self->area.height,
-                     TRUE, TRUE);
+    if (*x >= a->x + a->width - 1)
+        *x = a->x + a->width - self->frame->area.width;
+    if (*y >= a->y + a->height - 1)
+        *y = a->y + a->height - self->frame->area.height;
+    if (*x + self->frame->area.width - 1 < a->x)
+        *x = a->x;
+    if (*y + self->frame->area.height - 1 < a->y)
+        *y = a->y;
+
+    if (rude) {
+        /* this is my MOZILLA BITCHSLAP. oh ya it fucking feels good.
+           Java can suck it too. */
+
+        /* dont let windows map/move into the strut unless they
+           are bigger than the available area */
+        if (w <= a->width) {
+            if (*x < a->x) *x = a->x;
+            if (*x + w > a->x + a->width)
+                *x = a->x + a->width - w;
+        }
+        if (h <= a->height) {
+            if (*y < a->y) *y = a->y;
+            if (*y + h > a->y + a->height)
+                *y = a->y + a->height - h;
+        }
+    }
+
+    frame_frame_gravity(self->frame, x, y); /* get where the client
+                                               should be */
+
+    return ox != *x || oy != *y;
 }
 
 static void client_toggle_border(ObClient *self, gboolean show)
@@ -891,22 +925,7 @@ void client_update_normal_hints(ObClient *self)
 
     /* get the hints from the window */
     if (XGetWMNormalHints(ob_display, self->window, &size, &ret)) {
-        if (size.flags & (PPosition|USPosition)) {
-            Rect *a;
-            
-            /* this is my MOZILLA BITCHSLAP. oh ya it fucking feels good.
-               Java can suck it too. */
-
-            /* dont let windows map above/left into the strut unless they
-               are bigger than the available area */
-            a = screen_area(self->desktop);
-            if (self->area.width <= a->width && self->area.x < a->x)
-                self->area.x = a->x;
-            if (self->area.height <= a->height && self->area.y < a->y)
-                self->area.y = a->y;
-
-            self->positioned = TRUE;
-        }
+        self->positioned = !!(size.flags & (PPosition|USPosition));
 
        if (size.flags & PWinGravity) {
            self->gravity = size.win_gravity;
index 7001765f60b0e830c3ea86d0afdb1b49e0bb5ab5..4421f8fe3e4f4af048076b0699432ddb70f9dbb8 100644 (file)
@@ -284,10 +284,28 @@ void client_configure(ObClient *self, ObCorner anchor,
 
 void client_reconfigure(ObClient *self);
 
+/*! Finds coordinates to keep a client on the screen.
+  @param self The client
+  @param x The x coord of the client, may be changed.
+  @param y The y coord of the client, may be changed.
+  @param w The width of the client.
+  @param w The height of the client.
+  @param rude Be rude about it. If false, it is only moved if it is entirely
+              not visible. If true, then make sure the window is inside the
+              struts if possible.
+  @return true if the client was moved to be on-screen; false if not.
+*/
+gboolean client_find_onscreen(ObClient *self, int *x, int *y, int w, int h,
+                              gboolean rude);
+
 /*! Moves a client so that it is on screen if it is entirely out of the
   viewable screen.
+  @param self The client to move
+  @param rude Be rude about it. If false, it is only moved if it is entirely
+              not visible. If true, then make sure the window is inside the
+              struts if possible.
 */
-void client_move_onscreen(ObClient *self);
+void client_move_onscreen(ObClient *self, gboolean rude);
 
 /*! Fullscreen's or unfullscreen's the client window
   @param fs true if the window should be made fullscreen; false if it should
index 4f9f61dc6022bb093b7e85d08dbefdf5a352e2a6..a35c5258a24858a85f7ba5b65ade8f2cc6ff67e6 100644 (file)
@@ -725,7 +725,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
                                               CWX | CWY)) {
            int x, y, w, h;
            ObCorner corner;
-            Rect *a;
 
            x = (e->xconfigurerequest.value_mask & CWX) ?
                e->xconfigurerequest.x : client->area.x;
@@ -736,15 +735,15 @@ static void event_handle_client(ObClient *client, XEvent *e)
            h = (e->xconfigurerequest.value_mask & CWHeight) ?
                e->xconfigurerequest.height : client->area.height;
 
-            /* dont let windows move above/left into the strut unless they are
-               bigger than the available area */
-            a = screen_area(client->desktop);
-            if (e->xconfigurerequest.value_mask & CWX &&
-                w <= a->width && x < a->x)
-                x = a->x;
-            if (e->xconfigurerequest.value_mask & CWY &&
-                h <= a->height && y < a->y)
-                y = a->y;
+            {
+                int newx = x;
+                int newy = y;
+                client_find_onscreen(client, &newx, &newy, w, h, TRUE);
+                if (e->xconfigurerequest.value_mask & CWX)
+                    x = newx;
+                if (e->xconfigurerequest.value_mask & CWY)
+                    y = newy;
+            }
               
            switch (client->gravity) {
            case NorthEastGravity:
@@ -910,7 +909,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
         } else if (msgtype == prop_atoms.net_moveresize_window) {
             int oldg = client->gravity;
             int tmpg, x, y, w, h;
-            Rect *a;
 
             if (e->xclient.data.l[0] & 0xff)
                 tmpg = e->xclient.data.l[0] & 0xff;
@@ -935,22 +933,16 @@ static void event_handle_client(ObClient *client, XEvent *e)
                 h = client->area.y;
             client->gravity = tmpg;
 
-            /* get the frame position */
-            frame_client_gravity(client->frame, &x, &y);
-
-            /* dont let windows move above/left into the strut unless they are
-               bigger than the available area */
-            a = screen_area(client->desktop);
-            if (e->xconfigurerequest.value_mask & CWX &&
-                w <= a->width && x < a->x)
-                x = a->x;
-            if (e->xconfigurerequest.value_mask & CWY &&
-                h <= a->height && y < a->y)
-                y = a->y;
+            {
+                int newx = x;
+                int newy = y;
+                client_find_onscreen(client, &newx, &newy, w, h, TRUE);
+                if (e->xclient.data.l[0] & 1 << 8)
+                    x = newx;
+                if (e->xclient.data.l[0] & 1 << 9)
+                    y = newy;
+            }
               
-            /* go back to the client position */
-            frame_frame_gravity(client->frame, &x, &y);
-
             client_configure(client, OB_CORNER_TOPLEFT,
                              x, y, w, h, FALSE, TRUE);
 
index 59212da17bc6d5b138b92a171c73a2a637070466..b312aba9b73d443b3305187871b5e3c6a7f0d6ca 100644 (file)
@@ -357,7 +357,7 @@ void screen_resize()
     screen_update_areas();
 
     for (it = client_list; it; it = it->next)
-        client_move_onscreen(it->data);
+        client_move_onscreen(it->data, FALSE);
 }
 
 void screen_set_num_desktops(guint num)
This page took 0.037617 seconds and 4 git commands to generate.