diff --git a/library/modules/ui/events.sx b/library/modules/ui/events.sx index 81b40ed..bef218a 100755 --- a/library/modules/ui/events.sx +++ b/library/modules/ui/events.sx @@ -12,7 +12,24 @@ MouseButton :: enum { MouseButtonData :: struct { position: Point; button: MouseButton; } MouseMotionData :: struct { position: Point; delta: Point; } MouseWheelData :: struct { position: Point; delta: Point; } -KeyData :: struct { key: u32; } + +// Platform-neutral keycode. Each backend translates its native codes to this +// (see `keycode_from_sdl`), so app code never depends on a platform key enum. +Keycode :: enum { + unknown; + escape; + enter; + space; + tab; + backspace; + delete; + left; + right; + up; + down; +} + +KeyData :: struct { key: Keycode; } ResizeData :: struct { size: Size; } Event :: enum { @@ -38,6 +55,26 @@ event_position :: (e: *Event) -> ?Point { null; } +// Map a platform (SDL) keycode to the neutral `Keycode`. Only the keys the app +// consumes are mapped; everything else is `.unknown`. Letters/digits arrive via +// `text_input`, not here. +// TODO: extend as more keys are needed. +keycode_from_sdl :: (k: SDL_Keycode) -> Keycode { + if k == { + case .escape: return .escape; + case .return_key: return .enter; + case .space: return .space; + case .tab: return .tab; + case .backspace: return .backspace; + case .delete_key: return .delete; + case .left: return .left; + case .right: return .right; + case .up: return .up; + case .down: return .down; + } + .unknown; +} + // Translate SDL_Event → our Event type translate_sdl_event :: (sdl: *SDL_Event) -> Event { if sdl.* == { @@ -45,10 +82,10 @@ translate_sdl_event :: (sdl: *SDL_Event) -> Event { return .quit; } case .key_down: (data) { - return .key_down(.{ key = xx data.key }); + return .key_down(.{ key = keycode_from_sdl(data.key) }); } case .key_up: (data) { - return .key_up(.{ key = xx data.key }); + return .key_up(.{ key = keycode_from_sdl(data.key) }); } case .mouse_motion: (data) { return .mouse_moved(.{