]> Dogcows Code - chaz/openbox/blobdiff - openbox/stacking.c
Fix some typos and style in client.c, and add a comment.
[chaz/openbox] / openbox / stacking.c
index 34ab05888956bfc0333e8c1a50c04b82e6a3ec80..4c24e3e87f06ed2414006f41abe266e3872ba7a9 100644 (file)
 #include "group.h"
 #include "frame.h"
 #include "window.h"
+#include "event.h"
 #include "debug.h"
 
 GList  *stacking_list = NULL;
 /*! When true, stacking changes will not be reflected on the screen.  This is
   to freeze the on-screen stacking order while a window is being temporarily
   raised during focus cycling */
-gboolean pause_changes = FALSE;
+static gboolean pause_changes = FALSE;
 
 void stacking_set_list(void)
 {
@@ -114,6 +115,7 @@ void stacking_temp_raise(ObWindow *window)
 {
     Window win[2];
     GList *it;
+    gulong start;
 
     /* don't use this for internal windows..! it would lower them.. */
     g_assert(window_layer(window) < OB_STACKING_LAYER_INTERNAL);
@@ -129,22 +131,27 @@ void stacking_temp_raise(ObWindow *window)
     }
 
     win[1] = window_top(window);
+    start = event_start_ignore_all_enters();
     XRestackWindows(ob_display, win, 2);
+    event_end_ignore_all_enters(start);
 
     pause_changes = TRUE;
 }
 
-void stacking_restore()
+void stacking_restore(void)
 {
     Window *win;
     GList *it;
     gint i;
+    gulong start;
 
     win = g_new(Window, g_list_length(stacking_list) + 1);
     win[0] = screen_support_win;
     for (i = 1, it = stacking_list; it; ++i, it = g_list_next(it))
         win[i] = window_top(it->data);
+    start = event_start_ignore_all_enters();
     XRestackWindows(ob_display, win, i);
+    event_end_ignore_all_enters(start);
     g_free(win);
 
     pause_changes = FALSE;
@@ -214,6 +221,15 @@ static void restack_windows(ObClient *selected, gboolean raise)
     GList *modals = NULL;
     GList *trans = NULL;
 
+    if (raise) {
+        ObClient *p;
+
+        /* if a window is modal for another single window, then raise it to the
+           top too, the same is done with the focus order */
+        while (selected->modal && (p = client_direct_parent(selected)))
+            selected = p;
+    }
+
     /* remove first so we can't run into ourself */
     it = g_list_find(stacking_list, selected);
     g_assert(it);
This page took 0.021745 seconds and 4 git commands to generate.