|
@@ -10,18 +10,32 @@ extern "C" {
|
|
|
#include <xdo.h>
|
|
|
}
|
|
|
|
|
|
-const std::map<KeySym, const char*> kbd_map = {
|
|
|
- {XK_w, "Up"},
|
|
|
- {XK_a, "Left"},
|
|
|
- {XK_s, "Down"},
|
|
|
- {XK_d, "Right"},
|
|
|
- {XK_Up, "Up"},
|
|
|
- {XK_Left, "Left"},
|
|
|
- {XK_Down, "Down"},
|
|
|
- {XK_Right, "Right"},
|
|
|
- {XK_Control_L, "Control_L"},
|
|
|
- {XK_Control_R, "Control_R"},
|
|
|
- {XK_Delete, "Delete"},
|
|
|
+struct KeyboardMapping {
|
|
|
+ const char* keyseq;
|
|
|
+ int window_index;
|
|
|
+
|
|
|
+ static const int ALL_WINDOWS = -1;
|
|
|
+
|
|
|
+ KeyboardMapping(const char* keyseq, int window_index)
|
|
|
+ : keyseq(keyseq), window_index(window_index)
|
|
|
+ {
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const std::map<KeySym, const KeyboardMapping> kbd_map = {
|
|
|
+ {XK_w, KeyboardMapping("Up", 0)},
|
|
|
+ {XK_a, KeyboardMapping("Left", 0)},
|
|
|
+ {XK_s, KeyboardMapping("Down", 0)},
|
|
|
+ {XK_d, KeyboardMapping("Right", 0)},
|
|
|
+ {XK_Up, KeyboardMapping("Up", 1)},
|
|
|
+ {XK_Left, KeyboardMapping("Left", 1)},
|
|
|
+ {XK_Down, KeyboardMapping("Down", 1)},
|
|
|
+ {XK_Right, KeyboardMapping("Right", 1)},
|
|
|
+ {XK_Control_L, KeyboardMapping("Control_L", 0)},
|
|
|
+ {XK_Control_R, KeyboardMapping("Control_R", 1)},
|
|
|
+ {XK_space, KeyboardMapping("Control_R", KeyboardMapping::ALL_WINDOWS)},
|
|
|
+ {XK_Delete, KeyboardMapping("Delete", 1)},
|
|
|
+ {XK_v, KeyboardMapping("Delete", 0)},
|
|
|
};
|
|
|
|
|
|
const useconds_t KEY_DELAY = 12000; // microseconds
|
|
@@ -43,26 +57,30 @@ class ToontownKeyboardManager {
|
|
|
xdo_t* xdo;
|
|
|
|
|
|
void search_toontown_windows(Window** windowlist_ret, unsigned int* nwindows_ret) {
|
|
|
- search_windows_by_name(xdo, "Toontown.*", windowlist_ret, nwindows_ret);
|
|
|
+ search_windows_by_name(xdo, "^Toontown", windowlist_ret, nwindows_ret);
|
|
|
}
|
|
|
|
|
|
- void send_keyseq(const char* keysequence, int type) {
|
|
|
+ void send_keyseq(const KeyboardMapping* mapping, int type) {
|
|
|
Window* windows;
|
|
|
unsigned int nwindows;
|
|
|
search_toontown_windows(&windows, &nwindows);
|
|
|
for(unsigned int i=0; i<nwindows; i++) {
|
|
|
- // file:///usr/share/doc/libxdo-dev/html/xdo_8h.html
|
|
|
- // http://www.cl.cam.ac.uk/~mgk25/ucs/keysymdef.h
|
|
|
- if(type == KeyPress) {
|
|
|
- xdo_send_keysequence_window_down(xdo, windows[i], keysequence, KEY_DELAY);
|
|
|
- } else if(type == KeyRelease) {
|
|
|
- xdo_send_keysequence_window_up(xdo, windows[i], keysequence, KEY_DELAY);
|
|
|
+ if(mapping->window_index >= nwindows
|
|
|
+ || mapping->window_index == KeyboardMapping::ALL_WINDOWS
|
|
|
+ || mapping->window_index == i) {
|
|
|
+ // file:///usr/share/doc/libxdo-dev/html/xdo_8h.html
|
|
|
+ // http://www.cl.cam.ac.uk/~mgk25/ucs/keysymdef.h
|
|
|
+ if(type == KeyPress) {
|
|
|
+ xdo_send_keysequence_window_down(xdo, windows[i], mapping->keyseq, KEY_DELAY);
|
|
|
+ } else if(type == KeyRelease) {
|
|
|
+ xdo_send_keysequence_window_up(xdo, windows[i], mapping->keyseq, KEY_DELAY);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
if(type == KeyPress) {
|
|
|
- printf("> '%s' down\n", keysequence);
|
|
|
+ printf("> '%s' down\n", mapping->keyseq);
|
|
|
} else if(type == KeyRelease) {
|
|
|
- printf("> '%s' up\n", keysequence);
|
|
|
+ printf("> '%s' up\n", mapping->keyseq);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -74,7 +92,7 @@ class ToontownKeyboardManager {
|
|
|
} else {
|
|
|
auto kbd_map_it = kbd_map.find(key_symbol);
|
|
|
if(kbd_map_it != kbd_map.end()) {
|
|
|
- send_keyseq(kbd_map_it->second, key_event->type);
|
|
|
+ send_keyseq(&kbd_map_it->second, key_event->type);
|
|
|
} else if(key_event->type == KeyPress) {
|
|
|
printf(
|
|
|
"no mapping for '%s' (%#lx)\n",
|