summaryrefslogtreecommitdiff
path: root/src/input.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input.c')
-rw-r--r--src/input.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/input.c b/src/input.c
index 92f7b07..b9ecd4c 100644
--- a/src/input.c
+++ b/src/input.c
@@ -39,6 +39,7 @@ x11_mask_to_rp_mask (unsigned int mask)
PRINT_DEBUG (("x11 mask = %x\n", mask));
+ result |= mask & ShiftMask ? RP_SHIFT_MASK:0;
result |= mask & ControlMask ? RP_CONTROL_MASK:0;
result |= mask & rp_modifier_info.meta_mod_mask ? RP_META_MASK:0;
result |= mask & rp_modifier_info.alt_mod_mask ? RP_ALT_MASK:0;
@@ -60,6 +61,7 @@ rp_mask_to_x11_mask (unsigned int mask)
PRINT_DEBUG (("rp mask = %x\n", mask));
+ result |= mask & RP_SHIFT_MASK ? ShiftMask:0;
result |= mask & RP_CONTROL_MASK ? ControlMask:0;
result |= mask & RP_META_MASK ? rp_modifier_info.meta_mod_mask:0;
result |= mask & RP_ALT_MASK ? rp_modifier_info.alt_mod_mask:0;
@@ -172,7 +174,9 @@ keysym_to_keycode_mod (KeySym keysym, KeyCode *code, unsigned int *mod)
*code = XKeysymToKeycode (dpy, keysym);
lower = XKeycodeToKeysym (dpy, *code, 0);
upper = XKeycodeToKeysym (dpy, *code, 1);
- if (upper == keysym)
+ /* If you need to press shift to get the keysym, add the shift
+ mask. */
+ if (upper == keysym && lower != keysym)
*mod = ShiftMask;
}
@@ -183,7 +187,6 @@ grab_key (KeySym keysym, unsigned int modifiers, Window grab_window)
{
unsigned int mod_list[8];
int i;
- KeySym upper, lower;
KeyCode keycode;
unsigned int mod;
@@ -223,11 +226,12 @@ keysym_to_string (KeySym keysym, unsigned int modifier)
name = sbuf_new (0);
+ if (modifier & RP_SHIFT_MASK) sbuf_concat (name, "S-");
if (modifier & RP_CONTROL_MASK) sbuf_concat (name, "C-");
if (modifier & RP_META_MASK) sbuf_concat (name, "M-");
if (modifier & RP_ALT_MASK) sbuf_concat (name, "A-");
if (modifier & RP_HYPER_MASK) sbuf_concat (name, "H-");
- if (modifier & RP_SUPER_MASK) sbuf_concat (name, "S-");
+ if (modifier & RP_SUPER_MASK) sbuf_concat (name, "s-");
/* On solaris machines (perhaps other machines as well) this call
can return NULL. In this case use the "NULL" string. */
@@ -255,6 +259,8 @@ int
cook_keycode (XKeyEvent *ev, KeySym *keysym, unsigned int *mod, char *keysym_name, int len, int ignore_bad_mods)
{
int nbytes;
+ int shift = 0;
+ KeySym lower, upper;
if (ignore_bad_mods)
{
@@ -271,12 +277,24 @@ cook_keycode (XKeyEvent *ev, KeySym *keysym, unsigned int *mod, char *keysym_nam
keysym_name[nbytes] = '\0';
}
+ /* Find out if XLookupString gobbled the shift modifier */
+ if (ev->state & ShiftMask)
+ {
+ lower = XKeycodeToKeysym (dpy, ev->keycode, 0);
+ upper = XKeycodeToKeysym (dpy, ev->keycode, 1);
+ /* If the keysym isn't affected by the shift key, then keep the
+ shift modifier. */
+ if (lower == upper)
+ shift = ShiftMask;
+ }
+
*mod = ev->state;
*mod &= (rp_modifier_info.meta_mod_mask
| rp_modifier_info.alt_mod_mask
| rp_modifier_info.hyper_mod_mask
| rp_modifier_info.super_mod_mask
- | ControlMask );
+ | ControlMask
+ | shift);
return nbytes;
}