key: restore proper support of keysym resolution
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
6ca27c7c4c
commit
600299a19f
|
@ -458,6 +458,8 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
/* Allocate the key symbols */
|
/* Allocate the key symbols */
|
||||||
globalconf.keysyms = xcb_key_symbols_alloc(globalconf.connection);
|
globalconf.keysyms = xcb_key_symbols_alloc(globalconf.connection);
|
||||||
|
xcb_get_modifier_mapping_cookie_t xmapping_cookie =
|
||||||
|
xcb_get_modifier_mapping_unchecked(globalconf.connection);
|
||||||
|
|
||||||
/* init atom cache */
|
/* init atom cache */
|
||||||
atoms_init(globalconf.connection);
|
atoms_init(globalconf.connection);
|
||||||
|
@ -477,6 +479,11 @@ main(int argc, char **argv)
|
||||||
for(colors_nbr = 0; colors_nbr < 2; colors_nbr++)
|
for(colors_nbr = 0; colors_nbr < 2; colors_nbr++)
|
||||||
xcolor_init_reply(colors_reqs[colors_nbr]);
|
xcolor_init_reply(colors_reqs[colors_nbr]);
|
||||||
|
|
||||||
|
xutil_lock_mask_get(globalconf.connection, xmapping_cookie,
|
||||||
|
globalconf.keysyms, &globalconf.numlockmask,
|
||||||
|
&globalconf.shiftlockmask, &globalconf.capslockmask,
|
||||||
|
&globalconf.modeswitchmask);
|
||||||
|
|
||||||
/* do this only for real screen */
|
/* do this only for real screen */
|
||||||
for(screen_nbr = 0;
|
for(screen_nbr = 0;
|
||||||
screen_nbr < xcb_setup_roots_length(xcb_get_setup(globalconf.connection));
|
screen_nbr < xcb_setup_roots_length(xcb_get_setup(globalconf.connection));
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* XCB doesn't provide keysyms definition */
|
||||||
|
#include <X11/keysym.h>
|
||||||
|
|
||||||
#include "common/util.h"
|
#include "common/util.h"
|
||||||
|
|
||||||
#include <xcb/xcb.h>
|
#include <xcb/xcb.h>
|
||||||
|
@ -82,6 +85,65 @@ xutil_text_prop_get(xcb_connection_t *conn, xcb_window_t w, xcb_atom_t atom,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get the lock masks (shiftlock, numlock, capslock, modeswitch).
|
||||||
|
* \param connection The X connection.
|
||||||
|
* \param cookie The cookie of the request.
|
||||||
|
* \param keysyms Key symbols.
|
||||||
|
* \param numlockmask Numlock mask.
|
||||||
|
* \param shiftlockmask Shiftlock mask.
|
||||||
|
* \param capslockmask Capslock mask.
|
||||||
|
* \todo Split this.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
xutil_lock_mask_get(xcb_connection_t *connection,
|
||||||
|
xcb_get_modifier_mapping_cookie_t cookie,
|
||||||
|
xcb_key_symbols_t *keysyms,
|
||||||
|
uint16_t *numlockmask,
|
||||||
|
uint16_t *shiftlockmask,
|
||||||
|
uint16_t *capslockmask,
|
||||||
|
uint16_t *modeswitchmask)
|
||||||
|
{
|
||||||
|
xcb_get_modifier_mapping_reply_t *modmap_r;
|
||||||
|
xcb_keycode_t *modmap, kc;
|
||||||
|
xcb_keycode_t *numlockcodes = xcb_key_symbols_get_keycode(keysyms, XK_Num_Lock);
|
||||||
|
xcb_keycode_t *shiftlockcodes = xcb_key_symbols_get_keycode(keysyms, XK_Shift_Lock);
|
||||||
|
xcb_keycode_t *capslockcodes = xcb_key_symbols_get_keycode(keysyms, XK_Caps_Lock);
|
||||||
|
xcb_keycode_t *modeswitchcodes = xcb_key_symbols_get_keycode(keysyms, XK_Mode_switch);
|
||||||
|
|
||||||
|
modmap_r = xcb_get_modifier_mapping_reply(connection, cookie, NULL);
|
||||||
|
modmap = xcb_get_modifier_mapping_keycodes(modmap_r);
|
||||||
|
|
||||||
|
/* reset */
|
||||||
|
*numlockmask = *shiftlockmask = *capslockmask = *modeswitchmask = 0;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < 8; i++)
|
||||||
|
for(int j = 0; j < modmap_r->keycodes_per_modifier; j++)
|
||||||
|
{
|
||||||
|
kc = modmap[i * modmap_r->keycodes_per_modifier + j];
|
||||||
|
|
||||||
|
#define LOOK_FOR(mask, codes) \
|
||||||
|
if(*mask == 0 && codes) \
|
||||||
|
for(xcb_keycode_t *ktest = codes; *ktest; ktest++) \
|
||||||
|
if(*ktest == kc) \
|
||||||
|
{ \
|
||||||
|
*mask = (1 << i); \
|
||||||
|
break; \
|
||||||
|
}
|
||||||
|
|
||||||
|
LOOK_FOR(numlockmask, numlockcodes)
|
||||||
|
LOOK_FOR(shiftlockmask, shiftlockcodes)
|
||||||
|
LOOK_FOR(capslockmask, capslockcodes)
|
||||||
|
LOOK_FOR(modeswitchmask, modeswitchcodes)
|
||||||
|
#undef LOOK_FOR
|
||||||
|
}
|
||||||
|
p_delete(&numlockcodes);
|
||||||
|
p_delete(&shiftlockcodes);
|
||||||
|
p_delete(&capslockcodes);
|
||||||
|
p_delete(&modeswitchcodes);
|
||||||
|
p_delete(&modmap_r);
|
||||||
|
}
|
||||||
|
|
||||||
/* Number of different errors */
|
/* Number of different errors */
|
||||||
#define ERRORS_NBR 256
|
#define ERRORS_NBR 256
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,10 @@
|
||||||
|
|
||||||
bool xutil_text_prop_get(xcb_connection_t *, xcb_window_t, xcb_atom_t, char **, ssize_t *);
|
bool xutil_text_prop_get(xcb_connection_t *, xcb_window_t, xcb_atom_t, char **, ssize_t *);
|
||||||
|
|
||||||
|
void xutil_lock_mask_get(xcb_connection_t *, xcb_get_modifier_mapping_cookie_t,
|
||||||
|
xcb_key_symbols_t *,
|
||||||
|
uint16_t *, uint16_t *, uint16_t *, uint16_t *);
|
||||||
|
|
||||||
/** Set the same handler for all errors */
|
/** Set the same handler for all errors */
|
||||||
void xutil_error_handler_catch_all_set(xcb_event_handlers_t *,
|
void xutil_error_handler_catch_all_set(xcb_event_handlers_t *,
|
||||||
xcb_generic_error_handler_t, void *);
|
xcb_generic_error_handler_t, void *);
|
||||||
|
|
8
event.c
8
event.c
|
@ -792,10 +792,18 @@ 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)
|
||||||
{
|
{
|
||||||
|
xcb_get_modifier_mapping_cookie_t xmapping_cookie =
|
||||||
|
xcb_get_modifier_mapping_unchecked(globalconf.connection);
|
||||||
|
|
||||||
/* Free and then allocate the key symbols */
|
/* Free and then allocate the key symbols */
|
||||||
xcb_key_symbols_free(globalconf.keysyms);
|
xcb_key_symbols_free(globalconf.keysyms);
|
||||||
globalconf.keysyms = xcb_key_symbols_alloc(globalconf.connection);
|
globalconf.keysyms = xcb_key_symbols_alloc(globalconf.connection);
|
||||||
|
|
||||||
|
xutil_lock_mask_get(globalconf.connection, xmapping_cookie,
|
||||||
|
globalconf.keysyms, &globalconf.numlockmask,
|
||||||
|
&globalconf.shiftlockmask, &globalconf.capslockmask,
|
||||||
|
&globalconf.modeswitchmask);
|
||||||
|
|
||||||
int nscreen = xcb_setup_roots_length(xcb_get_setup(connection));
|
int nscreen = xcb_setup_roots_length(xcb_get_setup(connection));
|
||||||
|
|
||||||
/* regrab everything */
|
/* regrab everything */
|
||||||
|
|
18
key.c
18
key.c
|
@ -95,9 +95,9 @@ key_getkeysym(xcb_keycode_t detail, uint16_t state)
|
||||||
* according to modifier (XCB doesn't provide an equivalent to
|
* according to modifier (XCB doesn't provide an equivalent to
|
||||||
* XLookupString()).
|
* XLookupString()).
|
||||||
*
|
*
|
||||||
* If Mod5 is ON we look into second group.
|
* If Mode_Switch is ON we look into second group.
|
||||||
*/
|
*/
|
||||||
if(state & XCB_MOD_MASK_5)
|
if(state & globalconf.modeswitchmask)
|
||||||
{
|
{
|
||||||
k0 = xcb_key_symbols_get_keysym(globalconf.keysyms, detail, 2);
|
k0 = xcb_key_symbols_get_keysym(globalconf.keysyms, detail, 2);
|
||||||
k1 = xcb_key_symbols_get_keysym(globalconf.keysyms, detail, 3);
|
k1 = xcb_key_symbols_get_keysym(globalconf.keysyms, detail, 3);
|
||||||
|
@ -114,11 +114,12 @@ key_getkeysym(xcb_keycode_t detail, uint16_t state)
|
||||||
|
|
||||||
/* The numlock modifier is on and the second KeySym is a keypad
|
/* The numlock modifier is on and the second KeySym is a keypad
|
||||||
* KeySym */
|
* KeySym */
|
||||||
if((state & XCB_MOD_MASK_2) && xcb_is_keypad_key(k1))
|
if((state & globalconf.numlockmask) && xcb_is_keypad_key(k1))
|
||||||
{
|
{
|
||||||
/* The Shift modifier is on, or if the Lock modifier is on and
|
/* The Shift modifier is on, or if the Lock modifier is on and
|
||||||
* is interpreted as ShiftLock, use the first KeySym */
|
* is interpreted as ShiftLock, use the first KeySym */
|
||||||
if((state & XCB_MOD_MASK_SHIFT) || (state & XCB_MOD_MASK_LOCK))
|
if((state & XCB_MOD_MASK_SHIFT)
|
||||||
|
|| (state & XCB_MOD_MASK_LOCK && (state & globalconf.shiftlockmask)))
|
||||||
return k0;
|
return k0;
|
||||||
else
|
else
|
||||||
return k1;
|
return k1;
|
||||||
|
@ -131,7 +132,8 @@ key_getkeysym(xcb_keycode_t detail, uint16_t state)
|
||||||
|
|
||||||
/* The Shift modifier is off and the Lock modifier is on and is
|
/* The Shift modifier is off and the Lock modifier is on and is
|
||||||
* interpreted as CapsLock */
|
* interpreted as CapsLock */
|
||||||
else if(!(state & XCB_MOD_MASK_SHIFT) && (state & XCB_MOD_MASK_LOCK))
|
else if(!(state & XCB_MOD_MASK_SHIFT)
|
||||||
|
&& (state & XCB_MOD_MASK_LOCK && (state & globalconf.capslockmask)))
|
||||||
/* The first Keysym is used but if that KeySym is lowercase
|
/* The first Keysym is used but if that KeySym is lowercase
|
||||||
* alphabetic, then the corresponding uppercase KeySym is used
|
* alphabetic, then the corresponding uppercase KeySym is used
|
||||||
* instead */
|
* instead */
|
||||||
|
@ -139,7 +141,8 @@ key_getkeysym(xcb_keycode_t detail, uint16_t state)
|
||||||
|
|
||||||
/* The Shift modifier is on, and the Lock modifier is on and is
|
/* The Shift modifier is on, and the Lock modifier is on and is
|
||||||
* interpreted as CapsLock */
|
* interpreted as CapsLock */
|
||||||
else if((state & XCB_MOD_MASK_SHIFT) && (state & XCB_MOD_MASK_LOCK))
|
else if((state & XCB_MOD_MASK_SHIFT)
|
||||||
|
&& (state & XCB_MOD_MASK_LOCK && (state & globalconf.capslockmask)))
|
||||||
/* The second Keysym is used but if that KeySym is lowercase
|
/* The second Keysym is used but if that KeySym is lowercase
|
||||||
* alphabetic, then the corresponding uppercase KeySym is used
|
* alphabetic, then the corresponding uppercase KeySym is used
|
||||||
* instead */
|
* instead */
|
||||||
|
@ -147,7 +150,8 @@ key_getkeysym(xcb_keycode_t detail, uint16_t state)
|
||||||
|
|
||||||
/* The Shift modifer is on, or the Lock modifier is on and is
|
/* The Shift modifer is on, or the Lock modifier is on and is
|
||||||
* interpreted as ShiftLock, or both */
|
* interpreted as ShiftLock, or both */
|
||||||
else if((state & XCB_MOD_MASK_SHIFT) || (state & XCB_MOD_MASK_LOCK))
|
else if((state & XCB_MOD_MASK_SHIFT)
|
||||||
|
|| (state & XCB_MOD_MASK_LOCK && (state & globalconf.shiftlockmask)))
|
||||||
return k1;
|
return k1;
|
||||||
|
|
||||||
return XCB_NO_SYMBOL;
|
return XCB_NO_SYMBOL;
|
||||||
|
|
|
@ -70,6 +70,8 @@ struct awesome_t
|
||||||
key_array_t keys;
|
key_array_t keys;
|
||||||
/** Root window mouse bindings */
|
/** Root window mouse bindings */
|
||||||
button_array_t buttons;
|
button_array_t buttons;
|
||||||
|
/** Modifiers masks */
|
||||||
|
uint16_t numlockmask, shiftlockmask, capslockmask, modeswitchmask;
|
||||||
/** Check for XRandR extension */
|
/** Check for XRandR extension */
|
||||||
bool have_randr;
|
bool have_randr;
|
||||||
/** Check for XTest extension */
|
/** Check for XTest extension */
|
||||||
|
|
Loading…
Reference in New Issue