xkb: Fix locked/latched indicator desync across multiple keyboards

When a group indicator (or a latched indicator of any kind) is defined,
e.g.:
  indicator "Scroll Lock" { groups = Group2; }
the logical and physical indicator state may desync across multiple
connected keyboards.

This is caused by XkbPushLockedStateToSlaves only pushing locked_mods to
the slave devices. Pushing locked_group (as well as latched groups/mods)
along with locked_mods resolves the issue.

The issue is not observed with API calls because a different code path
is taken (avoiding XkbPushLockedStateToSlaves altogether).

Signed-off-by: Alexander Melnyk <inboxnumberzero@zoho.com>
(cherry picked from commit 36a7fdd315)
(cherry picked from commit a9ee6b7326)

Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2151>
This commit is contained in:
Alexander Melnyk 2025-12-29 18:43:04 +02:00 committed by Marge Bot
parent 0e08e5083f
commit 7a8f8ef9b7

View file

@ -1233,6 +1233,12 @@ XkbPushLockedStateToSlaves(DeviceIntPtr master, int evtype, int key)
dev->key->xkbInfo->state.locked_mods =
master->key->xkbInfo->state.locked_mods;
dev->key->xkbInfo->state.locked_group =
master->key->xkbInfo->state.locked_group;
dev->key->xkbInfo->state.latched_mods =
master->key->xkbInfo->state.latched_mods;
dev->key->xkbInfo->state.latched_group =
master->key->xkbInfo->state.latched_group;
_XkbApplyState(dev, genStateNotify, evtype, key);
}