]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
use g_[s]list_next/previous consistantly, and check for "it" instead of "it != NULL...
[chaz/openbox] / openbox / client.c
index 619531de131a69df64e460e3c792d7204e89ef13..c2ddd21a2b2e9311584db000eb859f26ab3ef3d7 100644 (file)
@@ -119,7 +119,7 @@ void client_set_list()
     if (size > 0) {
         windows = g_new(Window, size);
         win_it = windows;
-        for (it = client_list; it != NULL; it = it->next, ++win_it)
+        for (it = client_list; it; it = g_list_next(it), ++win_it)
             *win_it = ((ObClient*)it->data)->window;
     } else
         windows = NULL;
@@ -138,7 +138,7 @@ void client_set_list()
   {
   GSList *it;
 
-  for (it = self->transients; it; it = it->next) {
+  for (it = self->transients; it; it = g_slist_next(it)) {
   if (!func(it->data, data)) return;
   client_foreach_transient(it->data, func, data);
   }
@@ -153,7 +153,7 @@ void client_set_list()
   } else {
   GSList *it;
 
-  for (it = self->group->members; it; it = it->next)
+  for (it = self->group->members; it; it = g_slist_next(it))
   if (it->data != self &&
   !((ObClient*)it->data)->transient_for) {
   if (!func(it->data, data)) return;
@@ -166,7 +166,7 @@ void client_set_list()
 
 void client_manage_all()
 {
-    unsigned int i, j, nchild;
+    guint i, j, nchild;
     Window w, *children;
     XWMHints *wmhints;
     XWindowAttributes attrib;
@@ -269,6 +269,10 @@ void client_manage(Window window)
 
     sn_app_started(self->class);
 
+    /* update the focus lists, do this before the call to change_state or
+       it can end up in the list twice! */
+    focus_order_add_new(self);
+
     client_change_state(self);
 
     /* remove the client's border (and adjust re gravity) */
@@ -287,9 +291,6 @@ void client_manage(Window window)
 
     client_apply_startup_state(self);
 
-    /* update the focus lists */
-    focus_order_add_new(self);
-
     stacking_add(CLIENT_AS_WINDOW(self));
     client_restore_session_stacking(self);
 
@@ -313,7 +314,7 @@ void client_manage(Window window)
             if (self->group) {
                 GSList *it;
 
-                for (it = self->group->members; it; it = it->next)
+                for (it = self->group->members; it; it = g_slist_next(it))
                 {
                     if (client_focused(it->data))
                     {
@@ -337,8 +338,8 @@ void client_manage(Window window)
     }
 
     if (ob_state() == OB_STATE_RUNNING) {
-        int x = self->area.x, ox = x;
-        int y = self->area.y, oy = y;
+        gint x = self->area.x, ox = x;
+        gint y = self->area.y, oy = y;
 
         place_client(self, &x, &y);
 
@@ -456,7 +457,7 @@ void client_unmanage(ObClient *self)
     if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */
         GSList *it;
 
-        for (it = self->group->members; it; it = it->next)
+        for (it = self->group->members; it; it = g_slist_next(it))
             if (it->data != self)
                 ((ObClient*)it->data)->transients =
                     g_slist_remove(((ObClient*)it->data)->transients, self);
@@ -466,7 +467,7 @@ void client_unmanage(ObClient *self)
     }
 
     /* tell our transients that we're gone */
-    for (it = self->transients; it != NULL; it = it->next) {
+    for (it = self->transients; it; it = g_slist_next(it)) {
         if (((ObClient*)it->data)->transient_for != OB_TRAN_GROUP) {
             ((ObClient*)it->data)->transient_for = NULL;
             client_calc_layer(it->data);
@@ -493,10 +494,9 @@ void client_unmanage(ObClient *self)
         PROP_ERASE(self->window, net_wm_state);
         PROP_ERASE(self->window, wm_state);
     } else {
-        /* if we're left in an iconic state, the client wont be mapped. this is
-           bad, since we will no longer be managing the window on restart */
-        if (self->iconic)
-            XMapWindow(ob_display, self->window);
+        /* if we're left in an unmapped state, the client wont be mapped. this
+           is bad, since we will no longer be managing the window on restart */
+        XMapWindow(ob_display, self->window);
     }
 
 
@@ -586,8 +586,8 @@ static void client_restore_session_stacking(ObClient *self)
 
 void client_move_onscreen(ObClient *self, gboolean rude)
 {
-    int x = self->area.x;
-    int y = self->area.y;
+    gint x = self->area.x;
+    gint y = self->area.y;
     if (client_find_onscreen(self, &x, &y,
                              self->frame->area.width,
                              self->frame->area.height, rude)) {
@@ -595,11 +595,11 @@ void client_move_onscreen(ObClient *self, gboolean rude)
     }
 }
 
-gboolean client_find_onscreen(ObClient *self, int *x, int *y, int w, int h,
+gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h,
                               gboolean rude)
 {
     Rect *a;
-    int ox = *x, oy = *y;
+    gint ox = *x, oy = *y;
 
     frame_client_gravity(self->frame, x, y); /* get where the frame
                                                 would be */
@@ -649,8 +649,8 @@ static void client_toggle_border(ObClient *self, gboolean show)
        different position.
        when re-adding the border to the client, the same operation needs to be
        reversed. */
-    int oldx = self->area.x, oldy = self->area.y;
-    int x = oldx, y = oldy;
+    gint oldx = self->area.x, oldy = self->area.y;
+    gint x = oldx, y = oldy;
     switch(self->gravity) {
     default:
     case NorthWestGravity:
@@ -715,22 +715,19 @@ static void client_get_all(ObClient *self)
     client_update_wmhints(self);
     client_get_startup_id(self);
     client_get_desktop(self);
-    client_get_state(self);
     client_get_shaped(self);
 
     client_get_mwm_hints(self);
     client_get_type(self);/* this can change the mwmhints for special cases */
 
+    client_get_state(self);
+
     {
         /* a couple type-based defaults for new windows */
 
         /* this makes sure that these windows appear on all desktops */
         if (self->type == OB_CLIENT_TYPE_DESKTOP)
             self->desktop = DESKTOP_ALL;
-
-        /* dock windows default to ABOVE */
-        if (self->type == OB_CLIENT_TYPE_DOCK && !self->below)
-            self->above = TRUE;
     }
 
     client_update_protocols(self);
@@ -789,7 +786,7 @@ static void client_get_desktop(ObClient *self)
             } else {
                 GSList *it;
 
-                for (it = self->group->members; it; it = it->next)
+                for (it = self->group->members; it; it = g_slist_next(it))
                     if (it->data != self &&
                         !((ObClient*)it->data)->transient_for) {
                         self->desktop = ((ObClient*)it->data)->desktop;
@@ -849,6 +846,38 @@ static void client_get_state(ObClient *self)
 
         g_free(state);
     }
+
+    if (!(self->above || self->below)) {
+        if (self->group) {
+            /* apply stuff from the group */
+            GSList *it;
+            gint layer = -2;
+
+            for (it = self->group->members; it; it = g_slist_next(it)) {
+                ObClient *c = it->data;
+                if (c != self && !client_search_transient(self, c) &&
+                    client_normal(self) && client_normal(c))
+                {
+                    layer = MAX(layer,
+                                (c->above ? 1 : (c->below ? -1 : 0)));
+                }
+            }
+            switch (layer) {
+            case -1:
+                self->below = TRUE;
+                break;
+            case -2:
+            case 0:
+                break;
+            case 1:
+                self->above = TRUE;
+                break;
+            default:
+                g_assert_not_reached();
+                break;
+            }
+        }
+    }
 }
 
 static void client_get_shaped(ObClient *self)
@@ -856,9 +885,9 @@ static void client_get_shaped(ObClient *self)
     self->shaped = FALSE;
 #ifdef   SHAPE
     if (extensions_shape) {
-        int foo;
+        gint foo;
         guint ufoo;
-        int s;
+        gint s;
 
         XShapeSelectInput(ob_display, self->window, ShapeNotifyMask);
 
@@ -1052,8 +1081,8 @@ static void client_get_gravity(ObClient *self)
 void client_update_normal_hints(ObClient *self)
 {
     XSizeHints size;
-    long ret;
-    int oldgravity = self->gravity;
+    glong ret;
+    gint oldgravity = self->gravity;
 
     /* defaults */
     self->min_ratio = 0.0f;
@@ -1065,6 +1094,9 @@ void client_update_normal_hints(ObClient *self)
 
     /* get the hints from the window */
     if (XGetWMNormalHints(ob_display, self->window, &size, &ret)) {
+        /* normal windows can't request placement! har har
+        if (!client_normal(self))
+        */
         self->positioned = !!(size.flags & (PPosition|USPosition));
 
         if (size.flags & PWinGravity) {
@@ -1083,9 +1115,11 @@ void client_update_normal_hints(ObClient *self)
 
         if (size.flags & PAspect) {
             if (size.min_aspect.y)
-                self->min_ratio = (float)size.min_aspect.x / size.min_aspect.y;
+                self->min_ratio =
+                    (gfloat) size.min_aspect.x / size.min_aspect.y;
             if (size.max_aspect.y)
-                self->max_ratio = (float)size.max_aspect.x / size.max_aspect.y;
+                self->max_ratio =
+                    (gfloat) size.max_aspect.x / size.max_aspect.y;
         }
 
         if (size.flags & PMinSize)
@@ -1233,7 +1267,7 @@ void client_setup_decor_and_functions(ObClient *self)
 static void client_change_allowed_actions(ObClient *self)
 {
     guint32 actions[9];
-    int num = 0;
+    gint num = 0;
 
     /* desktop windows are kept on all desktops */
     if (self->type != OB_CLIENT_TYPE_DESKTOP)
@@ -1319,13 +1353,15 @@ void client_update_wmhints(ObClient *self)
             /* remove from the old group if there was one */
             if (self->group != NULL) {
                 /* remove transients of the group */
-                for (it = self->group->members; it; it = it->next)
+                for (it = self->group->members; it; it = g_slist_next(it))
                     self->transients = g_slist_remove(self->transients,
                                                       it->data);
 
                 /* remove myself from parents in the group */
                 if (self->transient_for == OB_TRAN_GROUP) {
-                    for (it = self->group->members; it; it = it->next) {
+                    for (it = self->group->members; it;
+                         it = g_slist_next(it))
+                    {
                         ObClient *c = it->data;
 
                         if (c != self && !c->transient_for)
@@ -1345,7 +1381,9 @@ void client_update_wmhints(ObClient *self)
                 if (!self->transient_for) {
                     /* add other transients of the group that are already
                        set up */
-                    for (it = self->group->members; it; it = it->next) {
+                    for (it = self->group->members; it;
+                         it = g_slist_next(it))
+                    {
                         ObClient *c = it->data;
                         if (c != self && c->transient_for == OB_TRAN_GROUP)
                             self->transients =
@@ -1399,7 +1437,7 @@ void client_update_title(ObClient *self)
 
     /* look for duplicates and append a number */
     nums = 0;
-    for (it = client_list; it; it = it->next)
+    for (it = client_list; it; it = g_list_next(it))
         if (it->data != self) {
             ObClient *c = it->data;
             if (0 == strncmp(c->title, data, strlen(data)))
@@ -1414,7 +1452,7 @@ void client_update_title(ObClient *self)
         }
     /* dont display the number for the first window */
     if (self->title_count > 1) {
-        char *ndata;
+        gchar *ndata;
         ndata = g_strdup_printf("%s - [%u]", data, self->title_count);
         g_free(data);
         data = ndata;
@@ -1444,7 +1482,7 @@ void client_update_title(ObClient *self)
 
     /* append the title count, dont display the number for the first window */
     if (read_title && self->title_count > 1) {
-        char *vdata, *ndata;
+        gchar *vdata, *ndata;
         ndata = g_strdup_printf(" - [%u]", self->title_count);
         vdata = g_strconcat(data, ndata, NULL);
         g_free(ndata);
@@ -1459,8 +1497,8 @@ void client_update_title(ObClient *self)
 
 void client_update_class(ObClient *self)
 {
-    char **data;
-    char *s;
+    gchar **data;
+    gchar *s;
 
     if (self->name) g_free(self->name);
     if (self->class) g_free(self->class);
@@ -1507,10 +1545,19 @@ void client_update_strut(ObClient *self)
     if (!got &&
         PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) {
         if (num == 4) {
+            const Rect *a;
+
             got = TRUE;
+
+            /* use the screen's width/height */
+            a = screen_physical_area();
+
             STRUT_PARTIAL_SET(strut,
                               data[0], data[2], data[1], data[3],
-                              0, 0, 0, 0, 0, 0, 0, 0);
+                              a->y, a->y + a->height - 1,
+                              a->x, a->x + a->width - 1,
+                              a->y, a->y + a->height - 1,
+                              a->x, a->x + a->width - 1);
         }
         g_free(data);
     }
@@ -1671,7 +1718,7 @@ ObClient *client_search_focus_tree(ObClient *self)
     GSList *it;
     ObClient *ret;
 
-    for (it = self->transients; it != NULL; it = it->next) {
+    for (it = self->transients; it; it = g_slist_next(it)) {
         if (client_focused(it->data)) return it->data;
         if ((ret = client_search_focus_tree(it->data))) return ret;
     }
@@ -1687,7 +1734,7 @@ ObClient *client_search_focus_tree_full(ObClient *self)
             GSList *it;
             gboolean recursed = FALSE;
         
-            for (it = self->group->members; it; it = it->next)
+            for (it = self->group->members; it; it = g_slist_next(it))
                 if (!((ObClient*)it->data)->transient_for) {
                     ObClient *c;
                     if ((c = client_search_focus_tree_full(it->data)))
@@ -1718,7 +1765,7 @@ static ObStackingLayer calc_layer(ObClient *self)
     else if (self->type == OB_CLIENT_TYPE_DOCK) {
         if (self->above) l = OB_STACKING_LAYER_DOCK_ABOVE;
         else if (self->below) l = OB_STACKING_LAYER_DOCK_BELOW;
-        else l = OB_STACKING_LAYER_NORMAL;
+        else l = OB_STACKING_LAYER_DOCK_NORMAL;
     }
     else if (self->above) l = OB_STACKING_LAYER_ABOVE;
     else if (self->below) l = OB_STACKING_LAYER_BELOW;
@@ -1737,13 +1784,12 @@ static void client_calc_layer_recursive(ObClient *self, ObClient *orig,
     own = calc_layer(self);
     self->layer = l > own ? l : own;
 
-    for (it = self->transients; it; it = it->next)
+    for (it = self->transients; it; it = g_slist_next(it))
         client_calc_layer_recursive(it->data, orig,
                                     l, raised ? raised : l != old);
 
     if (!raised && l != old)
         if (orig->frame) { /* only restack if the original window is managed */
-            /* XXX add_non_intrusive ever? */
             stacking_remove(CLIENT_AS_WINDOW(self));
             stacking_add(CLIENT_AS_WINDOW(self));
         }
@@ -1766,12 +1812,31 @@ void client_calc_layer(ObClient *self)
 
 gboolean client_should_show(ObClient *self)
 {
-    if (self->iconic) return FALSE;
-    else if (!(self->desktop == screen_desktop ||
-               self->desktop == DESKTOP_ALL)) return FALSE;
-    else if (client_normal(self) && screen_showing_desktop) return FALSE;
+    if (self->iconic)
+        return FALSE;
+    if (client_normal(self) && screen_showing_desktop)
+        return FALSE;
+    /*
+    if (self->transient_for) {
+        if (self->transient_for != OB_TRAN_GROUP)
+            return client_should_show(self->transient_for);
+        else {
+            GSList *it;
+
+            for (it = self->group->members; it; it = g_slist_next(it)) {
+                ObClient *c = it->data;
+                if (c != self && !c->transient_for) {
+                    if (client_should_show(c))
+                        return TRUE;
+                }
+            }
+        }
+    }
+    */
+    if (self->desktop == screen_desktop || self->desktop == DESKTOP_ALL)
+        return TRUE;
     
-    return TRUE;
+    return FALSE;
 }
 
 static void client_showhide(ObClient *self)
@@ -1833,7 +1898,7 @@ static void client_apply_startup_state(ObClient *self)
 }
 
 void client_configure_full(ObClient *self, ObCorner anchor,
-                           int x, int y, int w, int h,
+                           gint x, gint y, gint w, gint h,
                            gboolean user, gboolean final,
                            gboolean force_reply)
 {
@@ -1856,7 +1921,7 @@ void client_configure_full(ObClient *self, ObCorner anchor,
     /* set the size and position if fullscreen */
     if (self->fullscreen) {
 #ifdef VIDMODE
-        int dot;
+        gint dot;
         XF86VidModeModeLine mode;
 #endif
         Rect *a;
@@ -1918,7 +1983,7 @@ void client_configure_full(ObClient *self, ObCorner anchor,
     }
 
     if (!(w == self->area.width && h == self->area.height)) {
-        int basew, baseh, minw, minh;
+        gint basew, baseh, minw, minh;
 
         /* base size is substituted with min size if not specified */
         if (self->base_size.width || self->base_size.height) {
@@ -1975,22 +2040,22 @@ void client_configure_full(ObClient *self, ObCorner anchor,
 
         if (self->min_ratio)
             if (h * self->min_ratio > w) {
-                h = (int)(w / self->min_ratio);
+                h = (gint)(w / self->min_ratio);
 
                 /* you cannot resize to nothing */
                 if (h < 1) {
                     h = 1;
-                    w = (int)(h * self->min_ratio);
+                    w = (gint)(h * self->min_ratio);
                 }
             }
         if (self->max_ratio)
             if (h * self->max_ratio < w) {
-                h = (int)(w / self->max_ratio);
+                h = (gint)(w / self->max_ratio);
 
                 /* you cannot resize to nothing */
                 if (h < 1) {
                     h = 1;
-                    w = (int)(h * self->min_ratio);
+                    w = (gint)(h * self->min_ratio);
                 }
             }
 
@@ -2074,7 +2139,7 @@ void client_configure_full(ObClient *self, ObCorner anchor,
 
 void client_fullscreen(ObClient *self, gboolean fs, gboolean savearea)
 {
-    int x, y, w, h;
+    gint x, y, w, h;
 
     if (!(self->functions & OB_CLIENT_FUNC_FULLSCREEN) || /* can't */
         self->fullscreen == fs) return;                   /* already done */
@@ -2134,7 +2199,7 @@ static void client_iconify_recursive(ObClient *self,
 
         if (iconic) {
             if (self->functions & OB_CLIENT_FUNC_ICONIFY) {
-                long old;
+                glong old;
 
                 old = self->wmstate;
                 self->wmstate = IconicState;
@@ -2142,11 +2207,6 @@ static void client_iconify_recursive(ObClient *self,
                     PROP_MSG(self->window, kde_wm_change_state,
                              self->wmstate, 1, 0, 0);
 
-                self->ignore_unmaps++;
-                /* we unmap the client itself so that we can get MapRequest
-                   events, and because the ICCCM tells us to! */
-                XUnmapWindow(ob_display, self->window);
-
                 /* update the focus lists.. iconic windows go to the bottom of
                    the list, put the new iconic window at the 'top of the
                    bottom'. */
@@ -2155,7 +2215,7 @@ static void client_iconify_recursive(ObClient *self,
                 changed = TRUE;
             }
         } else {
-            long old;
+            glong old;
 
             if (curdesk)
                 client_set_desktop(self, screen_desktop, FALSE);
@@ -2166,8 +2226,6 @@ static void client_iconify_recursive(ObClient *self,
                 PROP_MSG(self->window, kde_wm_change_state,
                          self->wmstate, 1, 0, 0);
 
-            XMapWindow(ob_display, self->window);
-
             /* this puts it after the current focused window */
             focus_order_remove(self);
             focus_order_add_new(self);
@@ -2189,7 +2247,7 @@ static void client_iconify_recursive(ObClient *self,
     }
 
     /* iconify all transients */
-    for (it = self->transients; it != NULL; it = it->next)
+    for (it = self->transients; it; it = g_slist_next(it))
         if (it->data != self) client_iconify_recursive(it->data,
                                                        iconic, curdesk);
 }
@@ -2203,9 +2261,9 @@ void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk)
                              iconic, curdesk);
 }
 
-void client_maximize(ObClient *self, gboolean max, int dir, gboolean savearea)
+void client_maximize(ObClient *self, gboolean max, gint dir, gboolean savearea)
 {
-    int x, y, w, h;
+    gint x, y, w, h;
      
     g_assert(dir == 0 || dir == 1 || dir == 2);
     if (!(self->functions & OB_CLIENT_FUNC_MAXIMIZE)) return; /* can't */
@@ -2293,7 +2351,7 @@ void client_shade(ObClient *self, gboolean shade)
 
     /* when we're iconic, don't change the wmstate */
     if (!self->iconic) {
-        long old;
+        glong old;
 
         old = self->wmstate;
         self->wmstate = shade ? IconicState : NormalState;
@@ -2381,7 +2439,7 @@ void client_set_desktop_recursive(ObClient *self,
     }
 
     /* move all transients */
-    for (it = self->transients; it != NULL; it = it->next)
+    for (it = self->transients; it; it = g_slist_next(it))
         if (it->data != self) client_set_desktop_recursive(it->data,
                                                            target, donthide);
 }
@@ -2397,7 +2455,7 @@ ObClient *client_search_modal_child(ObClient *self)
     GSList *it;
     ObClient *ret;
   
-    for (it = self->transients; it != NULL; it = it->next) {
+    for (it = self->transients; it; it = g_slist_next(it)) {
         ObClient *c = it->data;
         if ((ret = client_search_modal_child(c))) return ret;
         if (c->modal) return c;
@@ -2420,7 +2478,7 @@ gboolean client_validate(ObClient *self)
     return TRUE;
 }
 
-void client_set_wm_state(ObClient *self, long state)
+void client_set_wm_state(ObClient *self, glong state)
 {
     if (state == self->wmstate) return; /* no change */
   
@@ -2434,14 +2492,15 @@ void client_set_wm_state(ObClient *self, long state)
     }
 }
 
-void client_set_state(ObClient *self, Atom action, long data1, long data2)
+void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
 {
     gboolean shaded = self->shaded;
     gboolean fullscreen = self->fullscreen;
     gboolean undecorated = self->undecorated;
     gboolean max_horz = self->max_horz;
     gboolean max_vert = self->max_vert;
-    int i;
+    gboolean modal = self->modal;
+    gint i;
 
     if (!(action == prop_atoms.net_wm_state_add ||
           action == prop_atoms.net_wm_state_remove ||
@@ -2457,7 +2516,7 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
         /* if toggling, then pick whether we're adding or removing */
         if (action == prop_atoms.net_wm_state_toggle) {
             if (state == prop_atoms.net_wm_state_modal)
-                action = self->modal ? prop_atoms.net_wm_state_remove :
+                action = modal ? prop_atoms.net_wm_state_remove :
                     prop_atoms.net_wm_state_add;
             else if (state == prop_atoms.net_wm_state_maximized_vert)
                 action = self->max_vert ? prop_atoms.net_wm_state_remove :
@@ -2493,8 +2552,7 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
     
         if (action == prop_atoms.net_wm_state_add) {
             if (state == prop_atoms.net_wm_state_modal) {
-                /* XXX raise here or something? */
-                self->modal = TRUE;
+                modal = TRUE;
             } else if (state == prop_atoms.net_wm_state_maximized_vert) {
                 max_vert = TRUE;
             } else if (state == prop_atoms.net_wm_state_maximized_horz) {
@@ -2509,7 +2567,9 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
                 fullscreen = TRUE;
             } else if (state == prop_atoms.net_wm_state_above) {
                 self->above = TRUE;
+                self->below = FALSE;
             } else if (state == prop_atoms.net_wm_state_below) {
+                self->above = FALSE;
                 self->below = TRUE;
             } else if (state == prop_atoms.ob_wm_state_undecorated) {
                 undecorated = TRUE;
@@ -2517,7 +2577,7 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
 
         } else { /* action == prop_atoms.net_wm_state_remove */
             if (state == prop_atoms.net_wm_state_modal) {
-                self->modal = FALSE;
+                modal = FALSE;
             } else if (state == prop_atoms.net_wm_state_maximized_vert) {
                 max_vert = FALSE;
             } else if (state == prop_atoms.net_wm_state_maximized_horz) {
@@ -2564,6 +2624,12 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
         client_shade(self, shaded);
     if (undecorated != self->undecorated)
         client_set_undecorated(self, undecorated);
+    if (modal != self->modal) {
+        self->modal = modal;
+        /* when a window changes modality, then its stacking order with its
+           transients needs to change */
+        client_raise(self);
+    }
     client_calc_layer(self);
     client_change_state(self); /* change the hint to reflect these changes */
 }
@@ -2655,7 +2721,7 @@ gboolean client_focus(ObClient *self)
 #ifdef DEBUG_FOCUS
     ob_debug("%sively focusing %lx at %d\n",
              (self->can_focus ? "act" : "pass"),
-             self->window, (int) event_lasttime);
+             self->window, (gint) event_lasttime);
 #endif
 
     /* Cause the FocusIn to come back to us. Important for desktop switches,
@@ -2719,12 +2785,12 @@ gboolean client_focused(ObClient *self)
     return self == focus_client;
 }
 
-static ObClientIcon* client_icon_recursive(ObClient *self, int w, int h)
+static ObClientIcon* client_icon_recursive(ObClient *self, gint w, gint h)
 {
     guint i;
     /* si is the smallest image >= req */
     /* li is the largest image < req */
-    unsigned long size, smallest = 0xffffffff, largest = 0, si = 0, li = 0;
+    gulong size, smallest = 0xffffffff, largest = 0, si = 0, li = 0;
 
     if (!self->nicons) {
         ObClientIcon *parent = NULL;
@@ -2763,7 +2829,7 @@ static ObClientIcon* client_icon_recursive(ObClient *self, int w, int h)
     return &self->icons[li];
 }
 
-const ObClientIcon* client_icon(ObClient *self, int w, int h)
+const ObClientIcon* client_icon(ObClient *self, gint w, gint h)
 {
     ObClientIcon *ret;
     static ObClientIcon deficon;
@@ -2779,10 +2845,10 @@ const ObClientIcon* client_icon(ObClient *self, int w, int h)
 /* this be mostly ripped from fvwm */
 ObClient *client_find_directional(ObClient *c, ObDirection dir) 
 {
-    int my_cx, my_cy, his_cx, his_cy;
-    int offset = 0;
-    int distance = 0;
-    int score, best_score;
+    gint my_cx, my_cy, his_cx, his_cy;
+    gint offset = 0;
+    gint distance = 0;
+    gint score, best_score;
     ObClient *best_client, *cur;
     GList *it;
 
@@ -2796,7 +2862,7 @@ ObClient *client_find_directional(ObClient *c, ObDirection dir)
     best_score = -1;
     best_client = NULL;
 
-    for(it = g_list_first(client_list); it; it = it->next) {
+    for(it = g_list_first(client_list); it; it = g_list_next(it)) {
         cur = it->data;
 
         /* the currently selected window isn't interesting */
@@ -2821,7 +2887,7 @@ ObClient *client_find_directional(ObClient *c, ObDirection dir)
 
         if(dir == OB_DIRECTION_NORTHEAST || dir == OB_DIRECTION_SOUTHEAST ||
            dir == OB_DIRECTION_SOUTHWEST || dir == OB_DIRECTION_NORTHWEST) {
-            int tx;
+            gint tx;
             /* Rotate the diagonals 45 degrees counterclockwise.
              * To do this, multiply the matrix /+h +h\ with the
              * vector (x y).                   \-h +h/
@@ -2874,7 +2940,7 @@ ObClient *client_find_directional(ObClient *c, ObDirection dir)
     return best_client;
 }
 
-void client_set_layer(ObClient *self, int layer)
+void client_set_layer(ObClient *self, gint layer)
 {
     if (layer < 0) {
         self->below = TRUE;
@@ -2901,15 +2967,25 @@ void client_set_undecorated(ObClient *self, gboolean undecorated)
 guint client_monitor(ObClient *self)
 {
     guint i;
+    guint most = 0;
+    guint mostv = 0;
 
     for (i = 0; i < screen_num_monitors; ++i) {
         Rect *area = screen_physical_area_monitor(i);
-        if (RECT_INTERSECTS_RECT(*area, self->frame->area))
-            break;
+        if (RECT_INTERSECTS_RECT(*area, self->frame->area)) {
+            Rect r;
+            guint v;
+
+            RECT_SET_INTERSECTION(r, *area, self->frame->area);
+            v = r.width * r.height;
+
+            if (v > mostv) {
+                mostv = v;
+                most = i;
+            }
+        }
     }
-    if (i == screen_num_monitors) i = 0;
-    g_assert(i < screen_num_monitors);
-    return i;
+    return most;
 }
 
 ObClient *client_search_top_transient(ObClient *self)
@@ -2923,7 +2999,7 @@ ObClient *client_search_top_transient(ObClient *self)
 
             g_assert(self->group);
 
-            for (it = self->group->members; it; it = it->next) {
+            for (it = self->group->members; it; it = g_slist_next(it)) {
                 ObClient *c = it->data;
 
                 /* checking transient_for prevents infinate loops! */
@@ -2947,7 +3023,7 @@ ObClient *client_search_focus_parent(ObClient *self)
         } else {
             GSList *it;
 
-            for (it = self->group->members; it; it = it->next) {
+            for (it = self->group->members; it; it = g_slist_next(it)) {
                 ObClient *c = it->data;
 
                 /* checking transient_for prevents infinate loops! */
@@ -2970,7 +3046,7 @@ ObClient *client_search_parent(ObClient *self, ObClient *search)
         } else {
             GSList *it;
 
-            for (it = self->group->members; it; it = it->next) {
+            for (it = self->group->members; it; it = g_slist_next(it)) {
                 ObClient *c = it->data;
 
                 /* checking transient_for prevents infinate loops! */
@@ -3012,10 +3088,10 @@ void client_update_sm_client_id(ObClient *self)
  * note to self: the edge is the -frame- edge (the actual one), not the
  * client edge.
  */
-int client_directional_edge_search(ObClient *c, ObDirection dir)
+gint client_directional_edge_search(ObClient *c, ObDirection dir)
 {
-    int dest;
-    int my_edge_start, my_edge_end, my_offset;
+    gint dest;
+    gint my_edge_start, my_edge_end, my_offset;
     GList *it;
     Rect *a;
     
@@ -3033,8 +3109,8 @@ int client_directional_edge_search(ObClient *c, ObDirection dir)
         /* default: top of screen */
         dest = a->y;
 
-        for(it = g_list_first(client_list); it; it = it->next) {
-            int his_edge_start, his_edge_end, his_offset;
+        for(it = client_list; it; it = g_list_next(it)) {
+            gint his_edge_start, his_edge_end, his_offset;
             ObClient *cur = it->data;
 
             if(cur == c)
@@ -3074,8 +3150,8 @@ int client_directional_edge_search(ObClient *c, ObDirection dir)
         /* default: bottom of screen */
         dest = a->y + a->height;
 
-        for(it = g_list_first(client_list); it; it = it->next) {
-            int his_edge_start, his_edge_end, his_offset;
+        for(it = client_list; it; it = g_list_next(it)) {
+            gint his_edge_start, his_edge_end, his_offset;
             ObClient *cur = it->data;
 
             if(cur == c)
@@ -3116,8 +3192,8 @@ int client_directional_edge_search(ObClient *c, ObDirection dir)
         /* default: leftmost egde of screen */
         dest = a->x;
 
-        for(it = g_list_first(client_list); it; it = it->next) {
-            int his_edge_start, his_edge_end, his_offset;
+        for(it = client_list; it; it = g_list_next(it)) {
+            gint his_edge_start, his_edge_end, his_offset;
             ObClient *cur = it->data;
 
             if(cur == c)
@@ -3158,8 +3234,8 @@ int client_directional_edge_search(ObClient *c, ObDirection dir)
         /* default: rightmost edge of screen */
         dest = a->x + a->width;
 
-        for(it = g_list_first(client_list); it; it = it->next) {
-            int his_edge_start, his_edge_end, his_offset;
+        for(it = client_list; it; it = g_list_next(it)) {
+            gint his_edge_start, his_edge_end, his_offset;
             ObClient *cur = it->data;
 
             if(cur == c)
@@ -3204,12 +3280,12 @@ int client_directional_edge_search(ObClient *c, ObDirection dir)
 
 ObClient* client_under_pointer()
 {
-    int x, y;
+    gint x, y;
     GList *it;
     ObClient *ret = NULL;
 
     if (screen_pointer_pos(&x, &y)) {
-        for (it = stacking_list; it != NULL; it = it->next) {
+        for (it = stacking_list; it; it = g_list_next(it)) {
             if (WINDOW_IS_CLIENT(it->data)) {
                 ObClient *c = WINDOW_AS_CLIENT(it->data);
                 if (c->frame->visible &&
This page took 0.047818 seconds and 4 git commands to generate.