code wiki / _hdl_build / nx_x11_keyboard_gate.nx
nx_x11_keyboard_gate.nx source
↩ module page · 95 lines · 4500 B
1// nx_x11_keyboard_gate.nx -- proves the keysym -> browser-vk fold (the codes nx_input_abstract
2// binds), the GetKeyboardMapping request bytes, and the SendEvent(Key) frame layout -- all pure,
3// no server. The live keymap fetch + synthetic-key round trip are proven by nx_desktop_breeders
4// --selftest against the real X server.
5// license_tier: ORIGINAL expect_exit: 0
6import "nx_x11_keyboard.nx"
7
8func vw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
9func vn(v: i64) -> i64 {
10 let t: *u8 = sys_mmap(32) as *u8
11 var m: i64 = v; var w: i64 = 0
12 if m<0 { t[w]=45 as u8; w=w+1; m=0-m }
13 if m==0 { t[w]=48 as u8; sys_write(1,t,w+1); return 0 }
14 let d: *u8 = sys_mmap(32) as *u8
15 var k: i64=0
16 while m>0 { d[k]=(48+(m%10)) as u8; m=m/10; k=k+1 }
17 var j: i64=0
18 while j<k { t[w]=d[k-1-j]; w=w+1; j=j+1 }
19 sys_write(1,t,w); return 0
20}
21
22func main() -> i64 {
23 var pass: i64 = 0
24 let total: i64 = 5
25 vw("=== nx_x11_keyboard gate (keysym fold + wire frames) ===\n" as *u8)
26
27 // T1 letter fold: lowercase keysyms land on the vk codes the input layer binds
28 var t1: i64 = 0
29 if nx_keysym_to_vk(0x77) == 87 { t1 = t1 + 1 } // w -> W
30 if nx_keysym_to_vk(0x61) == 65 { t1 = t1 + 1 } // a -> A
31 if nx_keysym_to_vk(0x73) == 83 { t1 = t1 + 1 } // s -> S
32 if nx_keysym_to_vk(0x64) == 68 { t1 = t1 + 1 } // d -> D
33 if nx_keysym_to_vk(0x65) == 69 { t1 = t1 + 1 } // e -> E (interact)
34 if nx_keysym_to_vk(0x62) == 66 { t1 = t1 + 1 } // b -> B (breed)
35 if nx_keysym_to_vk(0x57) == 87 { t1 = t1 + 1 } // already-uppercase W
36 vw("T1 letters: " as *u8); vn(t1); vw("/7\n" as *u8)
37 if t1 == 7 { pass = pass + 1 }
38
39 // T2 specials: arrows / space / enter / escape / digits
40 var t2: i64 = 0
41 if nx_keysym_to_vk(0xFF51) == 37 { t2 = t2 + 1 }
42 if nx_keysym_to_vk(0xFF52) == 38 { t2 = t2 + 1 }
43 if nx_keysym_to_vk(0xFF53) == 39 { t2 = t2 + 1 }
44 if nx_keysym_to_vk(0xFF54) == 40 { t2 = t2 + 1 }
45 if nx_keysym_to_vk(0x20) == 32 { t2 = t2 + 1 }
46 if nx_keysym_to_vk(0xFF0D) == 13 { t2 = t2 + 1 }
47 if nx_keysym_to_vk(0xFF1B) == 27 { t2 = t2 + 1 }
48 if nx_keysym_to_vk(0x30) == 48 { t2 = t2 + 1 }
49 if nx_keysym_to_vk(0x39) == 57 { t2 = t2 + 1 }
50 vw("T2 specials+digits: " as *u8); vn(t2); vw("/9\n" as *u8)
51 if t2 == 9 { pass = pass + 1 }
52
53 // T3 unmapped keysyms are 0, never a garbage vk (Shift_L, comma, F1)
54 var t3: i64 = 0
55 if nx_keysym_to_vk(0xFFE1) == 0 { t3 = t3 + 1 }
56 if nx_keysym_to_vk(0x2C) == 0 { t3 = t3 + 1 }
57 if nx_keysym_to_vk(0xFFBE) == 0 { t3 = t3 + 1 }
58 vw("T3 unmapped->0: " as *u8); vn(t3); vw("/3\n" as *u8)
59 if t3 == 3 { pass = pass + 1 }
60
61 // T4 GetKeyboardMapping request bytes exact
62 let req: *u8 = sys_mmap(16)
63 nx_x11_keymap_req(req, 8, 248)
64 var t4: i64 = 0
65 if (req[0] & 0xff) == 101 { t4 = t4 + 1 }
66 if (req[2] & 0xff) == 2 { if (req[3] & 0xff) == 0 { t4 = t4 + 1 } }
67 if (req[4] & 0xff) == 8 { t4 = t4 + 1 }
68 if (req[5] & 0xff) == 248 { t4 = t4 + 1 }
69 vw("T4 keymap request: " as *u8); vn(t4); vw("/4\n" as *u8)
70 if t4 == 4 { pass = pass + 1 }
71
72 // T5 SendEvent(Key) frame: opcode/len/destination/type/detail/same-screen, press vs release
73 let sk: *u8 = sys_mmap(64)
74 let n: i64 = nx_x11_send_key_req(sk, 0x0A0B0C0D, 0x01020304, 40, 1)
75 var t5: i64 = 0
76 if n == 44 { t5 = t5 + 1 }
77 if (sk[0] & 0xff) == 25 { t5 = t5 + 1 }
78 if (sk[2] & 0xff) == 11 { if (sk[3] & 0xff) == 0 { t5 = t5 + 1 } }
79 if (sk[4] & 0xff) == 0x04 { if (sk[7] & 0xff) == 0x01 { t5 = t5 + 1 } }
80 if (sk[12] & 0xff) == 2 { t5 = t5 + 1 } // KeyPress
81 if (sk[13] & 0xff) == 40 { t5 = t5 + 1 } // keycode
82 if (sk[20] & 0xff) == 0x0D { t5 = t5 + 1 } // root LE
83 if (sk[24] & 0xff) == 0x04 { t5 = t5 + 1 } // event window LE
84 if (sk[42] & 0xff) == 1 { t5 = t5 + 1 } // same-screen
85 nx_x11_send_key_req(sk, 0x0A0B0C0D, 0x01020304, 40, 0)
86 if (sk[12] & 0xff) == 3 { t5 = t5 + 1 } // KeyRelease
87 vw("T5 SendEvent frame: " as *u8); vn(t5); vw("/10\n" as *u8)
88 if t5 == 10 { pass = pass + 1 }
89
90 vw("nx_x11_keyboard_gate: " as *u8); vn(pass); vw("/" as *u8); vn(total); vw("\n" as *u8)
91 if pass == total { vw("VERDICT verdict=GREEN -- keysym fold + keyboard wire frames spec-exact\n" as *u8); sys_exit(0) }
92 vw("VERDICT RED\n" as *u8)
93 sys_exit(1)
94 return 0
95}