]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Key inject filter and delay.
authorToni Wilen <twilen@winuae.net>
Tue, 24 May 2016 15:53:14 +0000 (18:53 +0300)
committerToni Wilen <twilen@winuae.net>
Tue, 24 May 2016 15:53:14 +0000 (18:53 +0300)
include/keybuf.h
keybuf.cpp

index aee8daf45f45aff5ebde8ff2bbfb5ac61221fce3..5c47174f7b5bc932630a36854c5e922f55f58182 100644 (file)
@@ -17,6 +17,6 @@ extern int record_key_direct (int);
 extern void keybuf_init (void);
 extern int getcapslockstate (void);
 extern void setcapslockstate (int);
-extern void keybuf_inject(uae_char*);
+extern void keybuf_inject(const uae_char*);
 
 #endif /* UAE_KEYBUF_H */
index 44e557d1fdcecabf73cc958146138389d634b02a..c637cc242ce0efa0b44a4bc19b1cd6ce1a502c44 100644 (file)
@@ -31,6 +31,7 @@ static uae_char *keyinject;
 static int keyinject_offset;
 static uae_u8 keyinject_previous;
 static bool keyinject_state;
+static bool keyinject_do;
 
 struct kbtab
 {
@@ -184,11 +185,27 @@ static void keytoscancode(int key, bool release)
        }
 }
 
+// delay injection, some programs don't like too fast key events
+static bool can_inject(void)
+{
+       static int ovpos, cnt;
+
+       if (ovpos == vpos)
+               return false;
+       ovpos = vpos;
+       cnt++;
+       if (cnt < 4)
+               return false;
+       cnt = 0;
+       keyinject_do = true;
+       return true;
+}
+
 int keys_available (void)
 {
        int val;
        val = kpb_first != kpb_last;
-       if ((keyinject && keyinject[keyinject_offset]) || keyinject_state)
+       if (can_inject() && ((keyinject && keyinject[keyinject_offset]) || keyinject_state))
                val = 1;
        return val;
 }
@@ -197,20 +214,23 @@ int get_next_key (void)
 {
        int key;
 
-       if (keyinject_state) {
-               key = keyinject_previous;
-               keyinject_state = false;
-               keytoscancode(key, true);
-       } else if (keyinject) {
-               key = keyinject[keyinject_offset++];
-               keyinject_previous = key;
-               keyinject_state = true;
-               if (keyinject[keyinject_offset] == 0) {
-                       xfree(keyinject);
-                       keyinject = NULL;
-                       keyinject_offset =0;
+       if (keyinject_do) {
+               keyinject_do = false;
+               if (keyinject_state) {
+                       key = keyinject_previous;
+                       keyinject_state = false;
+                       keytoscancode(key, true);
+               } else if (keyinject) {
+                       key = keyinject[keyinject_offset++];
+                       keyinject_previous = key;
+                       keyinject_state = true;
+                       if (keyinject[keyinject_offset] == 0) {
+                               xfree(keyinject);
+                               keyinject = NULL;
+                               keyinject_offset =0;
+                       }
+                       keytoscancode(key, false);
                }
-               keytoscancode(key, false);
        }
 
        assert (kpb_first != kpb_last);
@@ -248,12 +268,34 @@ int record_key_direct (int kc)
 void keybuf_init (void)
 {
        kpb_first = kpb_last = 0;
+       keyinject_offset = 0;
+       xfree(keyinject);
+       keyinject = NULL;
        inputdevice_updateconfig (&changed_prefs, &currprefs);
 }
 
-void keybuf_inject(uae_char *txt)
+void keybuf_inject(const uae_char *txt)
 {
+       uae_char *newbuf = xmalloc(uae_char, strlen(txt) + 1);
+       uae_char *p = newbuf;
+
+       for (int j = 0; j < strlen(txt); j++) {
+               uae_char c = txt[j];
+               bool found = false;
+               for (int i = 0; kbtable[i].ascii; i++) {
+                       if (kbtable[i].ascii == c)
+                               found = true;
+               }
+               if (found)
+                       *p++= c;
+
+       }
+       *p = 0;
+       if (p == newbuf) {
+               xfree(newbuf);
+               return;
+       }
        xfree(keyinject);
        keyinject_offset = 0;
-       keyinject = strdup(txt);
+       keyinject = newbuf;
 }