summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam Sampson <ats@offog.org>2021-07-04 23:02:04 +0100
committerAlan Coopersmith <alan.coopersmith@oracle.com>2022-09-10 19:07:42 +0000
commit1c04ac514196db5e2255d99635fb6e3c36be330d (patch)
treea57d84e2ac236381d0c58f761a897991d06b907d /src
parentddaacd219609104f138006db6a8f708226db3874 (diff)
xkb: Fix off-by-one error in XKeycodeToKeysym
The code here that made indexes greater than 3 refer to XKB symbol groups had an off-by-one error, so it would always leave out the symbol that should have been at index 4. Rewrite the code to fix this and simplify the logic a bit. Signed-off-by: Adam Sampson <ats@offog.org>
Diffstat (limited to 'src')
-rw-r--r--src/xkb/XKBBind.c44
1 files changed, 16 insertions, 28 deletions
diff --git a/src/xkb/XKBBind.c b/src/xkb/XKBBind.c
index 8da18a7f..a63c86ea 100644
--- a/src/xkb/XKBBind.c
+++ b/src/xkb/XKBBind.c
@@ -113,36 +113,24 @@ XKeycodeToKeysym(Display *dpy,
return NoSymbol;
if (col > 3) {
- int lastSym, tmp, nGrp;
+ int firstSym, nGrp, grp;
- lastSym = 3;
+ firstSym = 4;
nGrp = XkbKeyNumGroups(xkb, kc);
- if ((nGrp > 0) &&
- ((tmp = XkbKeyGroupWidth(xkb, kc, XkbGroup1Index)) > 2)) {
- if (col <= (lastSym + tmp - 2))
- return XkbKeycodeToKeysym(dpy, kc, XkbGroup1Index,
- col - lastSym + 2);
- lastSym += tmp - 2;
- }
- if ((nGrp > 1) &&
- ((tmp = XkbKeyGroupWidth(xkb, kc, XkbGroup2Index)) > 2)) {
- if (col <= (lastSym + tmp - 2))
- return XkbKeycodeToKeysym(dpy, kc, XkbGroup2Index,
- col - lastSym + 2);
- lastSym += tmp - 2;
- }
- if (nGrp > 2) {
- tmp = XkbKeyGroupWidth(xkb, kc, XkbGroup3Index);
- if (col <= lastSym + tmp)
- return XkbKeycodeToKeysym(dpy, kc, XkbGroup3Index,
- col - lastSym);
- lastSym += tmp;
- }
- if (nGrp > 3) {
- tmp = XkbKeyGroupWidth(xkb, kc, XkbGroup4Index);
- if (col <= lastSym + tmp)
- return XkbKeycodeToKeysym(dpy, kc, XkbGroup4Index,
- col - lastSym);
+ for (grp = 0; grp < nGrp; grp++) {
+ int width = XkbKeyGroupWidth(xkb, kc, grp);
+ int skip = 0;
+ if (grp < 2) {
+ /* Skip the first two symbols in the first two groups, since we
+ * return them below for indexes 0-3. */
+ skip = 2;
+ width -= skip;
+ if (width < 0)
+ width = 0;
+ }
+ if (col < firstSym + width)
+ return XkbKeycodeToKeysym(dpy, kc, grp, col - firstSym + skip);
+ firstSym += width;
}
return NoSymbol;
}