summaryrefslogtreecommitdiffstats
path: root/x11vnc/keyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11vnc/keyboard.c')
-rw-r--r--x11vnc/keyboard.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/x11vnc/keyboard.c b/x11vnc/keyboard.c
index e739501..2dc8f83 100644
--- a/x11vnc/keyboard.c
+++ b/x11vnc/keyboard.c
@@ -1490,6 +1490,7 @@ static void xkb_tweak_keyboard(rfbBool down, rfbKeySym keysym,
static int Kc_last_down[KLAST];
static KeySym Ks_last_down[KLAST];
static int klast = 0, khints = 1, anydown = 1;
+ static int cnt = 0;
if (!client || !down || !keysym) {} /* unused vars warning: */
@@ -1529,6 +1530,15 @@ static void xkb_tweak_keyboard(rfbBool down, rfbKeySym keysym,
}
}
}
+ cnt++;
+ if (cnt % 100 && khints && score_hint != NULL) {
+ int i, j;
+ for (i=0; i<0x100; i++) {
+ for (j=0; j<0x100; j++) {
+ score_hint[i][j] = -1;
+ }
+ }
+ }
if (debug_keyboard) {
char *str = XKeysymToString(keysym);
@@ -1807,7 +1817,7 @@ static void xkb_tweak_keyboard(rfbBool down, rfbKeySym keysym,
}
}
- /* next just check for any one that is down */
+ /* next just check for "best" one that is down */
if (Kc_f == -1 && anydown) {
int l;
int best = -1, lbest;
@@ -1824,7 +1834,7 @@ static void xkb_tweak_keyboard(rfbBool down, rfbKeySym keysym,
int key = (int) kc_f[l];
int j, jmatch = -1;
- if (keycode_state[key]) {
+ if (! keycode_state[key]) {
continue;
}
/* break ties based on lowest XKeycodeToKeysym index */
@@ -1851,12 +1861,27 @@ static void xkb_tweak_keyboard(rfbBool down, rfbKeySym keysym,
}
}
+ /* next, use the first one found that is down */
+ if (Kc_f == -1) {
+ int l;
+ for (l=0; l < found; l++) {
+ int key = (int) kc_f[l];
+ if (keycode_state[key]) {
+ Kc_f = kc_f[l];
+ break;
+ }
+ }
+ if (debug_keyboard && Kc_f != -1) {
+ fprintf(stderr, " UP: set to first one down, kc_f[%d]!!\n", l);
+ }
+ }
+
/* last, use the first one found */
if (Kc_f == -1) {
/* hope for the best... XXX check mods */
Kc_f = kc_f[0];
if (debug_keyboard && Kc_f != -1) {
- fprintf(stderr, " UP: set to first one, kc_f[0]!!\n");
+ fprintf(stderr, " UP: set to first one at all, kc_f[0]!!\n");
}
}
}