]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
don't take KeyRelease events for menus until they receive a KeyPress event first...
[chaz/openbox] / openbox / event.c
index cd5625990e9fa31ea1cac9f4863a6fb97bfe8f64..6b0ecdd7b04304ff88ec5bc6d4e6dbac46625656 100644 (file)
@@ -74,6 +74,7 @@ typedef struct
 {
     ObClient *client;
     Time time;
+    gulong serial;
 } ObFocusDelayData;
 
 typedef struct
@@ -246,7 +247,6 @@ static void event_set_curtime(XEvent *e)
         event_last_user_time = CurrentTime;
 
     event_curtime = t;
-    event_curserial = 0;
 }
 
 static void event_hack_mods(XEvent *e)
@@ -705,30 +705,9 @@ static void event_process(const XEvent *ec, gpointer data)
         /* Otherwise only process it if it was physically on an openbox
            internal window */
         else {
-            Window target, parent, root, *children;
-            unsigned int nchildren;
             ObWindow *w;
 
-            /* Find the top level ancestor of the subwindow, besides the
-               root */
-            target = e->xbutton.subwindow;
-            ob_debug("subwindow 0x%x\n", target);
-            while (XQueryTree(ob_display, target, &root, &parent, &children,
-                              &nchildren) != 0)
-            {
-                XFree(children);
-                if (parent == root) {
-                    ob_debug("parent is root\n");
-                    break;
-                }
-                target = parent;
-            }
-            ob_debug("toplevel 0x%x\n", target);
-
-            w = g_hash_table_lookup(window_map, &target);
-            ob_debug("w 0x%x\n", w);
-                
-            if ((w = g_hash_table_lookup(window_map, &target)) &&
+            if ((w = g_hash_table_lookup(window_map, &e->xbutton.subwindow)) &&
                 WINDOW_IS_INTERNAL(w))
             {
                 event_handle_user_input(client, e);
@@ -742,6 +721,7 @@ 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;
+    event_curserial = 0;
 }
 
 static void event_handle_root(XEvent *e)
@@ -816,6 +796,7 @@ void event_enter_client(ObClient *client)
             data = g_new(ObFocusDelayData, 1);
             data->client = client;
             data->time = event_curtime;
+            data->serial = event_curserial;
 
             ob_main_loop_timeout_add(ob_main_loop,
                                      config_focus_delay * 1000,
@@ -825,6 +806,7 @@ void event_enter_client(ObClient *client)
             ObFocusDelayData data;
             data.client = client;
             data.time = event_curtime;
+            data.serial = event_curserial;
             focus_delay_func(&data);
         }
     }
@@ -1689,6 +1671,8 @@ static gboolean event_handle_menu_keyboard(XEvent *ev)
 
     /* Allow control while going thru the menu */
     else if (ev->type == KeyPress && (state & ~ControlMask) == 0) {
+        frame->got_press = TRUE;
+
         if (keycode == ob_keycode(OB_KEY_ESCAPE)) {
             menu_frame_hide_all();
             ret = TRUE;
@@ -1722,7 +1706,7 @@ static gboolean event_handle_menu_keyboard(XEvent *ev)
 
        Allow ControlMask only, and don't bother if the menu is empty */
     else if (ev->type == KeyRelease && (state & ~ControlMask) == 0 &&
-             frame->entries)
+             frame->entries && frame->got_press)
     {
         if (keycode == ob_keycode(OB_KEY_RETURN)) {
             /* Enter runs the active item or goes into the submenu.
@@ -1912,6 +1896,7 @@ static gboolean focus_delay_func(gpointer data)
     if (menu_frame_visible || moveresize_in_progress) return FALSE;
 
     event_curtime = d->time;
+    event_curserial = d->serial;
     if (client_focus(d->client) && config_focus_raise)
         stacking_raise(CLIENT_AS_WINDOW(d->client));
     event_curtime = old;
@@ -1924,7 +1909,7 @@ static void focus_delay_client_dest(ObClient *client, gpointer data)
                                      client, FALSE);
 }
 
-void event_halt_focus_delay(gulong serial)
+void event_halt_focus_delay()
 {
     /* ignore all enter events up till the event which caused this to occur */
     if (event_curserial) event_ignore_enter_range(1, event_curserial);
@@ -1933,7 +1918,6 @@ void event_halt_focus_delay(gulong serial)
 
 gulong event_start_ignore_all_enters(void)
 {
-    /* increment the serial so we don't ignore events we weren't meant to */
     XSync(ob_display, FALSE);
     return LastKnownRequestProcessed(ob_display);
 }
@@ -1959,6 +1943,7 @@ static void event_ignore_enter_range(gulong start, gulong end)
 
 void event_end_ignore_all_enters(gulong start)
 {
+    XSync(ob_display, FALSE);
     event_ignore_enter_range(start, LastKnownRequestProcessed(ob_display));
 }
 
This page took 0.024108 seconds and 4 git commands to generate.