mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 18:31:55 -04:00
support shift and caps lock when no input method is available
This commit is contained in:
parent
cd48a64f86
commit
8e207d8229
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user