|
|
@@ -50,6 +50,83 @@ RocketInputHandler::
|
|
|
~RocketInputHandler() {
|
|
|
}
|
|
|
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+// Function: RocketInputHandler::get_rocket_key
|
|
|
+// Access: Published
|
|
|
+// Description: Returns the libRocket KeyIdentifier for the given
|
|
|
+// ButtonHandle, or KI_UNKNOWN (0) if it wasn't known.
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+int RocketInputHandler::
|
|
|
+get_rocket_key(const ButtonHandle handle) {
|
|
|
+ static pmap<int, int> keymap;
|
|
|
+ pmap<int, int>::const_iterator it;
|
|
|
+
|
|
|
+ if (keymap.size() > 0) {
|
|
|
+ it = keymap.find(handle.get_index());
|
|
|
+
|
|
|
+ if (it == keymap.end()) {
|
|
|
+ return 0;
|
|
|
+ } else {
|
|
|
+ return it->second;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ keymap[KeyboardButton::space().get_index()] = KI_SPACE;
|
|
|
+ keymap[KeyboardButton::backspace().get_index()] = KI_BACK;
|
|
|
+ keymap[KeyboardButton::tab().get_index()] = KI_TAB;
|
|
|
+ keymap[KeyboardButton::enter().get_index()] = KI_RETURN;
|
|
|
+ keymap[KeyboardButton::escape().get_index()] = KI_ESCAPE;
|
|
|
+ keymap[KeyboardButton::end().get_index()] = KI_END;
|
|
|
+ keymap[KeyboardButton::home().get_index()] = KI_HOME;
|
|
|
+ keymap[KeyboardButton::left().get_index()] = KI_LEFT;
|
|
|
+ keymap[KeyboardButton::up().get_index()] = KI_UP;
|
|
|
+ keymap[KeyboardButton::right().get_index()] = KI_RIGHT;
|
|
|
+ keymap[KeyboardButton::down().get_index()] = KI_DOWN;
|
|
|
+ keymap[KeyboardButton::insert().get_index()] = KI_INSERT;
|
|
|
+ keymap[KeyboardButton::del().get_index()] = KI_DELETE;
|
|
|
+ keymap[KeyboardButton::caps_lock().get_index()] = KI_CAPITAL;
|
|
|
+ keymap[KeyboardButton::f1().get_index()] = KI_F1;
|
|
|
+ keymap[KeyboardButton::f10().get_index()] = KI_F10;
|
|
|
+ keymap[KeyboardButton::f11().get_index()] = KI_F11;
|
|
|
+ keymap[KeyboardButton::f12().get_index()] = KI_F12;
|
|
|
+ keymap[KeyboardButton::f13().get_index()] = KI_F13;
|
|
|
+ keymap[KeyboardButton::f14().get_index()] = KI_F14;
|
|
|
+ keymap[KeyboardButton::f15().get_index()] = KI_F15;
|
|
|
+ keymap[KeyboardButton::f16().get_index()] = KI_F16;
|
|
|
+ keymap[KeyboardButton::f2().get_index()] = KI_F2;
|
|
|
+ keymap[KeyboardButton::f3().get_index()] = KI_F3;
|
|
|
+ keymap[KeyboardButton::f4().get_index()] = KI_F4;
|
|
|
+ keymap[KeyboardButton::f5().get_index()] = KI_F5;
|
|
|
+ keymap[KeyboardButton::f6().get_index()] = KI_F6;
|
|
|
+ keymap[KeyboardButton::f7().get_index()] = KI_F7;
|
|
|
+ keymap[KeyboardButton::f8().get_index()] = KI_F8;
|
|
|
+ keymap[KeyboardButton::f9().get_index()] = KI_F9;
|
|
|
+ keymap[KeyboardButton::help().get_index()] = KI_HELP;
|
|
|
+ keymap[KeyboardButton::lcontrol().get_index()] = KI_LCONTROL;
|
|
|
+ keymap[KeyboardButton::lshift().get_index()] = KI_LSHIFT;
|
|
|
+ keymap[KeyboardButton::num_lock().get_index()] = KI_NUMLOCK;
|
|
|
+ keymap[KeyboardButton::page_down().get_index()] = KI_NEXT;
|
|
|
+ keymap[KeyboardButton::page_up().get_index()] = KI_PRIOR;
|
|
|
+ keymap[KeyboardButton::pause().get_index()] = KI_PAUSE;
|
|
|
+ keymap[KeyboardButton::print_screen().get_index()] = KI_SNAPSHOT;
|
|
|
+ keymap[KeyboardButton::rcontrol().get_index()] = KI_RCONTROL;
|
|
|
+ keymap[KeyboardButton::rshift().get_index()] = KI_RSHIFT;
|
|
|
+ keymap[KeyboardButton::scroll_lock().get_index()] = KI_SCROLL;
|
|
|
+
|
|
|
+ for (char c = 'a'; c <= 'z'; ++c) {
|
|
|
+ keymap[KeyboardButton::ascii_key(c).get_index()] = (c - 'a') + KI_A;
|
|
|
+ }
|
|
|
+ for (char c = '0'; c <= '9'; ++c) {
|
|
|
+ keymap[KeyboardButton::ascii_key(c).get_index()] = (c - '0') + KI_0;
|
|
|
+ }
|
|
|
+
|
|
|
+ it = keymap.find(handle.get_index());
|
|
|
+ if (it != keymap.end()) {
|
|
|
+ return it->second;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
// Function: RocketInputHandler::do_transmit_data
|
|
|
// Access: Protected, Virtual
|
|
|
@@ -92,6 +169,8 @@ do_transmit_data(DataGraphTraverser *trav, const DataNodeTransmit &input,
|
|
|
for (int i = 0; i < num_events; i++) {
|
|
|
const ButtonEvent &be = this_button_events->get_event(i);
|
|
|
|
|
|
+ int rocket_key = KI_UNKNOWN;
|
|
|
+
|
|
|
switch (be._type) {
|
|
|
case ButtonEvent::T_down:
|
|
|
if (be._button == KeyboardButton::control()) {
|
|
|
@@ -107,10 +186,30 @@ do_transmit_data(DataGraphTraverser *trav, const DataNodeTransmit &input,
|
|
|
_wheel_delta -= 1;
|
|
|
} else if (be._button == MouseButton::wheel_down()) {
|
|
|
_wheel_delta += 1;
|
|
|
+
|
|
|
+ } else if (be._button == MouseButton::one()) {
|
|
|
+ _mouse_buttons[0] = true;
|
|
|
+ } else if (be._button == MouseButton::two()) {
|
|
|
+ _mouse_buttons[1] = true;
|
|
|
+ } else if (be._button == MouseButton::three()) {
|
|
|
+ _mouse_buttons[2] = true;
|
|
|
+ } else if (be._button == MouseButton::four()) {
|
|
|
+ _mouse_buttons[3] = true;
|
|
|
+ } else if (be._button == MouseButton::five()) {
|
|
|
+ _mouse_buttons[4] = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ rocket_key = get_rocket_key(be._button);
|
|
|
+ if (rocket_key != KI_UNKNOWN) {
|
|
|
+ _keys[rocket_key] = true;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ButtonEvent::T_repeat:
|
|
|
+ rocket_key = get_rocket_key(be._button);
|
|
|
+ if (rocket_key != KI_UNKNOWN) {
|
|
|
+ _repeated_keys.push_back(rocket_key);
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case ButtonEvent::T_up:
|
|
|
@@ -122,11 +221,30 @@ do_transmit_data(DataGraphTraverser *trav, const DataNodeTransmit &input,
|
|
|
_modifiers &= ~KM_ALT;
|
|
|
} else if (be._button == KeyboardButton::meta()) {
|
|
|
_modifiers &= ~KM_META;
|
|
|
+
|
|
|
+ } else if (be._button == MouseButton::one()) {
|
|
|
+ _mouse_buttons[0] = false;
|
|
|
+ } else if (be._button == MouseButton::two()) {
|
|
|
+ _mouse_buttons[1] = false;
|
|
|
+ } else if (be._button == MouseButton::three()) {
|
|
|
+ _mouse_buttons[2] = false;
|
|
|
+ } else if (be._button == MouseButton::four()) {
|
|
|
+ _mouse_buttons[3] = false;
|
|
|
+ } else if (be._button == MouseButton::five()) {
|
|
|
+ _mouse_buttons[4] = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ rocket_key = get_rocket_key(be._button);
|
|
|
+ if (rocket_key != KI_UNKNOWN) {
|
|
|
+ _keys[rocket_key] = false;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ButtonEvent::T_keystroke:
|
|
|
- _text_input.push_back(be._keycode);
|
|
|
+ // Ignore control characters; otherwise, they actually get added to strings in the UI.
|
|
|
+ if (be._keycode > 0x1F and (be._keycode < 0x7F or be._keycode > 0x9F)) {
|
|
|
+ _text_input.push_back(be._keycode);
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case ButtonEvent::T_resume_down:
|
|
|
@@ -135,49 +253,6 @@ do_transmit_data(DataGraphTraverser *trav, const DataNodeTransmit &input,
|
|
|
case ButtonEvent::T_move:
|
|
|
break;
|
|
|
}
|
|
|
-
|
|
|
- bool down = (be._type == ButtonEvent::T_down);
|
|
|
- if (down || be._type == ButtonEvent::T_up) {
|
|
|
- if (be._button == MouseButton::one()) {
|
|
|
- _mouse_buttons[1] = down;
|
|
|
- } else if (be._button == MouseButton::two()) {
|
|
|
- _mouse_buttons[2] = down;
|
|
|
- } else if (be._button == MouseButton::three()) {
|
|
|
- _mouse_buttons[3] = down;
|
|
|
- } else if (be._button == MouseButton::four()) {
|
|
|
- _mouse_buttons[4] = down;
|
|
|
- } else if (be._button == MouseButton::five()) {
|
|
|
- _mouse_buttons[5] = down;
|
|
|
-
|
|
|
- // In the order they are specified in Rocket/Core/Input.h
|
|
|
- } else if (be._button == KeyboardButton::space()) {
|
|
|
- _keys[KI_SPACE] = down;
|
|
|
- } else if (be._button == KeyboardButton::backspace()) {
|
|
|
- _keys[KI_BACK] = down;
|
|
|
- } else if (be._button == KeyboardButton::tab()) {
|
|
|
- _keys[KI_TAB] = down;
|
|
|
- } else if (be._button == KeyboardButton::enter()) {
|
|
|
- _keys[KI_RETURN] = down;
|
|
|
- } else if (be._button == KeyboardButton::escape()) {
|
|
|
- _keys[KI_ESCAPE] = down;
|
|
|
- } else if (be._button == KeyboardButton::end()) {
|
|
|
- _keys[KI_END] = down;
|
|
|
- } else if (be._button == KeyboardButton::home()) {
|
|
|
- _keys[KI_HOME] = down;
|
|
|
- } else if (be._button == KeyboardButton::left()) {
|
|
|
- _keys[KI_LEFT] = down;
|
|
|
- } else if (be._button == KeyboardButton::up()) {
|
|
|
- _keys[KI_UP] = down;
|
|
|
- } else if (be._button == KeyboardButton::right()) {
|
|
|
- _keys[KI_RIGHT] = down;
|
|
|
- } else if (be._button == KeyboardButton::down()) {
|
|
|
- _keys[KI_DOWN] = down;
|
|
|
- } else if (be._button == KeyboardButton::insert()) {
|
|
|
- _keys[KI_INSERT] = down;
|
|
|
- } else if (be._button == KeyboardButton::del()) {
|
|
|
- _keys[KI_DELETE] = down;
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -226,7 +301,17 @@ update_context(Rocket::Core::Context *context, int xoffs, int yoffs) {
|
|
|
context->ProcessKeyUp((KeyIdentifier) it->first, _modifiers);
|
|
|
}
|
|
|
}
|
|
|
- _mouse_buttons.clear();
|
|
|
+ _keys.clear();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_repeated_keys.size() > 0) {
|
|
|
+ pvector<int>::const_iterator it;
|
|
|
+
|
|
|
+ for (it = _repeated_keys.begin(); it != _repeated_keys.end(); ++it) {
|
|
|
+ context->ProcessKeyUp((KeyIdentifier) *it, _modifiers);
|
|
|
+ context->ProcessKeyDown((KeyIdentifier) *it, _modifiers);
|
|
|
+ }
|
|
|
+ _repeated_keys.clear();
|
|
|
}
|
|
|
|
|
|
if (_text_input.size() > 0) {
|