summaryrefslogtreecommitdiff
path: root/src/input.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input.c')
-rw-r--r--src/input.c49
1 files changed, 44 insertions, 5 deletions
diff --git a/src/input.c b/src/input.c
index 222e3e6..60e3932 100644
--- a/src/input.c
+++ b/src/input.c
@@ -1,20 +1,59 @@
/* for reading kdb input from the user. Currently only used to read in
the name of a window to jump to. */
-#include <X11/keysym.h>
#include <stdlib.h>
#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+#include <X11/Xutil.h>
#include "ratpoison.h"
+/* Cooks a keycode + modifier into a keysym + modifier. This should be
+ used anytime meaningful key information is to be extracted from a
+ KeyPress or KeyRelease event. */
+void
+cook_keycode (KeyCode keycode, KeySym *keysym, int *mod)
+{
+ KeySym normal, shifted;
-static int
+ if (*mod & ShiftMask)
+ {
+ normal = XKeycodeToKeysym(dpy, keycode, 0);
+ shifted = XKeycodeToKeysym(dpy, keycode, 1);
+
+ /* if the shifted code is not defined, then we use the normal keysym and keep the shift mask */
+ if (shifted == NoSymbol)
+ {
+ *keysym = normal;
+ }
+ /* But if the shifted code is defined, we use it and remove the shift mask */
+ else
+ {
+ *keysym = shifted;
+ *mod &= ~ShiftMask;
+ }
+ }
+ else
+ {
+ *keysym = XKeycodeToKeysym(dpy, keycode, 0);
+ }
+
+ PRINT_DEBUG ("cooked keysym: %ld '%c' mask: %d\n", *keysym, *keysym, *mod);
+}
+
+static KeySym
read_key ()
{
+ KeySym keysym;
+ int mod;
XEvent ev;
XMaskEvent (dpy, KeyPressMask, &ev);
- return XLookupKeysym ((XKeyEvent *)&ev, 0);
+ mod = ev.xkey.state;
+ cook_keycode (ev.xkey.keycode, &keysym, &mod);
+
+ return keysym;
}
/* pass in a pointer a string and how much room we have, and fill it
@@ -23,7 +62,7 @@ void
get_input (screen_info *s, char *prompt, char *str, int len)
{
int cur_len; /* Current length of the string. */
- int ch;
+ KeySym ch;
int revert;
Window fwin;
int prompt_width = XTextWidth (s->font, prompt, strlen (prompt));
@@ -58,7 +97,7 @@ get_input (screen_info *s, char *prompt, char *str, int len)
XDrawString (dpy, s->input_window, s->bold_gc, 5 + prompt_width,
BAR_PADDING + s->font->max_bounds.ascent, str, cur_len);
}
- else if (ch >= ' ')
+ else if (!IsModifierKey (ch))
{
str[cur_len] = ch;
if (cur_len < len - 1) cur_len++;