JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Fix mouse and keyboard binds to work regardless of caps/numlock state.
[spectrwm.git] / spectrwm.c
index 75aec9c..665d020 100644 (file)
@@ -2802,6 +2802,7 @@ get_pointer_win(xcb_window_t root)
                } else {
                        DNPRINTF(SWM_D_EVENT, "get_pointer_win: none.\n");
                }
+               free(r);
        }
 
        return win;
@@ -4488,24 +4489,28 @@ get_win_name(xcb_window_t win)
            XCB_GET_PROPERTY_TYPE_ANY, 0, UINT_MAX);
        r = xcb_get_property_reply(conn, c, NULL);
 
-       if (!r || r->type == XCB_NONE) {
-               free(r);
-               /* Use WM_NAME instead; no UTF-8. */
-               c = xcb_get_property(conn, 0, win, XCB_ATOM_WM_NAME,
-                   XCB_GET_PROPERTY_TYPE_ANY, 0, UINT_MAX);
-               r = xcb_get_property_reply(conn, c, NULL);
-
-               if(!r || r->type == XCB_NONE) {
+       if (r) {
+               if (r->type == XCB_NONE) {
                        free(r);
-                       return NULL;
+                       /* Use WM_NAME instead; no UTF-8. */
+                       c = xcb_get_property(conn, 0, win, XCB_ATOM_WM_NAME,
+                               XCB_GET_PROPERTY_TYPE_ANY, 0, UINT_MAX);
+                       r = xcb_get_property_reply(conn, c, NULL);
+
+                       if (!r)
+                               return (NULL);
+                       if (r->type == XCB_NONE) {
+                               free(r);
+                               return (NULL);
+                       }
                }
-       }
+               if (r->length > 0)
+                       name = strndup(xcb_get_property_value(r),
+                                  xcb_get_property_value_length(r));
 
-       if (r->length > 0)
-               name = strndup(xcb_get_property_value(r),
-                   xcb_get_property_value_length(r));
+               free(r);
+       }
 
-       free(r);
        return (name);
 }
 
@@ -6177,7 +6182,7 @@ grabkeys(void)
 {
        struct key              *kp;
        int                     num_screens, k, j;
-       unsigned int            modifiers[3];
+       unsigned int            modifiers[4];
        xcb_keycode_t           *code;
 
        DNPRINTF(SWM_D_MISC, "grabkeys\n");
@@ -6185,7 +6190,8 @@ grabkeys(void)
 
        modifiers[0] = 0;
        modifiers[1] = numlockmask;
-       modifiers[2] = numlockmask | XCB_MOD_MASK_LOCK;
+       modifiers[2] = XCB_MOD_MASK_LOCK;
+       modifiers[3] = numlockmask | XCB_MOD_MASK_LOCK;
 
        num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
        for (k = 0; k < num_screens; k++) {
@@ -6211,16 +6217,25 @@ grabkeys(void)
 void
 grabbuttons(struct ws_win *win)
 {
-       int             i;
+       unsigned int    modifiers[4];
+       int             i, j;
 
        DNPRINTF(SWM_D_MOUSE, "grabbuttons: win 0x%x\n", win->id);
+       updatenumlockmask();
+
+       modifiers[0] = 0;
+       modifiers[1] = numlockmask;
+       modifiers[2] = XCB_MOD_MASK_LOCK;
+       modifiers[3] = numlockmask | XCB_MOD_MASK_LOCK;
 
        for (i = 0; i < LENGTH(buttons); i++)
                if (buttons[i].action == client_click)
-                       xcb_grab_button(conn, 0, win->id, BUTTONMASK,
-                           XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC,
-                           XCB_WINDOW_NONE, XCB_CURSOR_NONE,
-                           buttons[i].button, buttons[i].mask);
+                       for (j = 0; j < LENGTH(modifiers); ++j)
+                               xcb_grab_button(conn, 0, win->id, BUTTONMASK,
+                                   XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC,
+                                   XCB_WINDOW_NONE, XCB_CURSOR_NONE,
+                                   buttons[i].button, buttons[i].mask |
+                                   modifiers[j]);
 }
 
 const char *quirkname[] = {
@@ -7657,9 +7672,10 @@ configurerequest(xcb_configure_request_event_t *e)
                        WIDTH(win) = win->g_float.w;
                        HEIGHT(win) = win->g_float.h;
 
-                       stack_floater(win, win->ws->r);
-
-                       focus_flush();
+                       if (r) {
+                               stack_floater(win, r);
+                               focus_flush();
+                       }
                } else {
                        config_win(win, e);
                        xcb_flush(conn);