]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
1. remove some old event handling that was not used at all. yay less bandwidth.
[chaz/openbox] / openbox / event.c
index f276a07921f8c66a0f8d223078cdb43f97cb80cb..759c2e22695412926f9b5eeffa45f0acb9ec585b 100644 (file)
@@ -2,7 +2,7 @@
 
    event.c for the Openbox window manager
    Copyright (c) 2006        Mikael Magnusson
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2003-2007   Dana Jansens
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -348,10 +348,6 @@ static gboolean wanted_focusevent(XEvent *e)
         if (detail == NotifyNonlinearVirtual)
             return TRUE;
 
-        /* This means focus reverted off of a client */
-        if (detail == NotifyInferior)
-            return TRUE;
-
         /* Otherwise.. */
         return FALSE;
     } else {
@@ -376,6 +372,9 @@ static gboolean wanted_focusevent(XEvent *e)
         /* This means focus moved from one client to another */
         if (detail == NotifyNonlinearVirtual)
             return TRUE;
+        /* This means focus had moved to our frame window and now moved off */
+        if (detail == NotifyNonlinear)
+            return TRUE;
 
         /* Otherwise.. */
         return FALSE;
@@ -391,6 +390,9 @@ static gboolean event_ignore(XEvent *e, ObClient *client)
 {
     switch(e->type) {
     case FocusIn:
+        if (!wanted_focusevent(e))
+            return TRUE;
+        break;
     case FocusOut:
         if (!wanted_focusevent(e))
             return TRUE;
@@ -453,23 +455,7 @@ static void event_process(const XEvent *ec, gpointer data)
         /* crossing events for menu */
         event_handle_menu(e);
     } else if (e->type == FocusIn) {
-        if (e->xfocus.detail == NotifyPointerRoot ||
-                   e->xfocus.detail == NotifyDetailNone) {
-            ob_debug_type(OB_DEBUG_FOCUS, "Focus went to root\n");
-            /* Focus has been reverted to the root window or nothing
-               FocusOut events come after UnmapNotify, so we don't need to
-               worry about focusing an invalid window
-             */
-            focus_fallback(TRUE);
-        } else if (e->xfocus.detail == NotifyInferior) {
-            ob_debug_type(OB_DEBUG_FOCUS, "Focus went to parent\n");
-            /* Focus has been reverted to parent, which is our frame window,
-               or the root window
-               FocusOut events come after UnmapNotify, so we don't need to
-               worry about focusing an invalid window
-            */
-            focus_fallback(TRUE);
-        } else if (client && client != focus_client) {
+        if (client && client != focus_client) {
             frame_adjust_focus(client->frame, TRUE);
             focus_set_client(client);
             client_calc_layer(client);
@@ -488,8 +474,18 @@ static void event_process(const XEvent *ec, gpointer data)
             /* nothing is focused */
             focus_set_client(NULL);
         } else if (ce.xany.window == e->xany.window) {
+            ob_debug_type(OB_DEBUG_FOCUS, "Focus didn't go anywhere\n");
             /* If focus didn't actually move anywhere, there is nothing to do*/
             nomove = TRUE;
+        } else if (ce.xfocus.detail == NotifyPointerRoot ||
+                   ce.xfocus.detail == NotifyDetailNone ||
+                   ce.xfocus.detail == NotifyInferior) {
+            ob_debug_type(OB_DEBUG_FOCUS, "Focus went to root\n");
+            /* Focus has been reverted to the root window or nothing
+               FocusOut events come after UnmapNotify, so we don't need to
+               worry about focusing an invalid window
+             */
+            focus_fallback(TRUE);
         } else {
             /* Focus did move, so process the FocusIn event */
             ObEventData ed = { .ignored = FALSE };
@@ -506,6 +502,7 @@ static void event_process(const XEvent *ec, gpointer data)
 
         if (client && !nomove) {
             frame_adjust_focus(client->frame, FALSE);
+            /* focus_set_client has already been called for sure */
             client_calc_layer(client);
         }
     } else if (group)
@@ -675,9 +672,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
     ObFrameContext con;
      
     switch (e->type) {
-    case VisibilityNotify:
-        client->frame->obscured = e->xvisibility.state != VisibilityUnobscured;
-        break;
     case ButtonPress:
     case ButtonRelease:
         /* Wheel buttons don't draw because they are an instant click, so it
@@ -736,12 +730,23 @@ static void event_handle_client(ObClient *client, XEvent *e)
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_FRAME:
+            ob_debug_type(OB_DEBUG_FOCUS,
+                          "%sNotify mode %d detail %d on %lx\n",
+                          (e->type == EnterNotify ? "Enter" : "Leave"),
+                          e->xcrossing.mode,
+                          e->xcrossing.detail, (client?client->window:0));
             if (keyboard_interactively_grabbed())
                 break;
-            if (config_focus_follow && config_focus_delay)
+            if (config_focus_follow && config_focus_delay &&
+                /* leaveinferior events can happen when the mouse goes onto the
+                   window's border and then into the window before the delay
+                   is up */
+                e->xcrossing.detail != NotifyInferior)
+            {
                 ob_main_loop_timeout_remove_data(ob_main_loop,
                                                  focus_delay_func,
                                                  client, FALSE);
+            }
             break;
         default:
             break;
This page took 0.026583 seconds and 4 git commands to generate.