From 4b4fabcfe5a5f9610bbdd6012a40d4edfc4e3b66 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 17 Sep 2025 03:15:44 +1000 Subject: [PATCH] fix key inputs --- platform.d | 278 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 170 insertions(+), 108 deletions(-) diff --git a/platform.d b/platform.d index 24948c2..09ca438 100644 --- a/platform.d +++ b/platform.d @@ -17,36 +17,124 @@ import core.atomic; const WINDOW_EDGE_BUFFER = 50; -enum Input +enum Input : u32 { None, - - // Keyboard - a, b, c, d, e, f, g, h, i, j, k, l, m, - n, o, p, q, r, s, t, u, v, w, x, y, z, - A, B, C, D, E, F, G, H, I, J, K, L, M, - N, O, P, Q, R, S, T, U, V, W, X, Y, Z, - Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, - Num0, Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9, - NumLock, NumSlash, NumStar, NumMinus, NumPlus, NumEnter, NumPeriod, - Insert, Delete, Home, End, PageUp, PageDown, - PrintScreen, ScrollLock, Pause, - Comma, Period, BackSlash, Backspace, ForwardSlash, Minus, Plus, - F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, - Up, Down, Left, Right, - LeftCtrl, LeftAlt, LeftShift, LeftSuper, - Tab, CapsLock, - RightCtrl, RightAlt, RightSuper, RightShift, - Enter, Space, - Tilde, Esc, - Semicolon, Quote, LeftBrace, RightBrace, + Backspace = 0x08, + Tab = 0x09, + Enter = 0x0A, + Escape = 0x1B, + Space = 0x20, + Exclamation = 0x21, + DoubleQuote = 0x22, + Hash = 0x23, + Dollar = 0x24, + Percent = 0x25, + Ampersand = 0x26, + SingleQuote = 0x27, + LeftParen = 0x28, + RightParent = 0x29, + Asterisk = 0x2A, + Plus = 0x2B, + Comma = 0x2C, + Minus = 0x2D, + Period = 0x2E, + Slash = 0x2F, + Zero = 0x30, + One = 0x31, + Two = 0x32, + Three = 0x33, + Four = 0x34, + Five = 0x35, + Six = 0x36, + Seven = 0x37, + Eight = 0x38, + Nine = 0x39, + Colon = 0x3A, + Semicolon = 0x3B, + LessThan = 0x3C, + Equals = 0x3D, + GreaterThan = 0x3E, + Question = 0x3F, + At = 0x40, + A = 0x41, B = 0x42, C = 0x43, D = 0x44, E = 0x45, F = 0x46, G = 0x47, H = 0x48, I = 0x49, J = 0x4A, K = 0x4B, L = 0x4C, M = 0x4D, + N = 0x4E, O = 0x4F, P = 0x50, Q = 0x51, R = 0x52, S = 0x53, T = 0x54, U = 0x55, V = 0x56, W = 0x57, X = 0x58, Y = 0x59, Z = 0x5A, + LeftBracket = 0x5B, + BackSlash = 0x5C, + RightBracket = 0x5D, + Caret = 0x5E, + Underscore = 0x5F, + Grave = 0x60, + a = I.A+32, b = I.B+32, c = I.C+32, d = I.D+32, e = I.E+32, f = I.F+32, g = I.G+32, h = I.H+32, i = I.I+32, j = I.J+32, k = I.K+32, l = I.L+32, m = I.M+32, + n = I.N+32, o = I.O+32, p = I.P+32, q = I.Q+32, r = I.R+32, s = I.S+32, t = I.T+32, u = I.U+32, v = I.V+32, w = I.W+32, x = I.X+32, y = I.Y+32, z = I.Z+32, + LeftBrace = 0x7B, + VerticalBar = 0x7C, + RightBrace = 0x7D, + Tilde = 0x7E, + Delete = 0x7F, + + F1 = 0x150, + F2 = 0x151, + F3 = 0x152, + F4 = 0x153, + F5 = 0x154, + F6 = 0x155, + F7 = 0x156, + F8 = 0x157, + F9 = 0x158, + F10 = 0x159, + F11 = 0x15A, + F12 = 0x15B, + PrintScreen = 0x10C, + ScrollLock = 0x10D, + Pause = 0x10E, + Insert = 0x10F, + Home = 0x110, + End = 0x111, + PageUp = 0x112, + PageDown = 0x113, + NumLock = 0x114, + + NumEnter = 0x10A, + NumAsterisk = 0x12A, + NumPlus = 0x12B, + NumMinus = 0x12D, + NumPeriod = 0x12E, + NumSlash = 0x12F, + NumZero = 0x130, + NumOne = 0x131, + NumTwo = 0x132, + NumThree = 0x133, + NumFour = 0x134, + NumFive = 0x135, + NumSix = 0x136, + NumSeven = 0x137, + NumEight = 0x138, + NumNine = 0x139, + + LeftCtrl = 0x13A, + RightCtrl = 0x13B, + LeftShift = 0x13C, + RightShift = 0x13D, + LeftSuper = 0x13E, + RightSuper = 0x13F, + LeftAlt = 0x140, + RightAlt = 0x141, + CapsLock = 0x142, + + Left = 0x143, + Right = 0x144, + Up = 0x145, + Down = 0x146, // Mouse - MouseMotion, + MouseMotion = 0x147, - LeftClick, MiddleClick, RightClick, + LeftClick = 0x148, MiddleClick = 0x149, RightClick = 0x14A, }; +alias I = Input; + enum Modifier : u32 { None = 0x00, @@ -816,20 +904,48 @@ LoadFunction(Library lib, string name) fn.ptr = dlsym(lib.ptr, name.ptr); return fn; -}; +} + +u8 +InputToChar(Input input) +{ + switch(input) + { + case Input.Tab: + case Input.Enter: + case Input.Space: .. case Input.Tilde: + { + return cast(u8)(input); + } + case Input.NumEnter: + case Input.NumAsterisk: + case Input.NumPlus: + case Input.NumMinus: + case Input.NumPeriod: + case Input.NumSlash: + case Input.NumZero: .. case Input.NumNine: + { + return cast(u8)(input & 0xFF); + } + default: return 0; + } +} Input ConvertInput(u64 x_key) { switch (x_key) { + case XK_space: .. case XK_asciitilde: + { + return cast(Input)(x_key); + } case XK_BackSpace: return Input.Backspace; case XK_Return: return Input.Enter; case XK_Tab: return Input.Tab; case XK_Pause: return Input.Pause; case XK_Caps_Lock: return Input.CapsLock; - case XK_Escape: return Input.Esc; - case XK_space: return Input.Space; + case XK_Escape: return Input.Escape; case XK_Prior: return Input.PageUp; case XK_Next: return Input.PageDown; case XK_End: return Input.End; @@ -845,17 +961,17 @@ ConvertInput(u64 x_key) case XK_Super_L: return Input.LeftSuper; case XK_Meta_R: case XK_Super_R: return Input.RightSuper; - case XK_KP_0: return Input.Num0; - case XK_KP_1: return Input.Num1; - case XK_KP_2: return Input.Num2; - case XK_KP_3: return Input.Num3; - case XK_KP_4: return Input.Num4; - case XK_KP_5: return Input.Num5; - case XK_KP_6: return Input.Num6; - case XK_KP_7: return Input.Num7; - case XK_KP_8: return Input.Num8; - case XK_KP_9: return Input.Num9; - case XK_multiply: return Input.NumStar; + case XK_KP_0: return Input.NumZero; + case XK_KP_1: return Input.NumOne; + case XK_KP_2: return Input.NumTwo; + case XK_KP_3: return Input.NumThree; + case XK_KP_4: return Input.NumFour; + case XK_KP_5: return Input.NumFive; + case XK_KP_6: return Input.NumSix; + case XK_KP_7: return Input.NumSeven; + case XK_KP_8: return Input.NumEight; + case XK_KP_9: return Input.NumNine; + case XK_KP_Multiply: return Input.NumAsterisk; case XK_KP_Subtract: return Input.NumMinus; case XK_KP_Decimal: return Input.NumPeriod; case XK_KP_Divide: return Input.NumSlash; @@ -880,77 +996,6 @@ ConvertInput(u64 x_key) case XK_Control_R: return Input.RightCtrl; case XK_Alt_L: return Input.LeftAlt; case XK_Alt_R: return Input.RightAlt; - case XK_semicolon: return Input.Semicolon; - case XK_bracketleft: return Input.LeftBrace; - case XK_bracketright: return Input.RightBrace; - case XK_plus: return Input.Plus; - case XK_comma: return Input.Comma; - case XK_minus: return Input.Minus; - case XK_backslash: return Input.BackSlash; - case XK_slash: return Input.ForwardSlash; - case XK_grave: return Input.Tilde; - case XK_0: return Input.Zero; - case XK_1: return Input.One; - case XK_2: return Input.Two; - case XK_3: return Input.Three; - case XK_4: return Input.Four; - case XK_5: return Input.Five; - case XK_6: return Input.Six; - case XK_7: return Input.Seven; - case XK_8: return Input.Eight; - case XK_9: return Input.Nine; - case XK_a: return Input.a; - case XK_A: return Input.A; - case XK_b: return Input.b; - case XK_B: return Input.B; - case XK_c: return Input.c; - case XK_C: return Input.C; - case XK_d: return Input.d; - case XK_D: return Input.D; - case XK_e: return Input.e; - case XK_E: return Input.E; - case XK_f: return Input.f; - case XK_F: return Input.F; - case XK_g: return Input.g; - case XK_G: return Input.G; - case XK_h: return Input.h; - case XK_H: return Input.H; - case XK_i: return Input.i; - case XK_I: return Input.I; - case XK_j: return Input.j; - case XK_J: return Input.J; - case XK_k: return Input.k; - case XK_K: return Input.K; - case XK_l: return Input.l; - case XK_L: return Input.L; - case XK_m: return Input.m; - case XK_M: return Input.M; - case XK_n: return Input.n; - case XK_N: return Input.N; - case XK_o: return Input.o; - case XK_O: return Input.O; - case XK_p: return Input.p; - case XK_P: return Input.P; - case XK_q: return Input.q; - case XK_Q: return Input.Q; - case XK_r: return Input.r; - case XK_R: return Input.R; - case XK_s: return Input.s; - case XK_S: return Input.S; - case XK_t: return Input.t; - case XK_T: return Input.T; - case XK_u: return Input.u; - case XK_U: return Input.U; - case XK_v: return Input.v; - case XK_V: return Input.V; - case XK_w: return Input.w; - case XK_W: return Input.W; - case XK_x: return Input.x; - case XK_X: return Input.X; - case XK_y: return Input.y; - case XK_Y: return Input.Y; - case XK_z: return Input.z; - case XK_Z: return Input.Z; default: return Input.None; } } @@ -1293,3 +1338,20 @@ Kill() } +unittest +{ + { // Keys + u8 ch = InputToChar(Input.NumEight); + assert(ch == '8'); + ch = InputToChar(Input.B); + assert(ch == 'B'); + + version(linux) + { + ch = InputToChar(ConvertInput(XK_asciitilde)); + assert(ch == '~'); + ch = InputToChar(ConvertInput(XK_grave)); + assert(ch == '`'); + } + } +}