commit a24800f
chld
·
2026-07-14 16:36:38 +0000 UTC
parent e605be0
key modifieras
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);