static unsigned int xkb_mask_modifier( XkbDescPtr xkb, const char *name ) { int i; if( xkb == nullptr || xkb->names == nullptr ) return 0; for( i = 0; i < XkbNumVirtualMods; i++ ) { char* modStr = XGetAtomName( xkb->dpy, xkb->names->vmods[i] ); if( modStr != nullptr && strcmp(name, modStr) == 0 ) { unsigned int mask; XkbVirtualModsToReal( xkb, 1 << i, &mask ); return mask; } } return 0; }
static unsigned int numlock_mask(Display* dpy) { XkbDescPtr xkb = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd); if(xkb == NULL) return 0; char* modstr; unsigned int mask = 0; for(int i = 0; i < XkbNumVirtualMods; i++) { modstr = XGetAtomName(xkb->dpy, xkb->names->vmods[i]); if(modstr != NULL && strcmp(modstr, "NumLock") == 0) { XkbVirtualModsToReal(xkb, 1 << i, &mask); break; } } XkbFreeKeyboard(xkb, 0, True); return mask; }
static Bool DefaultApplyControls(XkbConfigRtrnPtr rtrn, XkbDescPtr xkb) { unsigned on, off; XkbControlsPtr ctrls; unsigned int mask; if (XkbAllocControls(xkb, XkbAllControlsMask) != Success) return False; ctrls = xkb->ctrls; if (rtrn->replace_initial_ctrls) ctrls->enabled_ctrls = rtrn->initial_ctrls; else ctrls->enabled_ctrls |= rtrn->initial_ctrls; ctrls->enabled_ctrls &= ~rtrn->initial_ctrls_clear; if (rtrn->internal_mods.replace) { ctrls->internal.real_mods = rtrn->internal_mods.mods; ctrls->internal.vmods = rtrn->internal_mods.vmods; } else { ctrls->internal.real_mods &= ~rtrn->internal_mods.mods_clear; ctrls->internal.vmods &= ~rtrn->internal_mods.vmods_clear; ctrls->internal.real_mods |= rtrn->internal_mods.mods; ctrls->internal.vmods |= rtrn->internal_mods.vmods; } mask = 0; (void) XkbVirtualModsToReal(xkb, ctrls->internal.vmods, &mask); ctrls->internal.mask = (ctrls->internal.real_mods | mask); if (rtrn->ignore_lock_mods.replace) { ctrls->ignore_lock.real_mods = rtrn->ignore_lock_mods.mods; ctrls->ignore_lock.vmods = rtrn->ignore_lock_mods.vmods; } else { ctrls->ignore_lock.real_mods &= ~rtrn->ignore_lock_mods.mods_clear; ctrls->ignore_lock.vmods &= ~rtrn->ignore_lock_mods.vmods_clear; ctrls->ignore_lock.real_mods |= rtrn->ignore_lock_mods.mods; ctrls->ignore_lock.vmods |= rtrn->ignore_lock_mods.vmods; } mask = 0; (void) XkbVirtualModsToReal(xkb, ctrls->ignore_lock.vmods, &mask); ctrls->ignore_lock.mask = (ctrls->ignore_lock.real_mods | mask); if (rtrn->repeat_delay > 0) ctrls->repeat_delay = rtrn->repeat_delay; if (rtrn->repeat_interval > 0) ctrls->repeat_interval = rtrn->repeat_interval; if (rtrn->slow_keys_delay > 0) ctrls->slow_keys_delay = rtrn->slow_keys_delay; if (rtrn->debounce_delay > 0) ctrls->debounce_delay = rtrn->debounce_delay; if (rtrn->mk_delay > 0) ctrls->mk_delay = rtrn->mk_delay; if (rtrn->mk_interval > 0) ctrls->mk_interval = rtrn->mk_interval; if (rtrn->mk_time_to_max > 0) ctrls->mk_time_to_max = rtrn->mk_time_to_max; if (rtrn->mk_max_speed > 0) ctrls->mk_max_speed = rtrn->mk_max_speed; if (rtrn->mk_curve > 0) ctrls->mk_curve = rtrn->mk_curve; if (rtrn->defined & XkbCF_AccessXTimeout && rtrn->ax_timeout > 0) ctrls->ax_timeout = rtrn->ax_timeout; /* any value set to both off and on is reset to ignore */ if ((off = (rtrn->axt_ctrls_on & rtrn->axt_ctrls_off)) != 0) rtrn->axt_ctrls_ignore |= off; /* ignore takes priority over on and off */ rtrn->axt_ctrls_on &= ~rtrn->axt_ctrls_ignore; rtrn->axt_ctrls_off &= ~rtrn->axt_ctrls_ignore; if (!rtrn->replace_axt_ctrls_off) { off = (ctrls->axt_ctrls_mask & (~ctrls->axt_ctrls_values)); off &= ~rtrn->axt_ctrls_on; off |= rtrn->axt_ctrls_off; } else off = rtrn->axt_ctrls_off; if (!rtrn->replace_axt_ctrls_on) { on = (ctrls->axt_ctrls_mask & ctrls->axt_ctrls_values); on &= ~rtrn->axt_ctrls_off; on |= rtrn->axt_ctrls_on; } else on = rtrn->axt_ctrls_on; ctrls->axt_ctrls_mask = (on | off) & ~rtrn->axt_ctrls_ignore; ctrls->axt_ctrls_values = on & ~rtrn->axt_ctrls_ignore; /* any value set to both off and on is reset to ignore */ if ((off = (rtrn->axt_opts_on & rtrn->axt_opts_off)) != 0) rtrn->axt_opts_ignore |= off; /* ignore takes priority over on and off */ rtrn->axt_opts_on &= ~rtrn->axt_opts_ignore; rtrn->axt_opts_off &= ~rtrn->axt_opts_ignore; if (rtrn->replace_axt_opts_off) { off = (ctrls->axt_opts_mask & (~ctrls->axt_opts_values)); off &= ~rtrn->axt_opts_on; off |= rtrn->axt_opts_off; } else off = rtrn->axt_opts_off; if (!rtrn->replace_axt_opts_on) { on = (ctrls->axt_opts_mask & ctrls->axt_opts_values); on &= ~rtrn->axt_opts_off; on |= rtrn->axt_opts_on; } else on = rtrn->axt_opts_on; ctrls->axt_opts_mask = (unsigned short) ((on | off) & ~rtrn->axt_ctrls_ignore); ctrls->axt_opts_values = (unsigned short) (on & ~rtrn->axt_ctrls_ignore); if (rtrn->defined & XkbCF_GroupsWrap) { int n; n = XkbNumGroups(ctrls->groups_wrap); rtrn->groups_wrap = XkbSetNumGroups(rtrn->groups_wrap, n); ctrls->groups_wrap = rtrn->groups_wrap; } return True; }