]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
allow focus to fallback to omnipresent windows, except during desktop switching which...
[chaz/openbox] / openbox / event.c
index a75d7711032d6342234c7c02a59e917ea69adff0..e7e3326f6150da463dbe406cf1ea30edca371002 100644 (file)
@@ -499,7 +499,7 @@ static void event_process(const XEvent *ec, gpointer data)
 
             focus_left_screen = FALSE;
 
-            focus_fallback(FALSE, FALSE);
+            focus_fallback(FALSE, FALSE, TRUE);
 
             /* We don't get a FocusOut for this case, because it's just moving
                from our Inferior up to us. This happens when iconifying a
@@ -551,7 +551,7 @@ static void event_process(const XEvent *ec, gpointer data)
                 */
 
                 if (!focus_left_screen)
-                    focus_fallback(FALSE, FALSE);
+                    focus_fallback(FALSE, FALSE, TRUE);
             }
         }
         else if (!client)
@@ -607,7 +607,7 @@ static void event_process(const XEvent *ec, gpointer data)
                 ob_debug_type(OB_DEBUG_FOCUS,
                               "Focus went to an unmanaged window 0x%x !\n",
                               ce.xfocus.window);
-                focus_fallback(TRUE, FALSE);
+                focus_fallback(TRUE, FALSE, TRUE);
             }
         }
 
@@ -1064,6 +1064,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
         if (e->xconfigurerequest.value_mask & CWStackMode) {
             ObClient *sibling = NULL;
+            gulong ignore_start;
 
             /* get the sibling */
             if (e->xconfigurerequest.value_mask & CWSibling) {
@@ -1075,9 +1076,13 @@ static void event_handle_client(ObClient *client, XEvent *e)
             }
 
             /* activate it rather than just focus it */
+            if (!config_focus_under_mouse)
+                ignore_start = event_start_ignore_all_enters();
             stacking_restack_request(client, sibling,
                                      e->xconfigurerequest.detail,
                                      TRUE);
+            if (!config_focus_under_mouse)
+                event_end_ignore_all_enters(ignore_start);
 
             /* if a stacking change moves the window without resizing */
             move = TRUE;
@@ -1420,9 +1425,16 @@ static void event_handle_client(ObClient *client, XEvent *e)
                     e->xclient.data.l[2] == TopIf ||
                     e->xclient.data.l[2] == Opposite)
                 {
+                    gulong ignore_start;
+
+                    if (!config_focus_under_mouse)
+                        ignore_start = event_start_ignore_all_enters();
                     /* just raise, don't activate */
                     stacking_restack_request(client, sibling,
                                              e->xclient.data.l[2], FALSE);
+                    if (!config_focus_under_mouse)
+                        event_end_ignore_all_enters(ignore_start);
+
                     /* send a synthetic ConfigureNotify, cuz this is supposed
                        to be like a ConfigureRequest. */
                     client_reconfigure(client);
@@ -1887,11 +1899,12 @@ static gboolean is_enter_focus_event_ignored(XEvent *e)
 
         /* XXX wraparound... */
         ob_debug("  ignore range %u-%u\n", r->start, r->end);
-        if (e->xany.serial > r->end) {
+        if ((glong)(e->xany.serial - r->end) > 0) {
+            /* past the end */
             ignore_serials = g_slist_delete_link(ignore_serials, it);
             g_free(r);
         }
-        else if (e->xany.serial >= r->start)
+        else if ((glong)(e->xany.serial - r->start) >= 0)
             return TRUE;
     }
     return FALSE;
This page took 0.022622 seconds and 4 git commands to generate.