]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
get rid of the fullscreen below layer. its the same as maximized windows..
[chaz/openbox] / openbox / event.c
index e431e8f40972c47fdaad81c12f26b65b8fb63d6c..a2571f0e112dac34c82fca7e537b48b07d003b6b 100644 (file)
@@ -313,9 +313,9 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only)
 
         /* It was on a client, was it a valid one?
            It's possible to get a FocusIn event for a client that was managed
-           but has disappeared. Don't even parse those FocusIn events.
+           but has disappeared.
         */
-        {
+        if (in_client_only) {
             ObWindow *w = g_hash_table_lookup(window_map, &e->xfocus.window);
             if (!w || !WINDOW_IS_CLIENT(w))
                 return FALSE;
@@ -394,6 +394,9 @@ static void print_focusevent(XEvent *e)
     case NotifyDetailNone:  detailstr="NotifyDetailNone";  break;
     }
 
+    if (mode == NotifyGrab || mode == NotifyUngrab)
+        return;
+
     g_assert(modestr);
     g_assert(detailstr);
     ob_debug_type(OB_DEBUG_FOCUS, "Focus%s 0x%x mode=%s detail=%s\n",
@@ -520,6 +523,26 @@ static void event_process(const XEvent *ec, gpointer data)
                     focus_fallback(TRUE);
             }
         }
+        else if (!client)
+        {
+            XEvent ce;
+
+            ob_debug_type(OB_DEBUG_FOCUS,
+                          "Focus went to a window that is already gone\n");
+
+            /* If you send focus to a window and then it disappears, you can
+               get the FocusIn FocusOut for it, after it is unmanaged.
+            */
+            if (XCheckIfEvent(ob_display, &ce, event_look_for_focusin_client,
+                              NULL))
+            {
+                XPutBackEvent(ob_display, &ce);
+                ob_debug_type(OB_DEBUG_FOCUS,
+                              "  but another FocusIn is coming\n");
+            } else {
+                focus_fallback(TRUE);
+            }
+        }
         else if (client != focus_client) {
             focus_left_screen = FALSE;
             frame_adjust_focus(client->frame, TRUE);
@@ -573,6 +596,8 @@ static void event_process(const XEvent *ec, gpointer data)
 
         if (client && !nomove) {
             frame_adjust_focus(client->frame, FALSE);
+            if (client == focus_client)
+                focus_set_client(NULL);
             /* focus_set_client has already been called for sure */
             client_calc_layer(client);
         }
@@ -681,7 +706,7 @@ static void event_handle_root(XEvent *e)
                 screen_set_num_desktops(d);
         } else if (msgtype == prop_atoms.net_showing_desktop) {
             screen_show_desktop(e->xclient.data.l[0] != 0, NULL);
-        } else if (msgtype == prop_atoms.openbox_control) {
+        } else if (msgtype == prop_atoms.ob_control) {
             if (e->xclient.data.l[0] == 1)
                 ob_reconfigure();
             else if (e->xclient.data.l[0] == 2)
This page took 0.024933 seconds and 4 git commands to generate.