diff options
-rw-r--r-- | krfb/krfb/rfbcontroller.cpp | 44 | ||||
-rw-r--r-- | krfb/krfb/rfbcontroller.h | 4 |
2 files changed, 38 insertions, 10 deletions
diff --git a/krfb/krfb/rfbcontroller.cpp b/krfb/krfb/rfbcontroller.cpp index fe6aee94..209af979 100644 --- a/krfb/krfb/rfbcontroller.cpp +++ b/krfb/krfb/rfbcontroller.cpp @@ -185,14 +185,13 @@ const int KeyboardEvent::LEFTSHIFT = 1; const int KeyboardEvent::RIGHTSHIFT = 2; const int KeyboardEvent::ALTGR = 4; char KeyboardEvent::ModifierState; - -static KeySym added_keysyms[0x100]; +KeySym KeyboardEvent::added_keysyms[0x100]; KeyboardEvent::KeyboardEvent(bool d, KeySym k) : down(d), keySym(k) { - if(k && !IsModifierKey(k)) add_keysym(k); + if(k && !IsModifierKey(k) && XKeysymToKeycode(dpy,k) == NoSymbol) add_keysym(k); } void KeyboardEvent::initKeycodes() { @@ -244,17 +243,18 @@ int KeyboardEvent::add_keysym( KeySym keysym ) int minkey, maxkey, syms_per_keycode, kc, ret = 0; XDisplayKeycodes(dpy, &minkey, &maxkey); + + repeate: KeySym *keymap = XGetKeyboardMapping(dpy, minkey, (maxkey-minkey+1), &syms_per_keycode); + bool is_empty = true; for(int kc = minkey+1; kc <= maxkey; kc++) { - int j, didmsg = 0, is_empty = 1; - char *str; KeySym newks[8]; - for(int n = 0; n < syms_per_keycode; n++) { + is_empty = true; + for(int n = 0; n < syms_per_keycode; n++) if(keymap[(kc-minkey)*syms_per_keycode+n] != NoSymbol) - { is_empty = 0; break; } - } + { is_empty = false; break; } if(!is_empty) continue; for(int i = 0; i < 8; i++) newks[i] = NoSymbol; @@ -270,12 +270,36 @@ int KeyboardEvent::add_keysym( KeySym keysym ) ret = kc; break; } - XFree(keymap); + if(!is_empty) { delete_added_keycodes(); goto repeate; } + return ret; } +void KeyboardEvent::delete_added_keycodes( ) +{ + for(int kc = 0; kc < 0x100; kc++) + if(added_keysyms[kc] != NoSymbol) { + added_keysyms[kc] = NoSymbol; + + int minkey, maxkey, syms_per_keycode, i; + KeySym *keymap; + KeySym ksym, newks[8]; + char *str; + + XDisplayKeycodes(dpy, &minkey, &maxkey); + keymap = XGetKeyboardMapping(dpy, minkey, (maxkey - minkey + 1), &syms_per_keycode); + + for (i = 0; i < 8; i++) newks[i] = NoSymbol; + + XChangeKeyboardMapping(dpy, kc, syms_per_keycode, newks, 1); + + XFree(keymap); + XFlush(dpy); + } +} + /* this function adjusts the modifiers according to mod (as from modifiers) and ModifierState */ void KeyboardEvent::tweakModifiers(signed char mod, bool down) { @@ -433,6 +457,8 @@ RFBController::RFBController(Configuration *c) : RFBController::~RFBController() { + KeyboardEvent::delete_added_keycodes(); + stopServer(); } diff --git a/krfb/krfb/rfbcontroller.h b/krfb/krfb/rfbcontroller.h index f762d2d1..6586593f 100644 --- a/krfb/krfb/rfbcontroller.h +++ b/krfb/krfb/rfbcontroller.h @@ -68,13 +68,15 @@ class KeyboardEvent : public VNCEvent { static const int RIGHTSHIFT; static const int ALTGR; static char ModifierState; + static KeySym added_keysyms[0x100]; static void tweakModifiers(signed char mod, bool down); public: static void initKeycodes(); KeyboardEvent(bool d, KeySym k); - int add_keysym( KeySym keysym ); + static int add_keysym( KeySym keysym ); + static void delete_added_keycodes( ); virtual void exec(); }; |