mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
Add raw keyboard event support on Windows
This commit is contained in:
parent
a81e192ba5
commit
31b79dc554
@ -1819,6 +1819,10 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
||||
handle_keypress(lookup_key(wparam), point.x, point.y,
|
||||
get_message_time());
|
||||
|
||||
if ((lparam & 0x40000000) == 0) {
|
||||
handle_raw_keypress(lookup_raw_key(lparam), get_message_time());
|
||||
}
|
||||
|
||||
// wparam does not contain left/right information for SHIFT,
|
||||
// CONTROL, or ALT, so we have to track their status and do
|
||||
// the right thing. We'll send the left/right specific key
|
||||
@ -1879,6 +1883,7 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
||||
ScreenToClient(hwnd, &point);
|
||||
handle_keypress(lookup_key(wparam), point.x, point.y,
|
||||
get_message_time());
|
||||
handle_raw_keypress(lookup_raw_key(lparam), get_message_time());
|
||||
|
||||
// wparam does not contain left/right information for SHIFT,
|
||||
// CONTROL, or ALT, so we have to track their status and do
|
||||
@ -2005,6 +2010,7 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
||||
<< "keyup: " << wparam << " (" << lookup_key(wparam) << ")\n";
|
||||
}
|
||||
handle_keyrelease(lookup_key(wparam), get_message_time());
|
||||
handle_raw_keyrelease(lookup_raw_key(lparam), get_message_time());
|
||||
|
||||
// wparam does not contain left/right information for SHIFT,
|
||||
// CONTROL, or ALT, so we have to track their status and do
|
||||
@ -2367,6 +2373,30 @@ handle_keyrelease(ButtonHandle key, double time) {
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: WinGraphicsWindow::handle_raw_keypress
|
||||
// Access: Private
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void WinGraphicsWindow::
|
||||
handle_raw_keypress(ButtonHandle key, double time) {
|
||||
if (key != ButtonHandle::none()) {
|
||||
_input_devices[0].raw_button_down(key, time);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: WinGraphicsWindow::handle_raw_keyrelease
|
||||
// Access: Private
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void WinGraphicsWindow::
|
||||
handle_raw_keyrelease(ButtonHandle key, double time) {
|
||||
if (key != ButtonHandle::none()) {
|
||||
_input_devices[0].raw_button_up(key, time);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: WinGraphicsWindow::lookup_key
|
||||
// Access: Private
|
||||
@ -2452,6 +2482,136 @@ lookup_key(WPARAM wparam) const {
|
||||
return ButtonHandle::none();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: WinGraphicsWindow::lookup_raw_key
|
||||
// Access: Private
|
||||
// Description: Translates the scancode reported by Windows to an
|
||||
// appropriate Panda ButtonHandle.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
ButtonHandle WinGraphicsWindow::
|
||||
lookup_raw_key(LPARAM lparam) const {
|
||||
unsigned char vsc = (lparam & 0xff0000) >> 16;
|
||||
|
||||
if (lparam & 0x1000000) {
|
||||
// Extended keys
|
||||
switch (vsc) {
|
||||
case 29: return KeyboardButton::rcontrol();
|
||||
case 56: return KeyboardButton::ralt();
|
||||
case 69: return KeyboardButton::num_lock();
|
||||
case 71: return KeyboardButton::home();
|
||||
case 72: return KeyboardButton::up();
|
||||
case 73: return KeyboardButton::page_up();
|
||||
case 75: return KeyboardButton::left();
|
||||
case 77: return KeyboardButton::right();
|
||||
case 79: return KeyboardButton::end();
|
||||
case 80: return KeyboardButton::down();
|
||||
case 81: return KeyboardButton::page_down();
|
||||
case 82: return KeyboardButton::insert();
|
||||
case 83: return KeyboardButton::del();
|
||||
}
|
||||
}
|
||||
|
||||
if (vsc <= 83) {
|
||||
static ButtonHandle raw_map[] = {
|
||||
ButtonHandle::none(),
|
||||
KeyboardButton::escape(),
|
||||
KeyboardButton::ascii_key('1'),
|
||||
KeyboardButton::ascii_key('2'),
|
||||
KeyboardButton::ascii_key('3'),
|
||||
KeyboardButton::ascii_key('4'),
|
||||
KeyboardButton::ascii_key('5'),
|
||||
KeyboardButton::ascii_key('6'),
|
||||
KeyboardButton::ascii_key('7'),
|
||||
KeyboardButton::ascii_key('8'),
|
||||
KeyboardButton::ascii_key('9'),
|
||||
KeyboardButton::ascii_key('0'),
|
||||
KeyboardButton::ascii_key('-'),
|
||||
KeyboardButton::ascii_key('='),
|
||||
KeyboardButton::backspace(),
|
||||
KeyboardButton::tab(),
|
||||
KeyboardButton::ascii_key('q'),
|
||||
KeyboardButton::ascii_key('w'),
|
||||
KeyboardButton::ascii_key('e'),
|
||||
KeyboardButton::ascii_key('r'),
|
||||
KeyboardButton::ascii_key('t'),
|
||||
KeyboardButton::ascii_key('y'),
|
||||
KeyboardButton::ascii_key('u'),
|
||||
KeyboardButton::ascii_key('i'),
|
||||
KeyboardButton::ascii_key('o'),
|
||||
KeyboardButton::ascii_key('p'),
|
||||
KeyboardButton::ascii_key('['),
|
||||
KeyboardButton::ascii_key(']'),
|
||||
KeyboardButton::enter(),
|
||||
KeyboardButton::lcontrol(),
|
||||
KeyboardButton::ascii_key('a'),
|
||||
KeyboardButton::ascii_key('s'),
|
||||
KeyboardButton::ascii_key('d'),
|
||||
KeyboardButton::ascii_key('f'),
|
||||
KeyboardButton::ascii_key('g'),
|
||||
KeyboardButton::ascii_key('h'),
|
||||
KeyboardButton::ascii_key('j'),
|
||||
KeyboardButton::ascii_key('k'),
|
||||
KeyboardButton::ascii_key('l'),
|
||||
KeyboardButton::ascii_key(';'),
|
||||
KeyboardButton::ascii_key('\''),
|
||||
KeyboardButton::ascii_key('`'),
|
||||
KeyboardButton::lshift(),
|
||||
KeyboardButton::ascii_key('\\'),
|
||||
KeyboardButton::ascii_key('z'),
|
||||
KeyboardButton::ascii_key('x'),
|
||||
KeyboardButton::ascii_key('c'),
|
||||
KeyboardButton::ascii_key('v'),
|
||||
KeyboardButton::ascii_key('b'),
|
||||
KeyboardButton::ascii_key('n'),
|
||||
KeyboardButton::ascii_key('m'),
|
||||
KeyboardButton::ascii_key(','),
|
||||
KeyboardButton::ascii_key('.'),
|
||||
KeyboardButton::ascii_key('/'),
|
||||
KeyboardButton::rshift(),
|
||||
KeyboardButton::ascii_key('*'),
|
||||
KeyboardButton::lalt(),
|
||||
KeyboardButton::space(),
|
||||
KeyboardButton::caps_lock(),
|
||||
KeyboardButton::f1(),
|
||||
KeyboardButton::f2(),
|
||||
KeyboardButton::f3(),
|
||||
KeyboardButton::f4(),
|
||||
KeyboardButton::f5(),
|
||||
KeyboardButton::f6(),
|
||||
KeyboardButton::f7(),
|
||||
KeyboardButton::f8(),
|
||||
KeyboardButton::f9(),
|
||||
KeyboardButton::f10(),
|
||||
KeyboardButton::pause(),
|
||||
KeyboardButton::scroll_lock(),
|
||||
KeyboardButton::ascii_key('7'),
|
||||
KeyboardButton::ascii_key('8'),
|
||||
KeyboardButton::ascii_key('9'),
|
||||
KeyboardButton::ascii_key('-'),
|
||||
KeyboardButton::ascii_key('4'),
|
||||
KeyboardButton::ascii_key('5'),
|
||||
KeyboardButton::ascii_key('6'),
|
||||
KeyboardButton::ascii_key('+'),
|
||||
KeyboardButton::ascii_key('1'),
|
||||
KeyboardButton::ascii_key('2'),
|
||||
KeyboardButton::ascii_key('3'),
|
||||
KeyboardButton::ascii_key('0'),
|
||||
KeyboardButton::ascii_key('.')
|
||||
};
|
||||
return raw_map[vsc];
|
||||
}
|
||||
|
||||
// A few additional keys don't fit well in the above table.
|
||||
switch (vsc) {
|
||||
case 87: return KeyboardButton::f11();
|
||||
case 88: return KeyboardButton::f12();
|
||||
//case 91: return KeyboardButton::lmeta();
|
||||
//case 92: return KeyboardButton::rmeta();
|
||||
//case 93: return KeyboardButton::menu();
|
||||
default: return ButtonHandle::none();
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: WinGraphicsWindow::handle_raw_input
|
||||
// Access: Private
|
||||
|
@ -131,7 +131,10 @@ private:
|
||||
void handle_keypress(ButtonHandle key, int x, int y, double time);
|
||||
void handle_keyresume(ButtonHandle key, double time);
|
||||
void handle_keyrelease(ButtonHandle key, double time);
|
||||
void handle_raw_keypress(ButtonHandle key, double time);
|
||||
void handle_raw_keyrelease(ButtonHandle key, double time);
|
||||
ButtonHandle lookup_key(WPARAM wparam) const;
|
||||
ButtonHandle lookup_raw_key(LPARAM lparam) const;
|
||||
INLINE int translate_mouse(int pos) const;
|
||||
INLINE void set_cursor_in_window();
|
||||
INLINE void set_cursor_out_of_window();
|
||||
|
Loading…
x
Reference in New Issue
Block a user