diff options
author | Adam Sampson <ats@offog.org> | 2021-07-04 23:02:04 +0100 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2022-09-10 19:07:42 +0000 |
commit | 1c04ac514196db5e2255d99635fb6e3c36be330d (patch) | |
tree | a57d84e2ac236381d0c58f761a897991d06b907d /src | |
parent | ddaacd219609104f138006db6a8f708226db3874 (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.c | 44 |
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; } |