]> Dogcows Code - chaz/openbox/commitdiff
when un-showing the desktop if a window is getting shown, iconify the others so just...
authorDana Jansens <danakj@orodu.net>
Thu, 10 May 2007 23:22:54 +0000 (23:22 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 10 May 2007 23:22:54 +0000 (23:22 +0000)
openbox/action.c
openbox/client.c
openbox/client.h
openbox/client_menu.c
openbox/event.c
openbox/screen.c
openbox/screen.h

index 58952a1a8716cdc595a480a8eb96ec9928901e8d..804fe0be76506ba55cf87d9609c6adb9ddf90eac 100644 (file)
@@ -1245,7 +1245,7 @@ void action_unfocus (union ActionData *data)
 void action_iconify(union ActionData *data)
 {
     client_action_start(data);
-    client_iconify(data->client.any.c, TRUE, TRUE);
+    client_iconify(data->client.any.c, TRUE, TRUE, FALSE);
     client_action_end(data);
 }
 
@@ -1906,17 +1906,17 @@ void action_toggle_dockautohide(union ActionData *data)
 
 void action_toggle_show_desktop(union ActionData *data)
 {
-    screen_show_desktop(!screen_showing_desktop, TRUE);
+    screen_show_desktop(!screen_showing_desktop, NULL);
 }
 
 void action_show_desktop(union ActionData *data)
 {
-    screen_show_desktop(TRUE, TRUE);
+    screen_show_desktop(TRUE, NULL);
 }
 
 void action_unshow_desktop(union ActionData *data)
 {
-    screen_show_desktop(FALSE, TRUE);
+    screen_show_desktop(FALSE, NULL);
 }
 
 void action_break_chroot(union ActionData *data)
index 6bc2b630f00046ccf5b7f9d10e7bb0c13d971a0e..f41c7558140062b53dee565ebaffb9b69a1283a1 100644 (file)
@@ -1694,7 +1694,7 @@ static void client_change_allowed_actions(ObClient *self)
         else self->shaded = FALSE;
     }
     if (!(self->functions & OB_CLIENT_FUNC_ICONIFY) && self->iconic) {
-        if (self->frame) client_iconify(self, FALSE, TRUE);
+        if (self->frame) client_iconify(self, FALSE, TRUE, FALSE);
         else self->iconic = FALSE;
     }
     if (!(self->functions & OB_CLIENT_FUNC_FULLSCREEN) && self->fullscreen) {
@@ -2432,7 +2432,7 @@ static void client_apply_startup_state(ObClient *self, gint x, gint y)
 
     if (self->iconic) {
         self->iconic = FALSE;
-        client_iconify(self, TRUE, FALSE);
+        client_iconify(self, TRUE, FALSE, TRUE);
     }
     if (self->fullscreen) {
         self->fullscreen = FALSE;
@@ -2807,7 +2807,8 @@ void client_fullscreen(ObClient *self, gboolean fs)
 }
 
 static void client_iconify_recursive(ObClient *self,
-                                     gboolean iconic, gboolean curdesk)
+                                     gboolean iconic, gboolean curdesk,
+                                     gboolean hide_animation)
 {
     GSList *it;
     gboolean changed = FALSE;
@@ -2847,7 +2848,7 @@ static void client_iconify_recursive(ObClient *self,
 
     if (changed) {
         client_change_state(self);
-        if (ob_state() != OB_STATE_STARTING && config_animate_iconify)
+        if (config_animate_iconify && !hide_animation)
             frame_begin_iconify_animation(self->frame, iconic);
         /* do this after starting the animation so it doesn't flash */
         client_showhide(self);
@@ -2858,15 +2859,17 @@ static void client_iconify_recursive(ObClient *self,
     for (it = self->transients; it; it = g_slist_next(it))
         if (it->data != self)
             if (client_is_direct_child(self, it->data) || !iconic)
-                client_iconify_recursive(it->data, iconic, curdesk);
+                client_iconify_recursive(it->data, iconic, curdesk,
+                                         hide_animation);
 }
 
-void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk)
+void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk,
+                    gboolean hide_animation)
 {
     if (self->functions & OB_CLIENT_FUNC_ICONIFY || !iconic) {
         /* move up the transient chain as far as possible first */
         self = client_search_top_normal_parent(self);
-        client_iconify_recursive(self, iconic, curdesk);
+        client_iconify_recursive(self, iconic, curdesk, hide_animation);
     }
 }
 
@@ -3100,10 +3103,10 @@ void client_set_wm_state(ObClient *self, glong state)
   
     switch (state) {
     case IconicState:
-        client_iconify(self, TRUE, TRUE);
+        client_iconify(self, TRUE, TRUE, FALSE);
         break;
     case NormalState:
-        client_iconify(self, FALSE, TRUE);
+        client_iconify(self, FALSE, TRUE, FALSE);
         break;
     }
 }
@@ -3267,7 +3270,7 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
         stacking_raise(CLIENT_AS_WINDOW(self));
     }
     if (iconic != self->iconic)
-        client_iconify(self, iconic, FALSE);
+        client_iconify(self, iconic, FALSE, FALSE);
 
     if (demands_attention != self->demands_attention)
         client_hilite(self, demands_attention);
@@ -3390,9 +3393,9 @@ static void client_present(ObClient *self, gboolean here, gboolean raise)
     event_halt_focus_delay();
 
     if (client_normal(self) && screen_showing_desktop)
-        screen_show_desktop(FALSE, FALSE);
+        screen_show_desktop(FALSE, self);
     if (self->iconic)
-        client_iconify(self, FALSE, here);
+        client_iconify(self, FALSE, here, FALSE);
     if (self->desktop != DESKTOP_ALL &&
         self->desktop != screen_desktop)
     {
index 5a837391fefefb9f2efe0a102abd2551b0906ae9..aa7f41a578db3cf92ec6d641b2d11fa32a3f51b0 100644 (file)
@@ -458,7 +458,8 @@ void client_fullscreen(ObClient *self, gboolean fs);
                  be uniconified to the current viewable desktop (true) or to
                  its previous desktop (false)
 */
-void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk);
+void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk,
+                    gboolean hide_animation);
 
 /*! Maximize or unmaximize the client window
   @param max true if the window should be maximized; false if it should be
index a44fcbcc5e4cc8e332bec6ee8e11d509368eb63d..be44e45770b18515ab0c2c1059238fc8c631d0eb 100644 (file)
@@ -114,7 +114,7 @@ static void client_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
         menu_frame_hide_all();
         f = NULL; /* and don't update */
 
-        client_iconify(c, TRUE, FALSE);
+        client_iconify(c, TRUE, FALSE, FALSE);
         break;
     case CLIENT_RESTORE:
         client_maximize(c, FALSE, 0);
index bd3911e2f924be13ff84fd06fd08be4d061fd2eb..c529f15648e12dcb790b3866fcafe621a17ba272 100644 (file)
@@ -660,7 +660,7 @@ static void event_handle_root(XEvent *e)
             if (d > 0)
                 screen_set_num_desktops(d);
         } else if (msgtype == prop_atoms.net_showing_desktop) {
-            screen_show_desktop(e->xclient.data.l[0] != 0, TRUE);
+            screen_show_desktop(e->xclient.data.l[0] != 0, NULL);
         } else if (msgtype == prop_atoms.openbox_control) {
             if (e->xclient.data.l[0] == 1)
                 ob_reconfigure();
index dddb788f1352d469a1146dc62c9e361b8b5f452a..3819a3b1415cf70ff8becbaabe2ed45bb4eef9d2 100644 (file)
@@ -906,7 +906,7 @@ void screen_update_desktop_names()
                                       screen_num_desktops);
 }
 
-void screen_show_desktop(gboolean show, gboolean restore_focus)
+void screen_show_desktop(gboolean show, ObClient *show_only)
 {
     GList *it;
      
@@ -915,19 +915,25 @@ void screen_show_desktop(gboolean show, gboolean restore_focus)
     screen_showing_desktop = show;
 
     if (show) {
-        /* bottom to top */
+        /* hide windows bottom to top */
         for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
             if (WINDOW_IS_CLIENT(it->data)) {
                 ObClient *client = it->data;
                 client_showhide(client);
             }
         }
-    } else {
-        /* top to bottom */
+    }
+    else {
+        /* restore windows top to bottom */
         for (it = stacking_list; it; it = g_list_next(it)) {
             if (WINDOW_IS_CLIENT(it->data)) {
                 ObClient *client = it->data;
-                client_showhide(client);
+                if (client_should_show(client)) {
+                    if (!show_only || client == show_only)
+                        client_show(client);
+                    else
+                        client_iconify(client, TRUE, FALSE, TRUE);
+                }
             }
         }
     }
@@ -941,7 +947,8 @@ void screen_show_desktop(gboolean show, gboolean restore_focus)
                 client_focus(it->data))
                 break;
         }
-    } else if (restore_focus) {
+    }
+    else if (!show_only) {
         ObClient *c;
 
         /* use NULL for the "old" argument because the desktop was focused
index a84170f84e45145d2e4bf9d8a1b43c171ab693f2..a694f66349cf4ac16d528f622bfaaad25ff56ea6 100644 (file)
@@ -75,8 +75,12 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
 void screen_desktop_popup(guint d, gboolean show);
 
 /*! Shows and focuses the desktop and hides all the client windows, or
-  returns to the normal state, showing client windows. */
-void screen_show_desktop(gboolean show, gboolean restore_focus);
+  returns to the normal state, showing client windows.
+  @param If show_only is non-NULL, then only that client is shown (assuming
+         show is FALSE (restoring from show-desktop mode), and the rest are
+         iconified.
+*/
+void screen_show_desktop(gboolean show, struct _ObClient *show_only);
 
 /*! Updates the desktop layout from the root property if available */
 void screen_update_layout();
This page took 0.039074 seconds and 4 git commands to generate.