Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
0
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;
}