fix key inputs

This commit is contained in:
Matthew 2025-09-17 03:15:44 +10:00
parent 6757559089
commit 4b4fabcfe5

View File

@ -17,36 +17,124 @@ import core.atomic;
const WINDOW_EDGE_BUFFER = 50; const WINDOW_EDGE_BUFFER = 50;
enum Input enum Input : u32
{ {
None, None,
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,
// Keyboard F1 = 0x150,
a, b, c, d, e, f, g, h, i, j, k, l, m, F2 = 0x151,
n, o, p, q, r, s, t, u, v, w, x, y, z, F3 = 0x152,
A, B, C, D, E, F, G, H, I, J, K, L, M, F4 = 0x153,
N, O, P, Q, R, S, T, U, V, W, X, Y, Z, F5 = 0x154,
Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, F6 = 0x155,
Num0, Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9, F7 = 0x156,
NumLock, NumSlash, NumStar, NumMinus, NumPlus, NumEnter, NumPeriod, F8 = 0x157,
Insert, Delete, Home, End, PageUp, PageDown, F9 = 0x158,
PrintScreen, ScrollLock, Pause, F10 = 0x159,
Comma, Period, BackSlash, Backspace, ForwardSlash, Minus, Plus, F11 = 0x15A,
F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F12 = 0x15B,
Up, Down, Left, Right, PrintScreen = 0x10C,
LeftCtrl, LeftAlt, LeftShift, LeftSuper, ScrollLock = 0x10D,
Tab, CapsLock, Pause = 0x10E,
RightCtrl, RightAlt, RightSuper, RightShift, Insert = 0x10F,
Enter, Space, Home = 0x110,
Tilde, Esc, End = 0x111,
Semicolon, Quote, LeftBrace, RightBrace, 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 // Mouse
MouseMotion, MouseMotion = 0x147,
LeftClick, MiddleClick, RightClick, LeftClick = 0x148, MiddleClick = 0x149, RightClick = 0x14A,
}; };
alias I = Input;
enum Modifier : u32 enum Modifier : u32
{ {
None = 0x00, None = 0x00,
@ -816,20 +904,48 @@ LoadFunction(Library lib, string name)
fn.ptr = dlsym(lib.ptr, name.ptr); fn.ptr = dlsym(lib.ptr, name.ptr);
return fn; 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 Input
ConvertInput(u64 x_key) ConvertInput(u64 x_key)
{ {
switch (x_key) switch (x_key)
{ {
case XK_space: .. case XK_asciitilde:
{
return cast(Input)(x_key);
}
case XK_BackSpace: return Input.Backspace; case XK_BackSpace: return Input.Backspace;
case XK_Return: return Input.Enter; case XK_Return: return Input.Enter;
case XK_Tab: return Input.Tab; case XK_Tab: return Input.Tab;
case XK_Pause: return Input.Pause; case XK_Pause: return Input.Pause;
case XK_Caps_Lock: return Input.CapsLock; case XK_Caps_Lock: return Input.CapsLock;
case XK_Escape: return Input.Esc; case XK_Escape: return Input.Escape;
case XK_space: return Input.Space;
case XK_Prior: return Input.PageUp; case XK_Prior: return Input.PageUp;
case XK_Next: return Input.PageDown; case XK_Next: return Input.PageDown;
case XK_End: return Input.End; case XK_End: return Input.End;
@ -845,17 +961,17 @@ ConvertInput(u64 x_key)
case XK_Super_L: return Input.LeftSuper; case XK_Super_L: return Input.LeftSuper;
case XK_Meta_R: case XK_Meta_R:
case XK_Super_R: return Input.RightSuper; case XK_Super_R: return Input.RightSuper;
case XK_KP_0: return Input.Num0; case XK_KP_0: return Input.NumZero;
case XK_KP_1: return Input.Num1; case XK_KP_1: return Input.NumOne;
case XK_KP_2: return Input.Num2; case XK_KP_2: return Input.NumTwo;
case XK_KP_3: return Input.Num3; case XK_KP_3: return Input.NumThree;
case XK_KP_4: return Input.Num4; case XK_KP_4: return Input.NumFour;
case XK_KP_5: return Input.Num5; case XK_KP_5: return Input.NumFive;
case XK_KP_6: return Input.Num6; case XK_KP_6: return Input.NumSix;
case XK_KP_7: return Input.Num7; case XK_KP_7: return Input.NumSeven;
case XK_KP_8: return Input.Num8; case XK_KP_8: return Input.NumEight;
case XK_KP_9: return Input.Num9; case XK_KP_9: return Input.NumNine;
case XK_multiply: return Input.NumStar; case XK_KP_Multiply: return Input.NumAsterisk;
case XK_KP_Subtract: return Input.NumMinus; case XK_KP_Subtract: return Input.NumMinus;
case XK_KP_Decimal: return Input.NumPeriod; case XK_KP_Decimal: return Input.NumPeriod;
case XK_KP_Divide: return Input.NumSlash; case XK_KP_Divide: return Input.NumSlash;
@ -880,77 +996,6 @@ ConvertInput(u64 x_key)
case XK_Control_R: return Input.RightCtrl; case XK_Control_R: return Input.RightCtrl;
case XK_Alt_L: return Input.LeftAlt; case XK_Alt_L: return Input.LeftAlt;
case XK_Alt_R: return Input.RightAlt; 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; 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 == '`');
}
}
}