support shift and caps lock when no input method is available

This commit is contained in:
David Rose 2009-02-20 21:14:59 +00:00
parent cd48a64f86
commit 8e207d8229
2 changed files with 26 additions and 6 deletions

View File

@ -1230,7 +1230,7 @@ handle_keystroke(XKeyEvent &event) {
} else { } else {
// Without an input context, just get the ascii keypress. // Without an input context, just get the ascii keypress.
ButtonHandle button = get_button(event); ButtonHandle button = get_button(event, true);
if (button.has_ascii_equivalent()) { if (button.has_ascii_equivalent()) {
_input_devices[0].keystroke(button.get_ascii_equivalent()); _input_devices[0].keystroke(button.get_ascii_equivalent());
} }
@ -1248,7 +1248,7 @@ handle_keypress(XKeyEvent &event) {
_input_devices[0].set_pointer_in_window(event.x, event.y); _input_devices[0].set_pointer_in_window(event.x, event.y);
// Now get the raw unshifted button. // Now get the raw unshifted button.
ButtonHandle button = get_button(event); ButtonHandle button = get_button(event, false);
if (button == KeyboardButton::lcontrol() || button == KeyboardButton::rcontrol()) { if (button == KeyboardButton::lcontrol() || button == KeyboardButton::rcontrol()) {
_input_devices[0].button_down(KeyboardButton::control()); _input_devices[0].button_down(KeyboardButton::control());
} }
@ -1274,7 +1274,7 @@ handle_keyrelease(XKeyEvent &event) {
_input_devices[0].set_pointer_in_window(event.x, event.y); _input_devices[0].set_pointer_in_window(event.x, event.y);
// Now get the raw unshifted button. // Now get the raw unshifted button.
ButtonHandle button = get_button(event); ButtonHandle button = get_button(event, false);
if (button == KeyboardButton::lcontrol() || button == KeyboardButton::rcontrol()) { if (button == KeyboardButton::lcontrol() || button == KeyboardButton::rcontrol()) {
_input_devices[0].button_up(KeyboardButton::control()); _input_devices[0].button_up(KeyboardButton::control());
} }
@ -1296,7 +1296,7 @@ handle_keyrelease(XKeyEvent &event) {
// keyboard button indicated by the given key event. // keyboard button indicated by the given key event.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
ButtonHandle glxGraphicsWindow:: ButtonHandle glxGraphicsWindow::
get_button(XKeyEvent &key_event) { get_button(XKeyEvent &key_event, bool allow_shift) {
KeySym key = XLookupKeysym(&key_event, 0); KeySym key = XLookupKeysym(&key_event, 0);
if ((key_event.state & Mod2Mask) != 0) { if ((key_event.state & Mod2Mask) != 0) {
@ -1346,7 +1346,7 @@ get_button(XKeyEvent &key_event) {
return button; return button;
} }
// If that didn't produce a button we know, just fall through // If that didn't produce a button we know, just fall through
// and handle the unshifted key. // and handle the normal, un-numlocked key.
break; break;
default: default:
@ -1354,6 +1354,26 @@ get_button(XKeyEvent &key_event) {
} }
} }
if (allow_shift) {
// If shift is held down, get the shifted keysym.
if ((key_event.state & ShiftMask) != 0) {
KeySym k2 = XLookupKeysym(&key_event, 1);
ButtonHandle button = map_button(k2);
if (button != ButtonHandle::none()) {
return button;
}
}
// If caps lock is down, shift lowercase letters to uppercase. We
// can do this in just the ASCII set, because we handle
// international keyboards elsewhere (via an input context).
if ((key_event.state & (ShiftMask | LockMask)) != 0) {
if (key >= XK_a and key <= XK_z) {
key += (XK_A - XK_a);
}
}
}
return map_button(key); return map_button(key);
} }

View File

@ -61,7 +61,7 @@ private:
void handle_keypress(XKeyEvent &event); void handle_keypress(XKeyEvent &event);
void handle_keyrelease(XKeyEvent &event); void handle_keyrelease(XKeyEvent &event);
ButtonHandle get_button(XKeyEvent &key_event); ButtonHandle get_button(XKeyEvent &key_event, bool allow_shift);
ButtonHandle map_button(KeySym key); ButtonHandle map_button(KeySym key);
ButtonHandle get_mouse_button(XButtonEvent &button_event); ButtonHandle get_mouse_button(XButtonEvent &button_event);