|
|
|
@ -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();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|