From 7da2841ec78918c613f7f21684881cb10f11749e Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Thu, 18 Jan 2024 20:30:45 +0100 Subject: [PATCH] feat: implement new keyboard system --- build.zig.zon | 4 +- src/Sdl2Platform.zig | 252 ++++++++++++++----------- src/util.zig | 431 +++++++++++++++++++++++++++++-------------- 3 files changed, 434 insertions(+), 253 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index 7a305ff..10fe1b5 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -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", }, }, } diff --git a/src/Sdl2Platform.zig b/src/Sdl2Platform.zig index cd8bc72..935f210 100644 --- a/src/Sdl2Platform.zig +++ b/src/Sdl2Platform.zig @@ -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 diff --git a/src/util.zig b/src/util.zig index 38c66ae..1e7cca3 100644 --- a/src/util.zig +++ b/src/util.zig @@ -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, };