#import "modules/std.sx"; #import "modules/sdl3.sx"; #import "ui/types.sx"; EventType :: enum { none; mouse_down; mouse_up; mouse_moved; mouse_wheel; key_down; key_up; text_input; window_resize; quit; } MouseButton :: enum { none; left; middle; right; } Event :: struct { type: EventType; position: Point; delta: Point; button: MouseButton; key: u32; text: string; timestamp: u64; make :: (type: EventType) -> Event { e : Event = ---; memset(@e, 0, size_of(Event)); e.type = type; e; } } // Translate SDL_Event → our Event type translate_sdl_event :: (sdl: *SDL_Event) -> Event { if sdl.* == { case .quit: { return Event.make(.quit); } case .key_down: (data) { e := Event.make(.key_down); e.key = xx data.key; e.timestamp = data.timestamp; return e; } case .key_up: (data) { e := Event.make(.key_up); e.key = xx data.key; e.timestamp = data.timestamp; return e; } case .mouse_motion: (data) { e := Event.make(.mouse_moved); e.position = Point.{ x = data.x, y = data.y }; e.delta = Point.{ x = data.xrel, y = data.yrel }; e.timestamp = data.timestamp; return e; } case .mouse_button_down: (data) { e := Event.make(.mouse_down); e.position = Point.{ x = data.x, y = data.y }; e.button = if data.button == { case 1: .left; case 2: .middle; case 3: .right; else: .none; }; e.timestamp = data.timestamp; return e; } case .mouse_button_up: (data) { e := Event.make(.mouse_up); e.position = Point.{ x = data.x, y = data.y }; e.button = if data.button == { case 1: .left; case 2: .middle; case 3: .right; else: .none; }; e.timestamp = data.timestamp; return e; } case .mouse_wheel: (data) { e := Event.make(.mouse_wheel); e.delta = Point.{ x = data.x, y = data.y }; e.position = Point.{ x = data.mouse_x, y = data.mouse_y }; e.timestamp = data.timestamp; return e; } case .window_resized: (data) { e := Event.make(.window_resize); e.position = Point.{ x = xx data.data1, y = xx data.data2 }; e.timestamp = data.timestamp; return e; } } Event.make(.none); }