浏览代码

define mappings for individual windows

Fabian Peter Hammerle 8 年之前
父节点
当前提交
21170e850d
共有 1 个文件被更改,包括 41 次插入23 次删除
  1. 41 23
      main.cpp

+ 41 - 23
main.cpp

@@ -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",