]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
can tell when a window that was "closed" has stopped responding now
[chaz/openbox] / openbox / event.c
index cc3ea68fe261a2cb6b7d1d5413de604f2db2357a..5d85eaeb3dfdecbf771533c9dbb3a4f199c4f323 100644 (file)
@@ -475,10 +475,12 @@ static void event_process(const XEvent *ec, gpointer data)
             client = WINDOW_AS_CLIENT(obwin);
             break;
         case Window_Menu:
-        case Window_Internal:
             /* not to be used for events */
             g_assert_not_reached();
             break;
+        case Window_Internal:
+            /* we don't do anything with events directly on these windows */
+            break;
         }
     }
 
@@ -639,9 +641,12 @@ static void event_process(const XEvent *ec, gpointer data)
     else if (e->type == MapRequest)
         client_manage(window);
     else if (e->type == MappingNotify) {
-        /* keyboard layout changes, reconfigure openbox. need to restart the
-           modkeys system, but also to reload the key bindings. */
-        ob_reconfigure();
+        /* keyboard layout changes for modifier mapping changes. reload the
+           modifier map, and rebind all the key bindings as appropriate */
+        ob_debug("Kepboard map changed. Reloading keyboard bindings.\n");
+        modkeys_shutdown(TRUE);
+        modkeys_startup(TRUE);
+        keyboard_rebind();
     }
     else if (e->type == ClientMessage) {
         /* This is for _NET_WM_REQUEST_FRAME_EXTENTS messages. They come for
@@ -705,30 +710,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);
@@ -783,6 +767,9 @@ static void event_handle_root(XEvent *e)
                 ob_restart();
             else if (e->xclient.data.l[0] == 3)
                 ob_exit(0);
+        } else if (msgtype == prop_atoms.wm_protocols) {
+            if (e->xclient.data.l[0] == prop_atoms.net_wm_ping)
+                ping_got_pong(e->xclient.data.l[1]);
         }
         break;
     case PropertyNotify:
@@ -1692,6 +1679,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;
@@ -1725,7 +1714,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.
@@ -2011,6 +2000,8 @@ void event_cancel_all_key_grabs(void)
     }
     else
         ungrab_passive_key();
+
+    XSync(ob_display, FALSE);
 }
 
 gboolean event_time_after(Time t1, Time t2)
This page took 0.022748 seconds and 4 git commands to generate.