]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
extranous )
[chaz/openbox] / openbox / client.c
index c0323c2628d15f0b993f9b0cb587cfdbeba6a3fd..9327cbfd7333d6e554cf5df56ea34267e0612a62 100644 (file)
@@ -970,6 +970,7 @@ static void client_get_all(ObClient *self)
     client_update_strut(self);
     client_update_icons(self);
     client_update_user_time(self);
+    client_update_icon_geometry(self);
 }
 
 static void client_get_startup_id(ObClient *self)
@@ -1102,7 +1103,7 @@ static void client_get_state(ObClient *self)
                 self->below = TRUE;
             else if (state[i] == prop_atoms.net_wm_state_demands_attention)
                 self->demands_attention = TRUE;
-            else if (state[i] == prop_atoms.ob_wm_state_undecorated)
+            else if (state[i] == prop_atoms.openbox_wm_state_undecorated)
                 self->undecorated = TRUE;
         }
 
@@ -1265,7 +1266,7 @@ static void client_update_transient_tree(ObClient *self,
             c = it->data;
             if (c != self && (!c->transient_for ||
                               c->transient_for != OB_TRAN_GROUP))
-                c->transients = g_slist_append(c->transients, self);
+                c->transients = g_slist_prepend(c->transients, self);
         }
     }
     /* If we are now transient for a single window which we weren't before,
@@ -1278,7 +1279,7 @@ static void client_update_transient_tree(ObClient *self,
              newparent != oldparent &&
              /* don't make ourself its child if it is already our child */
              !client_is_direct_child(self, newparent))
-        newparent->transients = g_slist_append(newparent->transients, self);
+        newparent->transients = g_slist_prepend(newparent->transients, self);
 
     /* If the group changed then we need to add any new group transient
        windows to our children. But if we're transient for the group, then
@@ -1297,7 +1298,7 @@ static void client_update_transient_tree(ObClient *self,
                 /* Don't make it our child if it is already our parent */
                 !client_is_direct_child(c, self))
             {
-                self->transients = g_slist_append(self->transients, c);
+                self->transients = g_slist_prepend(self->transients, c);
             }
         }
     }
@@ -2022,6 +2023,22 @@ void client_update_user_time(ObClient *self)
     }
 }
 
+void client_update_icon_geometry(ObClient *self)
+{
+    guint num;
+    guint32 *data;
+
+    RECT_SET(self->icon_geometry, 0, 0, 0, 0);
+
+    if (PROP_GETA32(self->window, net_wm_icon_geometry, cardinal, &data, &num)
+        && num == 4)
+    {
+        /* don't let them set it with an area < 0 */
+        RECT_SET(self->icon_geometry, data[0], data[1],
+                 MAX(data[2],0), MAX(data[3],0));
+    }
+}
+
 static void client_get_client_machine(ObClient *self)
 {
     gchar *data = NULL;
@@ -2044,7 +2061,7 @@ static void client_change_wm_state(ObClient *self)
 
     old = self->wmstate;
 
-    if (self->shaded || self->iconic || !self->frame->visible)
+    if (self->shaded || !self->frame->visible)
         self->wmstate = IconicState;
     else
         self->wmstate = NormalState;
@@ -2088,7 +2105,7 @@ static void client_change_state(ObClient *self)
     if (self->demands_attention)
         netstate[num++] = prop_atoms.net_wm_state_demands_attention;
     if (self->undecorated)
-        netstate[num++] = prop_atoms.ob_wm_state_undecorated;
+        netstate[num++] = prop_atoms.openbox_wm_state_undecorated;
     PROP_SETA32(self->window, net_wm_state, atom, netstate, num);
 
     if (self->frame)
@@ -2707,9 +2724,10 @@ static void client_iconify_recursive(ObClient *self,
 
     if (changed) {
         client_change_state(self);
+        if (ob_state() != OB_STATE_STARTING && config_animate_iconify)
+            frame_begin_iconify_animation(self->frame, iconic);
+        /* do this after starting the animation so it doesn't flash */
         client_showhide(self);
-        if (STRUT_EXISTS(self->strut))
-            screen_update_areas();
     }
 
     /* iconify all direct transients, and deiconify all transients
@@ -3035,7 +3053,7 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
                 action = self->demands_attention ?
                     prop_atoms.net_wm_state_remove :
                     prop_atoms.net_wm_state_add;
-            else if (state == prop_atoms.ob_wm_state_undecorated)
+            else if (state == prop_atoms.openbox_wm_state_undecorated)
                 action = undecorated ? prop_atoms.net_wm_state_remove :
                     prop_atoms.net_wm_state_add;
         }
@@ -3065,7 +3083,7 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
                 self->below = TRUE;
             } else if (state == prop_atoms.net_wm_state_demands_attention) {
                 demands_attention = TRUE;
-            } else if (state == prop_atoms.ob_wm_state_undecorated) {
+            } else if (state == prop_atoms.openbox_wm_state_undecorated) {
                 undecorated = TRUE;
             }
 
@@ -3092,7 +3110,7 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
                 self->below = FALSE;
             } else if (state == prop_atoms.net_wm_state_demands_attention) {
                 demands_attention = FALSE;
-            } else if (state == prop_atoms.ob_wm_state_undecorated) {
+            } else if (state == prop_atoms.openbox_wm_state_undecorated) {
                 undecorated = FALSE;
             }
         }
@@ -3261,7 +3279,7 @@ void client_activate(ObClient *self, gboolean here, gboolean user)
         event_halt_focus_delay();
 
         if (client_normal(self) && screen_showing_desktop)
-            screen_show_desktop(FALSE);
+            screen_show_desktop(FALSE, FALSE);
         if (self->iconic)
             client_iconify(self, FALSE, here);
         if (self->desktop != DESKTOP_ALL &&
@@ -3699,7 +3717,10 @@ ObClient* client_under_pointer()
             if (WINDOW_IS_CLIENT(it->data)) {
                 ObClient *c = WINDOW_AS_CLIENT(it->data);
                 if (c->frame->visible &&
-                    RECT_CONTAINS(c->frame->area, x, y)) {
+                    /* ignore all animating windows */
+                    !frame_iconify_animating(c->frame) &&
+                    RECT_CONTAINS(c->frame->area, x, y))
+                {
                     ret = c;
                     break;
                 }
This page took 0.028539 seconds and 4 git commands to generate.