1
0
Fork 0

feat: implement new keyboard system

This commit is contained in:
LordMZTE 2024-01-18 20:30:45 +01:00
parent 46431dbe65
commit 7da2841ec7
Signed by: LordMZTE
GPG key ID: B64802DC33A64FF6
3 changed files with 434 additions and 253 deletions

View file

@ -10,8 +10,8 @@
.dependencies = .{
.zenolith = .{
//.path = "../zenolith",
.url = "git+https://git.mzte.de/zenolith/zenolith.git#6292688915f91da3ace4f38caa1dc33c718c8fc0",
.hash = "1220b709a856fe648fd5be6351b319d3626b3e368062d301e666a969032121b5ecde",
.url = "git+https://git.mzte.de/zenolith/zenolith.git#ad388687cd205079aab75074a542eadc79490df7",
.hash = "12201677a81b6f8133bbe9c7d3b2afc07b61bf632a070d13d57f995827022f6a1f54",
},
},
}

View file

@ -118,102 +118,124 @@ pub fn run(
var last_time = std.time.nanoTimestamp();
while (true) {
var ev: c.SDL_Event = undefined;
c.SDL_PumpEvents();
if (c.SDL_WaitEvent(&ev) != 1) return error.GetEvents;
// Wait until events are available.
if (c.SDL_WaitEvent(null) != 1) return error.GetEvents;
switch (ev.type) {
// quit event - exit
c.SDL_QUIT => return,
// Get all pending events.
var ev_buf: [64]c.SDL_Event = undefined;
const peep_ret = c.SDL_PeepEvents(
&ev_buf,
ev_buf.len,
c.SDL_GETEVENT,
c.SDL_FIRSTEVENT,
c.SDL_LASTEVENT,
);
if (peep_ret < 0) return error.GetEvents;
c.SDL_WINDOWEVENT => switch (ev.window.event) {
// window resized - redo tree layout
c.SDL_WINDOWEVENT_RESIZED => {
const size = zenolith.layout.Size{
.width = @intCast(ev.window.data1),
.height = @intCast(ev.window.data2),
log.debug("got {} events", .{peep_ret});
const events = ev_buf[0..@intCast(peep_ret)];
// This code is responsible for building one KeyInput event out of consecutive
// SDL_KEYUP, SDL_KEYDOWN and SDL_TEXTINPUT events.
var text_input_buf: [1024]u8 = undefined;
var text_input_fbs = std.io.fixedBufferStream(&text_input_buf);
var cur_key_event = zenolith.treevent.KeyInput{
.action = .press,
.key = null,
};
for (events) |ev| {
switch (ev.type) {
// quit event - exit
c.SDL_QUIT => return,
c.SDL_WINDOWEVENT => switch (ev.window.event) {
// window resized - redo tree layout
c.SDL_WINDOWEVENT_RESIZED => {
const size = zenolith.layout.Size{
.width = @intCast(ev.window.data1),
.height = @intCast(ev.window.data2),
};
try zenolith.treevent.fire(root, zenolith.treevent.LayoutSize{
.final = true,
.constraints = .{
.min = .{ .width = 0, .height = 0 },
.max = size,
},
});
try zenolith.treevent.fire(root, zenolith.treevent.LayoutPosition{
.position = .{ .x = 0, .y = 0 },
});
},
else => {},
},
c.SDL_MOUSEMOTION => {
const mouse_pos = zenolith.layout.Position{
.x = @intCast(ev.motion.x),
.y = @intCast(ev.motion.y),
};
self.mouse_pos = mouse_pos;
try zenolith.treevent.fire(root, zenolith.treevent.LayoutSize{
.final = true,
.constraints = .{
.min = .{ .width = 0, .height = 0 },
.max = size,
},
});
try zenolith.treevent.fire(root, zenolith.treevent.LayoutPosition{
.position = .{ .x = 0, .y = 0 },
try zenolith.treevent.fire(root, zenolith.treevent.MouseMove{
.pos = mouse_pos,
.dx = ev.motion.xrel,
.dy = ev.motion.yrel,
});
},
else => {},
},
c.SDL_MOUSEMOTION => {
const mouse_pos = zenolith.layout.Position{
.x = @intCast(ev.motion.x),
.y = @intCast(ev.motion.y),
};
self.mouse_pos = mouse_pos;
c.SDL_MOUSEBUTTONDOWN, c.SDL_MOUSEBUTTONUP => {
const button: ?zenolith.treevent.Click.MouseButton = switch (ev.button.button) {
c.SDL_BUTTON_LEFT => .left,
c.SDL_BUTTON_MIDDLE => .middle,
c.SDL_BUTTON_RIGHT => .right,
else => null,
};
try zenolith.treevent.fire(root, zenolith.treevent.MouseMove{
.pos = mouse_pos,
.dx = ev.motion.xrel,
.dy = ev.motion.yrel,
});
},
const actions: []const zenolith.treevent.Click.Action = switch (ev.type) {
c.SDL_MOUSEBUTTONDOWN => &.{ .down, .click },
c.SDL_MOUSEBUTTONUP => &.{.up},
else => unreachable,
};
c.SDL_MOUSEBUTTONDOWN, c.SDL_MOUSEBUTTONUP => {
const button: ?zenolith.treevent.Click.MouseButton = switch (ev.button.button) {
c.SDL_BUTTON_LEFT => .left,
c.SDL_BUTTON_MIDDLE => .middle,
c.SDL_BUTTON_RIGHT => .right,
else => null,
};
const actions: []const zenolith.treevent.Click.Action = switch (ev.type) {
c.SDL_MOUSEBUTTONDOWN => &.{ .down, .click },
c.SDL_MOUSEBUTTONUP => &.{.up},
else => unreachable,
};
if (button) |but| {
for (actions) |act| {
try zenolith.treevent.fire(root, zenolith.treevent.Click{
.pos = .{
.x = @intCast(ev.button.x),
.y = @intCast(ev.button.y),
},
.button = but,
.action = act,
});
if (button) |but| {
for (actions) |act| {
try zenolith.treevent.fire(root, zenolith.treevent.Click{
.pos = .{
.x = @intCast(ev.button.x),
.y = @intCast(ev.button.y),
},
.button = but,
.action = act,
});
}
}
}
},
},
c.SDL_MOUSEWHEEL => if (self.mouse_pos) |mp| {
const btn: zenolith.treevent.Click.MouseButton = if (ev.wheel.y > 0)
.scroll_up
else if (ev.wheel.y < 0)
.scroll_down
else if (ev.wheel.x > 0)
.scroll_right
else if (ev.wheel.x < 0)
.scroll_left
else
unreachable;
c.SDL_MOUSEWHEEL => if (self.mouse_pos) |mp| {
const btn: zenolith.treevent.Click.MouseButton = if (ev.wheel.y > 0)
.scroll_up
else if (ev.wheel.y < 0)
.scroll_down
else if (ev.wheel.x > 0)
.scroll_right
else if (ev.wheel.x < 0)
.scroll_left
else
unreachable;
try zenolith.treevent.fire(root, zenolith.treevent.Click{
.pos = mp,
.button = btn,
.action = .click,
});
},
try zenolith.treevent.fire(root, zenolith.treevent.Click{
.pos = mp,
.button = btn,
.action = .click,
});
},
c.SDL_KEYDOWN, c.SDL_KEYUP => {
if (util.convertScancode(ev.key.keysym.scancode)) |sc| {
c.SDL_KEYDOWN, c.SDL_KEYUP => {
const m = ev.key.keysym.mod;
const mods = zenolith.key.Modifiers{
.shift = m & c.KMOD_SHIFT != 0,
.ctrl = m & c.KMOD_CTRL != 0,
@ -222,50 +244,60 @@ pub fn run(
.mode = m & c.KMOD_MODE != 0,
};
const key = util.convertKey(ev.key.keysym.sym);
const phys = util.convertScancode(ev.key.keysym.scancode);
switch (ev.type) {
c.SDL_KEYUP => {
try zenolith.treevent.fire(root, zenolith.treevent.KeyPress{
.scancode = sc,
.modifiers = mods,
.action = .up,
});
},
c.SDL_KEYDOWN => {
// We know there's a text input or key press event that hasn't been fired yet,
// separate from this one if there's either a key set or text written to the input buffer.
if (cur_key_event.key != null or text_input_fbs.pos != 0) {
cur_key_event.text = text_input_fbs.getWritten();
try zenolith.treevent.fire(root, cur_key_event);
text_input_fbs.reset();
}
if (ev.key.repeat == 0) {
try zenolith.treevent.fire(root, zenolith.treevent.KeyPress{
.scancode = sc,
.modifiers = mods,
try zenolith.treevent.fire(root, zenolith.treevent.KeyInput{
.action = .down,
.key = key,
.physical = phys,
.modifiers = mods,
});
}
try zenolith.treevent.fire(root, zenolith.treevent.KeyPress{
.scancode = sc,
.modifiers = mods,
cur_key_event = .{
.action = .press,
.key = key,
.physical = phys,
.modifiers = mods,
.repeat = ev.key.repeat != 0,
};
},
c.SDL_KEYUP => {
try zenolith.treevent.fire(root, zenolith.treevent.KeyInput{
.action = .up,
.key = key,
.physical = phys,
.modifiers = mods,
});
},
else => unreachable,
}
} else {
log.warn("Got key event with unknown scancode: {}", .{ev.key.keysym});
}
},
},
c.SDL_TEXTINPUT => {
var iter = std.unicode.Utf8Iterator{
.bytes = std.mem.sliceTo(&ev.text.text, 0),
.i = 0,
};
c.SDL_TEXTINPUT => {
try text_input_fbs.writer().writeAll(std.mem.sliceTo(&ev.text.text, 0));
},
while (iter.nextCodepoint()) |codepoint| {
try zenolith.treevent.fire(root, zenolith.treevent.CharType{
.codepoint = codepoint,
});
}
},
else => {},
}
}
else => {},
// Fire the text input treevent when applicable
if (cur_key_event.key != null or text_input_fbs.pos != 0) {
cur_key_event.text = text_input_fbs.getWritten();
try zenolith.treevent.fire(root, cur_key_event);
}
// do render pass after events

View file

@ -11,7 +11,207 @@ pub fn toSdlRect(rect: zenolith.layout.Rectangle) c.SDL_Rect {
};
}
pub fn convertScancode(sdl: c.SDL_Scancode) ?zenolith.key.Scancode {
pub fn convertKey(sdl: c.SDL_Keycode) ?zenolith.key.Keycode {
return switch (sdl) {
c.SDLK_RETURN => .enter,
c.SDLK_ESCAPE => .escape,
c.SDLK_BACKSPACE => .backspace,
c.SDLK_TAB => .tab,
c.SDLK_SPACE => .space,
c.SDLK_EXCLAIM => .exclaim,
c.SDLK_QUOTEDBL => .double_quote,
c.SDLK_HASH => .hash,
c.SDLK_PERCENT => .percent,
c.SDLK_DOLLAR => .dollar,
c.SDLK_AMPERSAND => .ampersand,
c.SDLK_QUOTE => .quote,
c.SDLK_LEFTPAREN => .paren_left,
c.SDLK_RIGHTPAREN => .paren_right,
c.SDLK_ASTERISK => .asterisk,
c.SDLK_PLUS => .plus,
c.SDLK_COMMA => .comma,
c.SDLK_MINUS => .minus,
c.SDLK_PERIOD => .period,
c.SDLK_SLASH => .slash,
c.SDLK_0 => .@"0",
c.SDLK_1 => .@"1",
c.SDLK_2 => .@"2",
c.SDLK_3 => .@"3",
c.SDLK_4 => .@"4",
c.SDLK_5 => .@"5",
c.SDLK_6 => .@"6",
c.SDLK_7 => .@"7",
c.SDLK_8 => .@"8",
c.SDLK_9 => .@"9",
c.SDLK_COLON => .colon,
c.SDLK_SEMICOLON => .semicolon,
c.SDLK_LESS => .less,
c.SDLK_EQUALS => .equal,
c.SDLK_GREATER => .greater,
c.SDLK_QUESTION => .question,
c.SDLK_AT => .at,
c.SDLK_LEFTBRACKET => .bracket_left,
c.SDLK_BACKSLASH => .backslash,
c.SDLK_RIGHTBRACKET => .bracket_right,
c.SDLK_CARET => .caret,
c.SDLK_UNDERSCORE => .underscore,
c.SDLK_BACKQUOTE => .backquote,
c.SDLK_a => .a,
c.SDLK_b => .b,
c.SDLK_c => .c,
c.SDLK_d => .d,
c.SDLK_e => .e,
c.SDLK_f => .f,
c.SDLK_g => .g,
c.SDLK_h => .h,
c.SDLK_i => .i,
c.SDLK_j => .j,
c.SDLK_k => .k,
c.SDLK_l => .l,
c.SDLK_m => .m,
c.SDLK_n => .n,
c.SDLK_o => .o,
c.SDLK_p => .p,
c.SDLK_q => .q,
c.SDLK_r => .r,
c.SDLK_s => .s,
c.SDLK_t => .t,
c.SDLK_u => .u,
c.SDLK_v => .v,
c.SDLK_w => .w,
c.SDLK_x => .x,
c.SDLK_y => .y,
c.SDLK_z => .z,
c.SDLK_CAPSLOCK => .caps_lock,
c.SDLK_F1 => .f1,
c.SDLK_F2 => .f2,
c.SDLK_F3 => .f3,
c.SDLK_F4 => .f4,
c.SDLK_F5 => .f5,
c.SDLK_F6 => .f6,
c.SDLK_F7 => .f7,
c.SDLK_F8 => .f8,
c.SDLK_F9 => .f9,
c.SDLK_F10 => .f10,
c.SDLK_F11 => .f11,
c.SDLK_F12 => .f12,
c.SDLK_F13 => .f13,
c.SDLK_F14 => .f14,
c.SDLK_F15 => .f15,
c.SDLK_F16 => .f16,
c.SDLK_F17 => .f17,
c.SDLK_F18 => .f18,
c.SDLK_F19 => .f19,
c.SDLK_F20 => .f20,
c.SDLK_F21 => .f21,
c.SDLK_F22 => .f22,
c.SDLK_F23 => .f23,
c.SDLK_F24 => .f24,
c.SDLK_PRINTSCREEN, c.SDLK_SYSREQ => .sysrq,
c.SDLK_SCROLLLOCK => .scroll_lock,
c.SDLK_PAUSE => .pause,
c.SDLK_INSERT => .insert,
c.SDLK_HOME => .home,
c.SDLK_PAGEUP => .page_up,
c.SDLK_DELETE => .delete,
c.SDLK_END => .end,
c.SDLK_PAGEDOWN => .page_down,
c.SDLK_RIGHT => .arrow_right,
c.SDLK_LEFT => .arrow_left,
c.SDLK_DOWN => .arrow_down,
c.SDLK_UP => .arrow_up,
c.SDLK_NUMLOCKCLEAR => .num_lock,
c.SDLK_KP_DIVIDE => .numpad_divide,
c.SDLK_KP_MULTIPLY => .numpad_multiply,
c.SDLK_KP_MINUS => .numpad_subtract,
c.SDLK_KP_PLUS => .numpad_add,
c.SDLK_KP_ENTER => .numpad_enter,
c.SDLK_KP_1 => .numpad_1,
c.SDLK_KP_2 => .numpad_2,
c.SDLK_KP_3 => .numpad_3,
c.SDLK_KP_4 => .numpad_4,
c.SDLK_KP_5 => .numpad_5,
c.SDLK_KP_6 => .numpad_6,
c.SDLK_KP_7 => .numpad_7,
c.SDLK_KP_8 => .numpad_8,
c.SDLK_KP_9 => .numpad_9,
c.SDLK_KP_0 => .numpad_0,
c.SDLK_KP_PERIOD => .numpad_decimal,
c.SDLK_APPLICATION => .compose,
c.SDLK_POWER => .power,
c.SDLK_KP_EQUALS => .numpad_equal,
c.SDLK_EXECUTE => .open,
c.SDLK_HELP => .help,
c.SDLK_SELECT => .select,
c.SDLK_STOP => .stop,
c.SDLK_AGAIN => .again,
c.SDLK_UNDO => .undo,
c.SDLK_CUT => .cut,
c.SDLK_COPY => .copy,
c.SDLK_PASTE => .paste,
c.SDLK_FIND => .find,
c.SDLK_MUTE => .mic_mute_toggle,
c.SDLK_VOLUMEUP => .volume_up,
c.SDLK_VOLUMEDOWN => .volume_down,
c.SDLK_KP_COMMA => .numpad_comma,
c.SDLK_CANCEL => .abort,
c.SDLK_CLEAR => .delete,
c.SDLK_RETURN2 => .enter,
c.SDLK_KP_LEFTPAREN => .numpad_paren_left,
c.SDLK_KP_RIGHTPAREN => .numpad_paren_right,
c.SDLK_LCTRL => .ctrl_left,
c.SDLK_LSHIFT => .shift_left,
c.SDLK_LALT => .alt_left,
c.SDLK_LGUI => .meta_left,
c.SDLK_RCTRL => .ctrl_right,
c.SDLK_RSHIFT => .shift_right,
c.SDLK_RALT => .alt_right,
c.SDLK_RGUI => .meta_right,
c.SDLK_MODE => .mode,
c.SDLK_AUDIONEXT => .media_track_next,
c.SDLK_AUDIOPREV => .media_track_prev,
c.SDLK_AUDIOSTOP => .media_stop,
c.SDLK_AUDIOPLAY => .media_play,
c.SDLK_AUDIOMUTE => .volume_mute,
c.SDLK_AUDIOREWIND => .media_rewind,
c.SDLK_AUDIOFASTFORWARD => .media_fast_forward,
c.SDLK_MEDIASELECT => .media_select,
c.SDLK_WWW => .launch_browser,
c.SDLK_MAIL => .launch_mail,
c.SDLK_CALCULATOR, c.SDLK_APP2 => .launch_calculator,
c.SDLK_COMPUTER, c.SDLK_APP1 => .launch_explorer,
c.SDLK_AC_SEARCH => .browser_search,
c.SDLK_AC_HOME => .browser_home,
c.SDLK_AC_BACK => .browser_back,
c.SDLK_AC_FORWARD => .browser_forward,
c.SDLK_AC_STOP => .browser_stop,
c.SDLK_AC_REFRESH => .browser_refresh,
c.SDLK_AC_BOOKMARKS => .browser_bookmarks,
c.SDLK_BRIGHTNESSDOWN => .brightness_down,
c.SDLK_BRIGHTNESSUP => .brightness_up,
c.SDLK_DISPLAYSWITCH => .display_toggle_int_ext,
c.SDLK_KBDILLUMTOGGLE => .kbd_backlight_toggle,
c.SDLK_KBDILLUMDOWN => .kbd_backlight_down,
c.SDLK_KBDILLUMUP => .kbd_backlight_up,
c.SDLK_EJECT => .eject,
c.SDLK_SLEEP => .sleep,
else => null,
};
}
pub fn convertScancode(sdl: c.SDL_Scancode) ?zenolith.key.Keycode {
return switch (sdl) {
c.SDL_SCANCODE_A => .a,
c.SDL_SCANCODE_B => .b,
@ -49,24 +249,24 @@ pub fn convertScancode(sdl: c.SDL_Scancode) ?zenolith.key.Scancode {
c.SDL_SCANCODE_8 => .@"8",
c.SDL_SCANCODE_9 => .@"9",
c.SDL_SCANCODE_0 => .@"0",
c.SDL_SCANCODE_RETURN => .@"return",
c.SDL_SCANCODE_RETURN => .enter,
c.SDL_SCANCODE_ESCAPE => .escape,
c.SDL_SCANCODE_BACKSPACE => .backspace,
c.SDL_SCANCODE_TAB => .tab,
c.SDL_SCANCODE_SPACE => .space,
c.SDL_SCANCODE_MINUS => .minus,
c.SDL_SCANCODE_EQUALS => .equals,
c.SDL_SCANCODE_LEFTBRACKET => .leftbracket,
c.SDL_SCANCODE_RIGHTBRACKET => .rightbracket,
c.SDL_SCANCODE_EQUALS => .equal,
c.SDL_SCANCODE_LEFTBRACKET => .bracket_left,
c.SDL_SCANCODE_RIGHTBRACKET => .bracket_right,
c.SDL_SCANCODE_BACKSLASH => .backslash,
c.SDL_SCANCODE_NONUSHASH => .nonushash,
c.SDL_SCANCODE_NONUSHASH => .intl_hash,
c.SDL_SCANCODE_SEMICOLON => .semicolon,
c.SDL_SCANCODE_APOSTROPHE => .apostrophe,
c.SDL_SCANCODE_GRAVE => .grave,
c.SDL_SCANCODE_APOSTROPHE => .quote,
c.SDL_SCANCODE_GRAVE => .backquote,
c.SDL_SCANCODE_COMMA => .comma,
c.SDL_SCANCODE_PERIOD => .period,
c.SDL_SCANCODE_SLASH => .slash,
c.SDL_SCANCODE_CAPSLOCK => .capslock,
c.SDL_SCANCODE_CAPSLOCK => .caps_lock,
c.SDL_SCANCODE_F1 => .f1,
c.SDL_SCANCODE_F2 => .f2,
c.SDL_SCANCODE_F3 => .f3,
@ -79,40 +279,40 @@ pub fn convertScancode(sdl: c.SDL_Scancode) ?zenolith.key.Scancode {
c.SDL_SCANCODE_F10 => .f10,
c.SDL_SCANCODE_F11 => .f11,
c.SDL_SCANCODE_F12 => .f12,
c.SDL_SCANCODE_PRINTSCREEN => .printscreen,
c.SDL_SCANCODE_SCROLLLOCK => .scrolllock,
c.SDL_SCANCODE_PRINTSCREEN, c.SDL_SCANCODE_SYSREQ => .sysrq,
c.SDL_SCANCODE_SCROLLLOCK => .scroll_lock,
c.SDL_SCANCODE_PAUSE => .pause,
c.SDL_SCANCODE_INSERT => .insert,
c.SDL_SCANCODE_HOME => .home,
c.SDL_SCANCODE_PAGEUP => .pageup,
c.SDL_SCANCODE_PAGEUP => .page_up,
c.SDL_SCANCODE_DELETE => .delete,
c.SDL_SCANCODE_END => .end,
c.SDL_SCANCODE_PAGEDOWN => .pagedown,
c.SDL_SCANCODE_RIGHT => .right,
c.SDL_SCANCODE_LEFT => .left,
c.SDL_SCANCODE_DOWN => .down,
c.SDL_SCANCODE_UP => .up,
c.SDL_SCANCODE_NUMLOCKCLEAR => .numlockclear,
c.SDL_SCANCODE_KP_DIVIDE => .kp_divide,
c.SDL_SCANCODE_KP_MULTIPLY => .kp_multiply,
c.SDL_SCANCODE_KP_MINUS => .kp_minus,
c.SDL_SCANCODE_KP_PLUS => .kp_plus,
c.SDL_SCANCODE_KP_ENTER => .kp_enter,
c.SDL_SCANCODE_KP_1 => .kp_1,
c.SDL_SCANCODE_KP_2 => .kp_2,
c.SDL_SCANCODE_KP_3 => .kp_3,
c.SDL_SCANCODE_KP_4 => .kp_4,
c.SDL_SCANCODE_KP_5 => .kp_5,
c.SDL_SCANCODE_KP_6 => .kp_6,
c.SDL_SCANCODE_KP_7 => .kp_7,
c.SDL_SCANCODE_KP_8 => .kp_8,
c.SDL_SCANCODE_KP_9 => .kp_9,
c.SDL_SCANCODE_KP_0 => .kp_0,
c.SDL_SCANCODE_KP_PERIOD => .kp_period,
c.SDL_SCANCODE_NONUSBACKSLASH => .nonusbackslash,
c.SDL_SCANCODE_APPLICATION => .application,
c.SDL_SCANCODE_PAGEDOWN => .page_down,
c.SDL_SCANCODE_RIGHT => .arrow_right,
c.SDL_SCANCODE_LEFT => .arrow_left,
c.SDL_SCANCODE_DOWN => .arrow_down,
c.SDL_SCANCODE_UP => .arrow_up,
c.SDL_SCANCODE_NUMLOCKCLEAR => .num_lock,
c.SDL_SCANCODE_KP_DIVIDE => .numpad_divide,
c.SDL_SCANCODE_KP_MULTIPLY => .numpad_multiply,
c.SDL_SCANCODE_KP_MINUS => .numpad_subtract,
c.SDL_SCANCODE_KP_PLUS => .numpad_add,
c.SDL_SCANCODE_KP_ENTER => .numpad_enter,
c.SDL_SCANCODE_KP_1 => .numpad_1,
c.SDL_SCANCODE_KP_2 => .numpad_2,
c.SDL_SCANCODE_KP_3 => .numpad_3,
c.SDL_SCANCODE_KP_4 => .numpad_4,
c.SDL_SCANCODE_KP_5 => .numpad_5,
c.SDL_SCANCODE_KP_6 => .numpad_6,
c.SDL_SCANCODE_KP_7 => .numpad_7,
c.SDL_SCANCODE_KP_8 => .numpad_8,
c.SDL_SCANCODE_KP_9 => .numpad_9,
c.SDL_SCANCODE_KP_0 => .numpad_0,
c.SDL_SCANCODE_KP_PERIOD => .numpad_decimal,
c.SDL_SCANCODE_NONUSBACKSLASH => .intl_backslash,
c.SDL_SCANCODE_APPLICATION => .compose,
c.SDL_SCANCODE_POWER => .power,
c.SDL_SCANCODE_KP_EQUALS => .kp_equals,
c.SDL_SCANCODE_KP_EQUALS => .numpad_equal,
c.SDL_SCANCODE_F13 => .f13,
c.SDL_SCANCODE_F14 => .f14,
c.SDL_SCANCODE_F15 => .f15,
@ -125,9 +325,11 @@ pub fn convertScancode(sdl: c.SDL_Scancode) ?zenolith.key.Scancode {
c.SDL_SCANCODE_F22 => .f22,
c.SDL_SCANCODE_F23 => .f23,
c.SDL_SCANCODE_F24 => .f24,
c.SDL_SCANCODE_EXECUTE => .execute,
c.SDL_SCANCODE_EXECUTE => .open,
c.SDL_SCANCODE_HELP => .help,
c.SDL_SCANCODE_MENU => .menu,
// Can't find any information on where this key even exists.
// Do not confuse with the compose key (next to right alt)
//c.SDL_SCANCODE_MENU => ?,
c.SDL_SCANCODE_SELECT => .select,
c.SDL_SCANCODE_STOP => .stop,
c.SDL_SCANCODE_AGAIN => .again,
@ -136,11 +338,12 @@ pub fn convertScancode(sdl: c.SDL_Scancode) ?zenolith.key.Scancode {
c.SDL_SCANCODE_COPY => .copy,
c.SDL_SCANCODE_PASTE => .paste,
c.SDL_SCANCODE_FIND => .find,
c.SDL_SCANCODE_MUTE => .mute,
c.SDL_SCANCODE_VOLUMEUP => .volumeup,
c.SDL_SCANCODE_VOLUMEDOWN => .volumedown,
c.SDL_SCANCODE_KP_COMMA => .kp_comma,
c.SDL_SCANCODE_KP_EQUALSAS400 => .kp_equalsas400,
c.SDL_SCANCODE_MUTE => .mic_mute_toggle,
c.SDL_SCANCODE_VOLUMEUP => .volume_up,
c.SDL_SCANCODE_VOLUMEDOWN => .volume_down,
c.SDL_SCANCODE_KP_COMMA => .numpad_comma,
// Equals sign on some obscure IBM hardware that has literally no reason to be a different keycode.
c.SDL_SCANCODE_KP_EQUALSAS400 => .numpad_equal,
c.SDL_SCANCODE_INTERNATIONAL1 => .international1,
c.SDL_SCANCODE_INTERNATIONAL2 => .international2,
c.SDL_SCANCODE_INTERNATIONAL3 => .international3,
@ -159,106 +362,52 @@ pub fn convertScancode(sdl: c.SDL_Scancode) ?zenolith.key.Scancode {
c.SDL_SCANCODE_LANG7 => .lang7,
c.SDL_SCANCODE_LANG8 => .lang8,
c.SDL_SCANCODE_LANG9 => .lang9,
c.SDL_SCANCODE_ALTERASE => .alterase,
c.SDL_SCANCODE_SYSREQ => .sysreq,
c.SDL_SCANCODE_CANCEL => .cancel,
c.SDL_SCANCODE_CLEAR => .clear,
c.SDL_SCANCODE_PRIOR => .prior,
c.SDL_SCANCODE_RETURN2 => .return2,
c.SDL_SCANCODE_SEPARATOR => .separator,
c.SDL_SCANCODE_OUT => .out,
c.SDL_SCANCODE_OPER => .oper,
c.SDL_SCANCODE_CLEARAGAIN => .clearagain,
c.SDL_SCANCODE_CRSEL => .crsel,
c.SDL_SCANCODE_EXSEL => .exsel,
c.SDL_SCANCODE_KP_00 => .kp_00,
c.SDL_SCANCODE_KP_000 => .kp_000,
c.SDL_SCANCODE_THOUSANDSSEPARATOR => .thousandsseparator,
c.SDL_SCANCODE_DECIMALSEPARATOR => .decimalseparator,
c.SDL_SCANCODE_CURRENCYUNIT => .currencyunit,
c.SDL_SCANCODE_CURRENCYSUBUNIT => .currencysubunit,
c.SDL_SCANCODE_KP_LEFTPAREN => .kp_leftparen,
c.SDL_SCANCODE_KP_RIGHTPAREN => .kp_rightparen,
c.SDL_SCANCODE_KP_LEFTBRACE => .kp_leftbrace,
c.SDL_SCANCODE_KP_RIGHTBRACE => .kp_rightbrace,
c.SDL_SCANCODE_KP_TAB => .kp_tab,
c.SDL_SCANCODE_KP_BACKSPACE => .kp_backspace,
c.SDL_SCANCODE_KP_A => .kp_a,
c.SDL_SCANCODE_KP_B => .kp_b,
c.SDL_SCANCODE_KP_C => .kp_c,
c.SDL_SCANCODE_KP_D => .kp_d,
c.SDL_SCANCODE_KP_E => .kp_e,
c.SDL_SCANCODE_KP_F => .kp_f,
c.SDL_SCANCODE_KP_XOR => .kp_xor,
c.SDL_SCANCODE_KP_POWER => .kp_power,
c.SDL_SCANCODE_KP_PERCENT => .kp_percent,
c.SDL_SCANCODE_KP_LESS => .kp_less,
c.SDL_SCANCODE_KP_GREATER => .kp_greater,
c.SDL_SCANCODE_KP_AMPERSAND => .kp_ampersand,
c.SDL_SCANCODE_KP_DBLAMPERSAND => .kp_dblampersand,
c.SDL_SCANCODE_KP_VERTICALBAR => .kp_verticalbar,
c.SDL_SCANCODE_KP_DBLVERTICALBAR => .kp_dblverticalbar,
c.SDL_SCANCODE_KP_COLON => .kp_colon,
c.SDL_SCANCODE_KP_HASH => .kp_hash,
c.SDL_SCANCODE_KP_SPACE => .kp_space,
c.SDL_SCANCODE_KP_AT => .kp_at,
c.SDL_SCANCODE_KP_EXCLAM => .kp_exclam,
c.SDL_SCANCODE_KP_MEMSTORE => .kp_memstore,
c.SDL_SCANCODE_KP_MEMRECALL => .kp_memrecall,
c.SDL_SCANCODE_KP_MEMCLEAR => .kp_memclear,
c.SDL_SCANCODE_KP_MEMADD => .kp_memadd,
c.SDL_SCANCODE_KP_MEMSUBTRACT => .kp_memsubtract,
c.SDL_SCANCODE_KP_MEMMULTIPLY => .kp_memmultiply,
c.SDL_SCANCODE_KP_MEMDIVIDE => .kp_memdivide,
c.SDL_SCANCODE_KP_PLUSMINUS => .kp_plusminus,
c.SDL_SCANCODE_KP_CLEAR => .kp_clear,
c.SDL_SCANCODE_KP_CLEARENTRY => .kp_clearentry,
c.SDL_SCANCODE_KP_BINARY => .kp_binary,
c.SDL_SCANCODE_KP_OCTAL => .kp_octal,
c.SDL_SCANCODE_KP_DECIMAL => .kp_decimal,
c.SDL_SCANCODE_KP_HEXADECIMAL => .kp_hexadecimal,
c.SDL_SCANCODE_LCTRL => .lctrl,
c.SDL_SCANCODE_LSHIFT => .lshift,
c.SDL_SCANCODE_LALT => .lalt,
c.SDL_SCANCODE_LGUI => .lgui,
c.SDL_SCANCODE_RCTRL => .rctrl,
c.SDL_SCANCODE_RSHIFT => .rshift,
c.SDL_SCANCODE_RALT => .ralt,
c.SDL_SCANCODE_RGUI => .rgui,
c.SDL_SCANCODE_CANCEL => .abort,
// mapped to delete by the kernel
c.SDL_SCANCODE_CLEAR => .delete,
// Man, return 1 is just so last century
c.SDL_SCANCODE_RETURN2 => .enter,
c.SDL_SCANCODE_CRSEL => .props,
c.SDL_SCANCODE_KP_LEFTPAREN => .numpad_paren_left,
c.SDL_SCANCODE_KP_RIGHTPAREN => .numpad_paren_right,
c.SDL_SCANCODE_KP_BACKSPACE => .backspace,
c.SDL_SCANCODE_KP_COLON => .numpad_decimal,
c.SDL_SCANCODE_LCTRL => .ctrl_left,
c.SDL_SCANCODE_LSHIFT => .shift_left,
c.SDL_SCANCODE_LALT => .alt_left,
c.SDL_SCANCODE_LGUI => .meta_left,
c.SDL_SCANCODE_RCTRL => .ctrl_right,
c.SDL_SCANCODE_RSHIFT => .shift_right,
c.SDL_SCANCODE_RALT => .alt_right,
c.SDL_SCANCODE_RGUI => .meta_right,
c.SDL_SCANCODE_MODE => .mode,
c.SDL_SCANCODE_AUDIONEXT => .audionext,
c.SDL_SCANCODE_AUDIOPREV => .audioprev,
c.SDL_SCANCODE_AUDIOSTOP => .audiostop,
c.SDL_SCANCODE_AUDIOPLAY => .audioplay,
c.SDL_SCANCODE_AUDIOMUTE => .audiomute,
c.SDL_SCANCODE_MEDIASELECT => .mediaselect,
c.SDL_SCANCODE_WWW => .www,
c.SDL_SCANCODE_MAIL => .mail,
c.SDL_SCANCODE_CALCULATOR => .calculator,
c.SDL_SCANCODE_COMPUTER => .computer,
c.SDL_SCANCODE_AC_SEARCH => .ac_search,
c.SDL_SCANCODE_AC_HOME => .ac_home,
c.SDL_SCANCODE_AC_BACK => .ac_back,
c.SDL_SCANCODE_AC_FORWARD => .ac_forward,
c.SDL_SCANCODE_AC_STOP => .ac_stop,
c.SDL_SCANCODE_AC_REFRESH => .ac_refresh,
c.SDL_SCANCODE_AC_BOOKMARKS => .ac_bookmarks,
c.SDL_SCANCODE_BRIGHTNESSDOWN => .brightnessdown,
c.SDL_SCANCODE_BRIGHTNESSUP => .brightnessup,
c.SDL_SCANCODE_DISPLAYSWITCH => .displayswitch,
c.SDL_SCANCODE_KBDILLUMTOGGLE => .kbdillumtoggle,
c.SDL_SCANCODE_KBDILLUMDOWN => .kbdillumdown,
c.SDL_SCANCODE_KBDILLUMUP => .kbdillumup,
c.SDL_SCANCODE_AUDIONEXT => .media_track_next,
c.SDL_SCANCODE_AUDIOPREV => .media_track_prev,
c.SDL_SCANCODE_AUDIOSTOP => .media_stop,
c.SDL_SCANCODE_AUDIOPLAY => .media_play,
c.SDL_SCANCODE_AUDIOMUTE => .volume_mute,
c.SDL_SCANCODE_MEDIASELECT => .media_select,
c.SDL_SCANCODE_WWW => .launch_browser,
c.SDL_SCANCODE_MAIL => .launch_mail,
c.SDL_SCANCODE_CALCULATOR, c.SDL_SCANCODE_APP2 => .launch_calculator,
c.SDL_SCANCODE_COMPUTER, c.SDL_SCANCODE_APP1 => .launch_explorer,
c.SDL_SCANCODE_AC_SEARCH => .browser_search,
c.SDL_SCANCODE_AC_HOME => .browser_home,
c.SDL_SCANCODE_AC_BACK => .browser_back,
c.SDL_SCANCODE_AC_FORWARD => .browser_forward,
c.SDL_SCANCODE_AC_STOP => .browser_stop,
c.SDL_SCANCODE_AC_REFRESH => .browser_refresh,
c.SDL_SCANCODE_AC_BOOKMARKS => .browser_bookmarks,
c.SDL_SCANCODE_BRIGHTNESSDOWN => .brightness_down,
c.SDL_SCANCODE_BRIGHTNESSUP => .brightness_up,
c.SDL_SCANCODE_DISPLAYSWITCH => .display_toggle_int_ext,
c.SDL_SCANCODE_KBDILLUMTOGGLE => .kbd_backlight_toggle,
c.SDL_SCANCODE_KBDILLUMDOWN => .kbd_backlight_down,
c.SDL_SCANCODE_KBDILLUMUP => .kbd_backlight_up,
c.SDL_SCANCODE_EJECT => .eject,
c.SDL_SCANCODE_SLEEP => .sleep,
c.SDL_SCANCODE_APP1 => .app1,
c.SDL_SCANCODE_APP2 => .app2,
c.SDL_SCANCODE_AUDIOREWIND => .audiorewind,
c.SDL_SCANCODE_AUDIOFASTFORWARD => .audiofastforward,
c.SDL_SCANCODE_SOFTLEFT => .softleft,
c.SDL_SCANCODE_SOFTRIGHT => .softright,
c.SDL_SCANCODE_CALL => .call,
c.SDL_SCANCODE_ENDCALL => .endcall,
c.SDL_SCANCODE_AUDIOREWIND => .media_rewind,
c.SDL_SCANCODE_AUDIOFASTFORWARD => .media_fast_forward,
else => null,
};