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;
enum Input
enum Input : u32
{
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
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,
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 == '`');
}
}
}