]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
fix a comment
[chaz/openbox] / openbox / event.c
index 9d10698b8b7dd17980108e3e14ffbec7add574fa..fd70c972611e1ef06e95629f50ca0a06c475ce3b 100644 (file)
@@ -28,6 +28,7 @@
 #include "config.h"
 #include "screen.h"
 #include "frame.h"
+#include "grab.h"
 #include "menu.h"
 #include "menuframe.h"
 #include "keyboard.h"
@@ -358,7 +359,7 @@ static Bool event_look_for_focusin(Display *d, XEvent *e, XPointer arg)
     return e->type == FocusIn && wanted_focusevent(e, FALSE);
 }
 
-Bool event_look_for_focusin_client(Display *d, XEvent *e, XPointer arg)
+static Bool event_look_for_focusin_client(Display *d, XEvent *e, XPointer arg)
 {
     return e->type == FocusIn && wanted_focusevent(e, TRUE);
 }
@@ -515,7 +516,7 @@ static void event_process(const XEvent *ec, gpointer data)
                           "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.
+               get the FocusIn for it, after it is unmanaged.
                Just wait for the next FocusOut/FocusIn pair. */
         }
         else if (client != focus_client) {
@@ -573,7 +574,6 @@ static void event_process(const XEvent *ec, gpointer data)
             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);
         }
     } else if (timewinclients)
@@ -1081,7 +1081,10 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
         if (config) {
             client_find_onscreen(client, &x, &y, w, h, FALSE);
-            client_configure_full(client, x, y, w, h, FALSE, TRUE);
+            client_configure(client, x, y, w, h, FALSE, TRUE);
+
+            /* ignore enter events caused by these like ob actions do */
+            event_ignore_queued_enters();
         }
         break;
     }
@@ -1175,6 +1178,9 @@ static void event_handle_client(ObClient *client, XEvent *e)
                      client->window);
             client_set_state(client, e->xclient.data.l[0],
                              e->xclient.data.l[1], e->xclient.data.l[2]);
+
+            /* ignore enter events caused by these like ob actions do */
+            event_ignore_queued_enters();
         } else if (msgtype == prop_atoms.net_close_window) {
             ob_debug("net_close_window for 0x%lx\n", client->window);
             client_close(client);
@@ -1258,7 +1264,11 @@ static void event_handle_client(ObClient *client, XEvent *e)
                      e->xclient.data.l[0] & 1 << 9, y);
             client_convert_gravity(client, grav, &x, &y, w, h);
             client_find_onscreen(client, &x, &y, w, h, FALSE);
+
             client_configure(client, x, y, w, h, FALSE, TRUE);
+
+            /* ignore enter events caused by these like ob actions do */
+            event_ignore_queued_enters();
         } else if (msgtype == prop_atoms.net_restack_window) {
             if (e->xclient.data.l[0] != 2) {
                 ob_debug_type(OB_DEBUG_APP_BUGS,
@@ -1292,11 +1302,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                                              e->xclient.data.l[2], FALSE);
                     /* send a synthetic ConfigureNotify, cuz this is supposed
                        to be like a ConfigureRequest. */
-                    client_configure_full(client, client->area.x,
-                                          client->area.y,
-                                          client->area.width,
-                                          client->area.height,
-                                          FALSE, TRUE);
+                    client_reconfigure(client);
                 } else
                     ob_debug_type(OB_DEBUG_APP_BUGS,
                                   "_NET_RESTACK_WINDOW sent for window %s "
@@ -1693,7 +1699,7 @@ static gboolean focus_delay_func(gpointer data)
 
     event_curtime = d->time;
     if (focus_client != d->client) {
-        if (client_focus(d->client, FALSE) && config_focus_raise)
+        if (client_focus(d->client) && config_focus_raise)
             stacking_raise(CLIENT_AS_WINDOW(d->client));
     }
     event_curtime = old;
@@ -1711,35 +1717,29 @@ void event_halt_focus_delay()
     ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
 }
 
+static Bool event_look_for_enters(Display *d, XEvent *e, XPointer arg)
+{
+    guint *count = (guint*)arg;
+    if (e->type == EnterNotify) {
+        ObWindow *win;
+            
+        win = g_hash_table_lookup(window_map, &e->xany.window);
+        if (win && WINDOW_IS_CLIENT(win))
+            ++(*count);
+    }
+    return False; /* don't disrupt the queue order, just count them */
+}
+
 void event_ignore_queued_enters()
 {
-    GSList *saved = NULL, *it;
-    XEvent *e;
+    XEvent e;
                 
     XSync(ob_display, FALSE);
 
-    /* count the events */
-    while (TRUE) {
-        e = g_new(XEvent, 1);
-        if (XCheckTypedEvent(ob_display, EnterNotify, e)) {
-            ObWindow *win;
-            
-            win = g_hash_table_lookup(window_map, &e->xany.window);
-            if (win && WINDOW_IS_CLIENT(win))
-                ++ignore_enter_focus;
-            
-            saved = g_slist_append(saved, e);
-        } else {
-            g_free(e);
-            break;
-        }
-    }
-    /* put the events back */
-    for (it = saved; it; it = g_slist_next(it)) {
-        XPutBackEvent(ob_display, it->data);
-        g_free(it->data);
-    }
-    g_slist_free(saved);
+    /* count the events without disrupting them */
+    XCheckIfEvent(ob_display, &e, event_look_for_enters,
+                  (XPointer)&ignore_enter_focus);
+
 }
 
 gboolean event_time_after(Time t1, Time t2)
This page took 0.028529 seconds and 4 git commands to generate.