summarylogtreecommitdiffstats
path: root/freedesktop-bug-865.patch
diff options
context:
space:
mode:
authordetiam2024-04-17 18:32:32 +0800
committerdetiam2024-04-17 18:32:32 +0800
commitf01fce3e08d6ffe7166c656396221b53ee4c80cb (patch)
tree3913d2af17e477a1894246cd28a9011848fbda99 /freedesktop-bug-865.patch
downloadaur-xorg-xwayland-bug865-issue1578.tar.gz
Init
Diffstat (limited to 'freedesktop-bug-865.patch')
-rw-r--r--freedesktop-bug-865.patch109
1 files changed, 109 insertions, 0 deletions
diff --git a/freedesktop-bug-865.patch b/freedesktop-bug-865.patch
new file mode 100644
index 000000000000..0d336fc6309b
--- /dev/null
+++ b/freedesktop-bug-865.patch
@@ -0,0 +1,109 @@
+--- xorg-server-21.1.1/xkb/xkbActions.c.orig 2021-11-07 02:45:18.000000000 +0300
++++ xorg-server-21.1.1/xkb/xkbActions.c 2021-11-12 07:21:48.463995722 +0300
+@@ -352,26 +352,83 @@
+ 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)
+ {
++ int sendEvent = 1;
++
+ if (filter->keycode == 0) /* initial press */
+ AccessXCancelRepeatKey(xkbi, keycode);
+-
+- 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 (!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;
+@@ -1284,9 +1341,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);