]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
remove mysterious xkb code...
[chaz/openbox] / openbox / event.c
index cd66014b89a271a8bbb2dc1ff089618b56415fc0..7e31b6dc014926b3760b6f6759d66b3ac66a82fa 100644 (file)
@@ -257,12 +257,6 @@ static void event_hack_mods(XEvent *e)
         break;
     case KeyRelease:
         e->xkey.state = modkeys_only_modifier_masks(e->xkey.state);
-#ifdef XKB
-        if (XkbGetState(ob_display, XkbUseCoreKbd, &xkb_state) == Success) {
-            e->xkey.state = xkb_state.compat_state;
-            break;
-        }
-#endif
         /* remove from the state the mask of the modifier key being released,
            if it is a modifier key being released that is */
         e->xkey.state &= ~modkeys_keycode_to_mask(e->xkey.keycode);
@@ -662,7 +656,7 @@ static void event_process(const XEvent *ec, gpointer data)
         xwc.border_width = e->xconfigurerequest.border_width;
         xwc.sibling = e->xconfigurerequest.above;
         xwc.stack_mode = e->xconfigurerequest.detail;
-       
+
         /* we are not to be held responsible if someone sends us an
            invalid request! */
         xerror_set_ignore(TRUE);
@@ -695,7 +689,7 @@ static void event_process(const XEvent *ec, gpointer data)
 static void event_handle_root(XEvent *e)
 {
     Atom msgtype;
-     
+
     switch(e->type) {
     case SelectionClear:
         ob_debug("Another WM has requested to replace us. Exiting.\n");
@@ -792,7 +786,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
     ObFrameContext con;
     static gint px = -1, py = -1;
     static guint pb = 0;
-     
+
     switch (e->type) {
     case ButtonPress:
         /* save where the press occured for the first button pressed */
@@ -835,7 +829,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
             case OB_FRAME_CONTEXT_ALLDESKTOPS:
                 client->frame->desk_press = (e->type == ButtonPress);
                 frame_adjust_state(client->frame);
-                break; 
+                break;
             case OB_FRAME_CONTEXT_SHADE:
                 client->frame->shade_press = (e->type == ButtonPress);
                 frame_adjust_state(client->frame);
@@ -1067,24 +1061,34 @@ static void event_handle_client(ObClient *client, XEvent *e)
         if (e->xconfigurerequest.value_mask & CWStackMode) {
             ObClient *sibling = NULL;
             gulong ignore_start;
+            gboolean ok = TRUE;
 
             /* get the sibling */
             if (e->xconfigurerequest.value_mask & CWSibling) {
                 ObWindow *win;
                 win = g_hash_table_lookup(window_map,
                                           &e->xconfigurerequest.above);
-                if (WINDOW_IS_CLIENT(win) && WINDOW_AS_CLIENT(win) != client)
+                if (win && WINDOW_IS_CLIENT(win) &&
+                    WINDOW_AS_CLIENT(win) != client)
+                {
                     sibling = WINDOW_AS_CLIENT(win);
+                }
+                else
+                    /* an invalid sibling was specified so don't restack at
+                       all, it won't make sense no matter what we do */
+                    ok = FALSE;
             }
 
-            if (!config_focus_under_mouse)
-                ignore_start = event_start_ignore_all_enters();
-            stacking_restack_request(client, sibling,
-                                     e->xconfigurerequest.detail);
-            if (!config_focus_under_mouse)
-                event_end_ignore_all_enters(ignore_start);
+            if (ok) {
+                if (!config_focus_under_mouse)
+                    ignore_start = event_start_ignore_all_enters();
+                stacking_restack_request(client, sibling,
+                                         e->xconfigurerequest.detail);
+                if (!config_focus_under_mouse)
+                    event_end_ignore_all_enters(ignore_start);
+            }
 
-            /* if a stacking change moves the window without resizing */
+            /* a stacking change moves the window without resizing */
             move = TRUE;
         }
 
@@ -1208,7 +1212,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
         /* we don't want the reparent event, put it back on the stack for the
            X server to deal with after we unmanage the window */
         XPutBackEvent(ob_display, e);
-     
+
         ob_debug("ReparentNotify for window 0x%x\n", client->window);
         client_unmanage(client);
         break;
@@ -1219,7 +1223,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);
+        client_activate(client, FALSE, TRUE, TRUE, TRUE);
         break;
     case ClientMessage:
         /* validate cuz we query stuff off the client here */
@@ -1297,7 +1301,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                 ob_debug_type(OB_DEBUG_APP_BUGS,
                               "_NET_ACTIVE_WINDOW message for window %s is "
                               "missing source indication\n");
-            client_activate(client, FALSE,
+            client_activate(client, FALSE, TRUE, TRUE,
                             (e->xclient.data.l[0] == 0 ||
                              e->xclient.data.l[0] == 2));
         } else if (msgtype == prop_atoms.net_wm_moveresize) {
@@ -1436,7 +1440,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
     case PropertyNotify:
         /* validate cuz we query stuff off the client here */
         if (!client_validate(client)) break;
-  
+
         /* compress changes to a single property into a single change */
         while (XCheckTypedWindowEvent(ob_display, client->window,
                                       e->type, &ce)) {
@@ -1529,7 +1533,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
 #ifdef SHAPE
         if (extensions_shape && e->type == extensions_shape_event_basep) {
             client->shaped = ((XShapeEvent*)e)->shaped;
-            frame_adjust_area(client->frame, FALSE, TRUE, FALSE);
+            frame_adjust_shape(client->frame);
         }
 #endif
     }
@@ -1609,7 +1613,7 @@ static gboolean event_handle_menu_keyboard(XEvent *ev)
     guint keycode, state;
     gunichar unikey;
     ObMenuFrame *frame;
-    gboolean ret = TRUE;
+    gboolean ret = FALSE;
 
     keycode = ev->xkey.keycode;
     state = ev->xkey.state;
@@ -1617,100 +1621,112 @@ static gboolean event_handle_menu_keyboard(XEvent *ev)
 
     frame = find_active_or_last_menu();
     if (frame == NULL)
-        ret = FALSE;
+        g_assert_not_reached(); /* there is no active menu */
 
-    else if (keycode == ob_keycode(OB_KEY_ESCAPE) && state == 0)
-        menu_frame_hide_all();
+    /* Allow control while going thru the menu */
+    else if (ev->type == KeyPress && (state & ~ControlMask) == 0) {
+        if (keycode == ob_keycode(OB_KEY_ESCAPE)) {
+            menu_frame_hide_all();
+            ret = TRUE;
+        }
 
-    else if (keycode == ob_keycode(OB_KEY_RETURN) && (state == 0 ||
-                                                      state == ControlMask))
-    {
-        /* Enter runs the active item or goes into the submenu.
-           Control-Enter runs it without closing the menu. */
-        if (frame->child)
-            menu_frame_select_next(frame->child);
-        else if (frame->selected)
-            menu_entry_frame_execute(frame->selected, state);
-    }
+        else if (keycode == ob_keycode(OB_KEY_LEFT)) {
+            /* Left goes to the parent menu */
+            menu_frame_select(frame, NULL, TRUE);
+            ret = TRUE;
+        }
 
-    else if (keycode == ob_keycode(OB_KEY_LEFT) && ev->xkey.state == 0) {
-        /* Left goes to the parent menu */
-        menu_frame_select(frame, NULL, TRUE);
-    }
+        else if (keycode == ob_keycode(OB_KEY_RIGHT)) {
+            /* Right goes to the selected submenu */
+            if (frame->child) menu_frame_select_next(frame->child);
+            ret = TRUE;
+        }
 
-    else if (keycode == ob_keycode(OB_KEY_RIGHT) && ev->xkey.state == 0) {
-        /* Right goes to the selected submenu */
-        if (frame->child) menu_frame_select_next(frame->child);
-    }
+        else if (keycode == ob_keycode(OB_KEY_UP)) {
+            menu_frame_select_previous(frame);
+            ret = TRUE;
+        }
 
-    else if (keycode == ob_keycode(OB_KEY_UP) && state == 0) {
-        menu_frame_select_previous(frame);
+        else if (keycode == ob_keycode(OB_KEY_DOWN)) {
+            menu_frame_select_next(frame);
+            ret = TRUE;
+        }
     }
 
-    else if (keycode == ob_keycode(OB_KEY_DOWN) && state == 0) {
-        menu_frame_select_next(frame);
-    }
+    /* Use KeyRelease events for running things so that the key release doesn't
+       get sent to the focused application.
 
-    /* keyboard accelerator shortcuts. (allow controlmask) */
-    else if ((ev->xkey.state & ~ControlMask) == 0 &&
-             /* was it a valid key? */
-             unikey != 0 &&
-             /* don't bother if the menu is empty. */
+       Allow ControlMask only, and don't bother if the menu is empty */
+    else if (ev->type == KeyRelease && (state & ~ControlMask) == 0 &&
              frame->entries)
     {
-        GList *start;
-        GList *it;
-        ObMenuEntryFrame *found = NULL;
-        guint num_found = 0;
-
-        /* start after the selected one */
-        start = frame->entries;
-        if (frame->selected) {
-            for (it = start; frame->selected != it->data; it = g_list_next(it))
-                g_assert(it != NULL); /* nothing was selected? */
-            /* next with wraparound */
-            start = g_list_next(it);
-            if (start == NULL) start = frame->entries;
+        if (keycode == ob_keycode(OB_KEY_RETURN)) {
+            /* Enter runs the active item or goes into the submenu.
+               Control-Enter runs it without closing the menu. */
+            if (frame->child)
+                menu_frame_select_next(frame->child);
+            else if (frame->selected)
+                menu_entry_frame_execute(frame->selected, state);
+
+            ret = TRUE;
         }
 
-        it = start;
-        do {
-            ObMenuEntryFrame *e = it->data;
-            gunichar entrykey = 0;
+        /* keyboard accelerator shortcuts. (if it was a valid key) */
+        else if (unikey != 0) {
+            GList *start;
+            GList *it;
+            ObMenuEntryFrame *found = NULL;
+            guint num_found = 0;
+
+            /* start after the selected one */
+            start = frame->entries;
+            if (frame->selected) {
+                for (it = start; frame->selected != it->data;
+                     it = g_list_next(it))
+                    g_assert(it != NULL); /* nothing was selected? */
+                /* next with wraparound */
+                start = g_list_next(it);
+                if (start == NULL) start = frame->entries;
+            }
 
-            if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL)
-                entrykey = e->entry->data.normal.shortcut;
-            else if (e->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
-                entrykey = e->entry->data.submenu.submenu->shortcut;
+            it = start;
+            do {
+                ObMenuEntryFrame *e = it->data;
+                gunichar entrykey = 0;
 
-            if (unikey == entrykey) {
-                if (found == NULL) found = e;
-                ++num_found;
-            }
+                if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL)
+                    entrykey = e->entry->data.normal.shortcut;
+                else if (e->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
+                    entrykey = e->entry->data.submenu.submenu->shortcut;
 
-            /* next with wraparound */
-            it = g_list_next(it);
-            if (it == NULL) it = frame->entries;
-        } while (it != start);
+                if (unikey == entrykey) {
+                    if (found == NULL) found = e;
+                    ++num_found;
+                }
 
-        if (found) {
-            if (found->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
-                num_found == 1)
-            {
-                menu_frame_select(frame, found, TRUE);
-                usleep(50000); /* highlight the item for a short bit so the
-                                  user can see what happened */
-                menu_entry_frame_execute(found, state);
-            } else {
-                menu_frame_select(frame, found, TRUE);
-                if (num_found == 1)
-                    menu_frame_select_next(frame->child);
+                /* next with wraparound */
+                it = g_list_next(it);
+                if (it == NULL) it = frame->entries;
+            } while (it != start);
+
+            if (found) {
+                if (found->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
+                    num_found == 1)
+                {
+                    menu_frame_select(frame, found, TRUE);
+                    usleep(50000); /* highlight the item for a short bit so the
+                                      user can see what happened */
+                    menu_entry_frame_execute(found, state);
+                } else {
+                    menu_frame_select(frame, found, TRUE);
+                    if (num_found == 1)
+                        menu_frame_select_next(frame->child);
+                }
+
+                ret = TRUE;
             }
-        } else
-            ret = FALSE;
+        }
     }
-    else
-        ret = FALSE;
 
     return ret;
 }
@@ -1759,8 +1775,8 @@ static gboolean event_handle_menu(XEvent *ev)
             menu_frame_select(e->frame, NULL, FALSE);
         }
         break;
-    case MotionNotify:   
-        if ((e = menu_entry_frame_under(ev->xmotion.x_root,   
+    case MotionNotify:
+        if ((e = menu_entry_frame_under(ev->xmotion.x_root,
                                         ev->xmotion.y_root)))
             if (!(f = find_active_menu()) ||
                 f == e->frame ||
@@ -1769,6 +1785,7 @@ static gboolean event_handle_menu(XEvent *ev)
                 menu_frame_select(e->frame, e, FALSE);
         break;
     case KeyPress:
+    case KeyRelease:
         ret = event_handle_menu_keyboard(ev);
         break;
     }
This page took 0.032372 seconds and 4 git commands to generate.