event: regrab keys on keyboard mapping change (FS#365)
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
8d1120d096
commit
cfac43ecdf
21
event.c
21
event.c
|
@ -697,6 +697,9 @@ event_handle_mappingnotify(void *data,
|
||||||
if(ev->request == XCB_MAPPING_MODIFIER
|
if(ev->request == XCB_MAPPING_MODIFIER
|
||||||
|| ev->request == XCB_MAPPING_KEYBOARD)
|
|| ev->request == XCB_MAPPING_KEYBOARD)
|
||||||
{
|
{
|
||||||
|
int nscreen = xcb_setup_roots_length(xcb_get_setup(connection));
|
||||||
|
int phys_screen = 0;
|
||||||
|
|
||||||
/* Send the request to get the NumLock, ShiftLock and CapsLock masks */
|
/* Send the request to get the NumLock, ShiftLock and CapsLock masks */
|
||||||
xmapping_cookie = xcb_get_modifier_mapping_unchecked(globalconf.connection);
|
xmapping_cookie = xcb_get_modifier_mapping_unchecked(globalconf.connection);
|
||||||
|
|
||||||
|
@ -708,6 +711,24 @@ event_handle_mappingnotify(void *data,
|
||||||
xutil_lock_mask_get(globalconf.connection, xmapping_cookie,
|
xutil_lock_mask_get(globalconf.connection, xmapping_cookie,
|
||||||
globalconf.keysyms, &globalconf.numlockmask,
|
globalconf.keysyms, &globalconf.numlockmask,
|
||||||
&globalconf.shiftlockmask, &globalconf.capslockmask);
|
&globalconf.shiftlockmask, &globalconf.capslockmask);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen);
|
||||||
|
/* yes XCB_BUTTON_MASK_ANY is also for grab_key even if it's look
|
||||||
|
* weird */
|
||||||
|
xcb_ungrab_key(connection, XCB_GRAB_ANY, s->root, XCB_BUTTON_MASK_ANY);
|
||||||
|
phys_screen++;
|
||||||
|
} while(phys_screen < nscreen);
|
||||||
|
|
||||||
|
/* regrab everything */
|
||||||
|
keybinding_array_t *arr = &globalconf.keys.by_sym;
|
||||||
|
for(int i = 0; i < arr->len; i++)
|
||||||
|
window_root_grabkey(arr->tab[i]);
|
||||||
|
|
||||||
|
arr = &globalconf.keys.by_code;
|
||||||
|
for(int i = 0; i < arr->len; i++)
|
||||||
|
window_root_grabkey(arr->tab[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -70,7 +70,7 @@ keybinding_cmp(const keybinding_t *k1, const keybinding_t *k2)
|
||||||
/** Grab key on the root windows.
|
/** Grab key on the root windows.
|
||||||
* \param k The keybinding.
|
* \param k The keybinding.
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
window_root_grabkey(keybinding_t *k)
|
window_root_grabkey(keybinding_t *k)
|
||||||
{
|
{
|
||||||
int phys_screen = 0;
|
int phys_screen = 0;
|
||||||
|
|
|
@ -44,5 +44,6 @@ ARRAY_TYPE(keybinding_t *, keybinding)
|
||||||
|
|
||||||
keybinding_t *keybinding_find(const xcb_key_press_event_t *);
|
keybinding_t *keybinding_find(const xcb_key_press_event_t *);
|
||||||
xcb_keysym_t key_getkeysym(xcb_keycode_t, uint16_t);
|
xcb_keysym_t key_getkeysym(xcb_keycode_t, uint16_t);
|
||||||
|
void window_root_grabkey(keybinding_t *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue