krfb: Add a function for appending new symbols to the actual X-server keymap

This resolves bug 3014 and issue #11

Signed-off-by: Roman Savochenko <roman@oscada.org>
pull/16/head
Roman Savochenko 5 years ago committed by TDE Gitea
parent 78e79db9ef
commit b75ba2ef0d

@ -186,9 +186,13 @@ const int KeyboardEvent::RIGHTSHIFT = 2;
const int KeyboardEvent::ALTGR = 4;
char KeyboardEvent::ModifierState;
static KeySym added_keysyms[0x100];
KeyboardEvent::KeyboardEvent(bool d, KeySym k) :
down(d),
keySym(k) {
if(k && !IsModifierKey(k)) add_keysym(k);
}
void KeyboardEvent::initKeycodes() {
@ -223,6 +227,55 @@ void KeyboardEvent::initKeycodes() {
XFree ((char *)keymap);
}
int KeyboardEvent::add_keysym( KeySym keysym )
{
static int first = 1;
if(first) {
for(int n = 0; n < 0x100; n++)
added_keysyms[n] = NoSymbol;
first = 0;
}
if(keysym == NoSymbol) return 0;
/* there can be a race before MappingNotify */
for(int n = 0; n < 0x100; n++)
if(added_keysyms[n] == keysym) return n;
int minkey, maxkey, syms_per_keycode, kc, ret = 0;
XDisplayKeycodes(dpy, &minkey, &maxkey);
KeySym *keymap = XGetKeyboardMapping(dpy, minkey, (maxkey-minkey+1), &syms_per_keycode);
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++) {
if(keymap[(kc-minkey)*syms_per_keycode+n] != NoSymbol)
{ is_empty = 0; break; }
}
if(!is_empty) continue;
for(int i = 0; i < 8; i++) newks[i] = NoSymbol;
for(int i = 0; i < syms_per_keycode; i++) {
newks[i] = keysym;
if(i >= 7) break;
}
XChangeKeyboardMapping(dpy, kc, syms_per_keycode, newks, 1);
XFlush(dpy);
added_keysyms[kc] = keysym;
ret = kc;
break;
}
XFree(keymap);
return ret;
}
/* this function adjusts the modifiers according to mod (as from modifiers) and ModifierState */
void KeyboardEvent::tweakModifiers(signed char mod, bool down) {

@ -74,6 +74,7 @@ public:
static void initKeycodes();
KeyboardEvent(bool d, KeySym k);
int add_keysym( KeySym keysym );
virtual void exec();
};

Loading…
Cancel
Save