]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
not passing timestamps sometimes and not others. set event_curtime when client messag...
[chaz/openbox] / openbox / event.c
index 16ec8e0a6ad851b253c632de5031b2d4395776fd..effa166a0d5198fab6217bf117e4ae8459e20ee2 100644 (file)
@@ -78,11 +78,7 @@ static void focus_delay_client_dest(ObClient *client, gpointer data);
 
 static gboolean menu_hide_delay_func(gpointer data);
 
-/* The most recent time at which an event with a timestamp occured. */
-static Time event_lasttime = 0;
-/* The time for the current event being processed
-   (it's the event_lasttime for events without times, if this is a bug then
-   use CurrentTime instead, but it seems ok) */
+/* The time for the current event being processed */
 Time event_curtime = CurrentTime;
 
 /*! The value of the mask for the NumLock modifier */
@@ -216,9 +212,9 @@ static Window event_get_window(XEvent *e)
     return window;
 }
 
-static void event_set_lasttime(XEvent *e)
+static void event_set_curtime(XEvent *e)
 {
-    Time t = 0;
+    Time t = CurrentTime;
 
     /* grab the lasttime and hack up the state */
     switch (e->type) {
@@ -248,14 +244,7 @@ static void event_set_lasttime(XEvent *e)
         break;
     }
 
-    if (t > event_lasttime) {
-        event_lasttime = t;
-        event_curtime = event_lasttime;
-    } else if (t == 0) {
-        event_curtime = event_lasttime;
-    } else {
-        event_curtime = t;
-    }
+    event_curtime = t;
 }
 
 #define STRIP_MODS(s) \
@@ -455,7 +444,7 @@ static void event_process(const XEvent *ec, gpointer data)
     }
 #endif
 
-    event_set_lasttime(e);
+    event_set_curtime(e);
     event_hack_mods(e);
     if (event_ignore(e, client)) {
         if (ed)
@@ -532,6 +521,9 @@ static void event_process(const XEvent *ec, gpointer data)
             }
         }
     }
+    /* if something happens and it's not from an XEvent, then we don't know
+       the time */
+    event_curtime = CurrentTime;
 }
 
 static void event_handle_root(XEvent *e)
@@ -550,6 +542,7 @@ static void event_handle_root(XEvent *e)
         msgtype = e->xclient.message_type;
         if (msgtype == prop_atoms.net_current_desktop) {
             guint d = e->xclient.data.l[0];
+            event_curtime = e->xclient.data.l[1];
             if (d < screen_num_desktops)
                 screen_set_desktop(d);
         } else if (msgtype == prop_atoms.net_number_of_desktops) {
@@ -663,8 +656,12 @@ static void event_handle_client(ObClient *client, XEvent *e)
     case FocusOut:
         /* Look for the followup FocusIn */
         if (!XCheckIfEvent(ob_display, &ce, look_for_focusin, NULL)) {
-            /* There is no FocusIn, move focus where we can still hear events*/
-            focus_set_client(NULL);
+            /* There is no FocusIn, this means focus went to a window that
+               is not being managed. most likely, this went to PointerRoot
+               or None, meaning the window is no longer around so fallback
+               focus, but not to that window */
+            ob_debug("Focus went to a black hole !\n");
+            focus_fallback(FALSE);
         } else if (ce.xany.window == e->xany.window) {
             /* If focus didn't actually move anywhere, there is nothing to do*/
             break;
@@ -674,8 +671,10 @@ static void event_handle_client(ObClient *client, XEvent *e)
             event_process(&ce, &ed);
             if (ed.ignored) {
                 /* The FocusIn was ignored, this means it was on a window
-                   that isn't a client? How did this happen? */
-                g_assert_not_reached();
+                   that isn't a client. */
+                ob_debug("Focus went to an unmanaged window 0x%x !\n",
+                         ce.xfocus.window);
+                focus_fallback(TRUE);
             }
         }
 
@@ -882,6 +881,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
         }
         break;
     case UnmapNotify:
+        ob_debug("UnmapNotify for window 0x%x\n", client->window);
         if (client->ignore_unmaps) {
             client->ignore_unmaps--;
             break;
@@ -889,6 +889,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
         client_unmanage(client);
         break;
     case DestroyNotify:
+        ob_debug("DestroyNotify for window 0x%x\n", client->window);
         client_unmanage(client);
         break;
     case ReparentNotify:
@@ -915,7 +916,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                                        it can happen now when the window is on
                                        another desktop, but we still don't
                                        want it! */
-        client_activate(client, FALSE, TRUE, CurrentTime);
+        client_activate(client, FALSE, TRUE);
         break;
     case ClientMessage:
         /* validate cuz we query stuff off the client here */
@@ -974,11 +975,11 @@ static void event_handle_client(ObClient *client, XEvent *e)
                      (e->xclient.data.l[0] == 0 ? "unknown" :
                       (e->xclient.data.l[0] == 1 ? "application" :
                        (e->xclient.data.l[0] == 2 ? "user" : "INVALID"))));
-            /* XXX make use of data.l[1] and [2] ! */
+            /* XXX make use of data.l[2] ! */
+            event_curtime = e->xclient.data.l[1];
             client_activate(client, FALSE,
                             (e->xclient.data.l[0] == 0 ||
-                             e->xclient.data.l[0] == 2),
-                            e->xclient.data.l[1]);
+                             e->xclient.data.l[0] == 2));
         } else if (msgtype == prop_atoms.net_wm_moveresize) {
             ob_debug("net_wm_moveresize for 0x%lx direction %d\n",
                      client->window, e->xclient.data.l[2]);
This page took 0.024577 seconds and 4 git commands to generate.