Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- xkbActions.orig.c 2013-08-04 11:55:33.388301598 -0500
- +++ xkbActions.c 2013-08-04 09:31:59.067134417 -0500
- @@ -340,23 +340,89 @@
- return 1;
- }
- +static int xkbSwitchGroupOnRelease(void)
- +{
- + /* TODO: user configuring */
- + return TRUE;
- +}
- +
- +static void xkbUpdateLockedGroup(XkbSrvInfoPtr xkbi, XkbAction* pAction)
- +{
- + XkbGroupAction ga = pAction->group;
- + if (ga.flags&XkbSA_GroupAbsolute)
- + xkbi->state.locked_group= XkbSAGroup(&ga);
- + else xkbi->state.locked_group+= XkbSAGroup(&ga);
- +}
- +
- +static XkbFilterPtr _XkbNextFreeFilter(XkbSrvInfoPtr xkbi);
- +
- +
- static int
- -_XkbFilterLockState(XkbSrvInfoPtr xkbi,
- +_XkbFilterLockGroup(XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter, unsigned keycode, XkbAction *pAction)
- {
- - if (pAction && (pAction->type == XkbSA_LockGroup)) {
- - if (pAction->group.flags & XkbSA_GroupAbsolute)
- - xkbi->state.locked_group = XkbSAGroup(&pAction->group);
- - else
- - xkbi->state.locked_group += XkbSAGroup(&pAction->group);
- - return 1;
- + /* if (pAction && (pAction->type == XkbSA_LockGroup)) { */
- + /* if (pAction->group.flags & XkbSA_GroupAbsolute) */
- + /* xkbi->state.locked_group = XkbSAGroup(&pAction->group); */
- + /* else */
- + /* xkbi->state.locked_group += XkbSAGroup(&pAction->group); */
- + /* return 1; */
- + int sendEvent = 1;
- +
- + if (!xkbSwitchGroupOnRelease()) {
- + xkbUpdateLockedGroup(xkbi, pAction);
- + return sendEvent;
- + }
- +
- + /* Delay switch till button release */
- + if (filter->keycode==0) { /* initial press */
- + filter->keycode = keycode;
- + filter->active = 1;
- + filter->filterOthers = 0; /* for what? */
- + filter->filter = _XkbFilterLockGroup;
- +
- + /* filter->priv = 0; */
- + filter->upAction = *pAction;
- +
- + /* Ok, now we need to simulate the action which would go if this action didn't block it.
- + XkbSA_SetMods is the one: it is to set modifier' flag up. */
- + {
- + XkbStateRec fake_state = xkbi->state;
- + XkbAction act;
- +
- + fake_state.mods = 0;
- + act = XkbGetKeyAction(xkbi, &fake_state, keycode);
- +
- + /* KLUDGE: XkbSA_SetMods only? */
- + if (act.type == XkbSA_SetMods) {
- + XkbFilterPtr filter = _XkbNextFreeFilter(xkbi);
- + sendEvent = _XkbFilterSetState(xkbi,filter,keycode,&act);
- + }
- + }
- }
- + else {
- + /* do nothing if some button else is pressed */
- + if (!pAction)
- + xkbUpdateLockedGroup(xkbi, &filter->upAction);
- + filter->active = 0;
- + }
- +
- + return sendEvent;
- +}
- +
- +static int
- +_XkbFilterLockMods( XkbSrvInfoPtr xkbi,
- + XkbFilterPtr filter,
- + unsigned keycode,
- + XkbAction * pAction)
- +{
- +
- if (filter->keycode == 0) { /* initial press */
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- filter->priv = xkbi->state.locked_mods & pAction->mods.mask;
- - filter->filter = _XkbFilterLockState;
- + filter->filter = _XkbFilterLockMods;
- filter->upAction = *pAction;
- if (!(filter->upAction.mods.flags & XkbSA_LockNoLock))
- xkbi->state.locked_mods |= pAction->mods.mask;
- @@ -1142,9 +1208,12 @@
- sendEvent = _XkbFilterLatchState(xkbi, filter, key, &act);
- break;
- case XkbSA_LockMods:
- + filter = _XkbNextFreeFilter(xkbi);
- + sendEvent=_XkbFilterLockMods(xkbi,filter,key,&act);
- + break;
- case XkbSA_LockGroup:
- filter = _XkbNextFreeFilter(xkbi);
- - sendEvent = _XkbFilterLockState(xkbi, filter, key, &act);
- + sendEvent = _XkbFilterLockGroup(xkbi, filter, key, &act);
- break;
- case XkbSA_ISOLock:
- filter = _XkbNextFreeFilter(xkbi);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement