commit a24800f

chld  ·  2026-07-14 16:36:38 +0000 UTC
parent e605be0
key modifieras
2 files changed,  +27, -4
M xtr
M xtr.c
M xtr
+0, -0
M xtr.c
+27, -4
 1@@ -105,6 +105,17 @@ int main(int ac, char **av) {
 2     cmd[c] = 0;
 3   }
 4 
 5+  struct xkb_context *ctx;
 6+  struct xkb_keymap *keymap;
 7+  struct xkb_state *state;
 8+
 9+  ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
10+
11+  keymap = xkb_keymap_new_from_names(ctx, &(struct xkb_rule_names){0},
12+                                     XKB_KEYMAP_COMPILE_NO_FLAGS);
13+
14+  state = xkb_state_new(keymap);
15+
16   while (1) {
17     XEvent ev;
18     XNextEvent(d, &ev);
19@@ -147,7 +158,10 @@ int main(int ac, char **av) {
20       break;
21     }
22     case KeyPress: {
23+      xkb_keycode_t xkb = ev.xkey.keycode;
24+      xkb_state_update_key(state, xkb, XKB_KEY_DOWN);
25       KeySym k = XLookupKeysym(&ev.xkey, 0);
26+
27       if (k == XK_Escape) {
28         goto q;
29       }
30@@ -162,11 +176,17 @@ int main(int ac, char **av) {
31       }
32 
33       char buf[32];
34-      int l = xkb_keysym_to_utf8(k, buf, sizeof buf);
35+
36+      int l = xkb_state_key_get_utf8(state, xkb, buf, sizeof(buf));
37+
38       if (l > 0) {
39-        // printf("%s\n", buf);
40-        cmd[idx++] = buf[0];
41-        XClearArea(d, w, 0, 0, 0, 0, True);
42+        if (idx + l < sizeof(cmd)) {
43+          cmd[idx] = buf[0];
44+          idx += l;
45+          cmd[idx] = '\0';
46+
47+          XClearArea(d, w, 0, 0, 0, 0, True);
48+        }
49       }
50 
51       break;
52@@ -175,6 +195,9 @@ int main(int ac, char **av) {
53   }
54 
55 q:
56+  xkb_state_unref(state);
57+  xkb_keymap_unref(keymap);
58+  xkb_context_unref(ctx);
59   XFreeFont(d, font);
60   XUngrabKeyboard(d, CurrentTime);
61   XUngrabPointer(d, CurrentTime);