1+ package de.fabmax.kool.platform.sdl
2+
3+ import de.fabmax.kool.KoolSystem
4+ import de.fabmax.kool.input.*
5+ import de.fabmax.kool.util.logE
6+ import org.lwjgl.sdl.SDLKeycode.*
7+ import org.lwjgl.sdl.SDLScancode.*
8+ import org.lwjgl.sdl.SDL_KeyboardEvent
9+ import org.lwjgl.sdl.SDL_MouseButtonEvent
10+ import org.lwjgl.sdl.SDL_MouseMotionEvent
11+ import org.lwjgl.sdl.SDL_MouseWheelEvent
12+
13+ class SdlInput (val window : SdlWindow ) : PlatformInput {
14+
15+ override fun setCursorMode (cursorMode : CursorMode ) {
16+ logE { " setCursorMode not yet implemented" }
17+ }
18+
19+ override fun applyCursorShape (cursorShape : CursorShape ) {
20+ logE { " applyCursorShape not yet implemented" }
21+ }
22+
23+ internal fun handleMouseMotion (event : SDL_MouseMotionEvent ) {
24+ val baseScale = if (KoolSystem .platform.isMacOs /* || isWayland*/ ) window.parentScreenScale else 1f
25+ val scale = baseScale * window.renderResolutionFactor
26+ PointerInput .handleMouseMove(event.x() * scale, event.y() * scale)
27+ }
28+
29+ internal fun handleMouseWheel (event : SDL_MouseWheelEvent ) {
30+ PointerInput .handleMouseScroll(event.x(), event.y())
31+ }
32+
33+ internal fun handleMouseButton (event : SDL_MouseButtonEvent ) {
34+ val button = event.button().toInt()
35+ val down = event.down()
36+ PointerInput .handleMouseButtonEvent(button, down)
37+ }
38+
39+ internal fun handleKey (event : SDL_KeyboardEvent ) {
40+ val type = when {
41+ event.repeat() -> KeyboardInput .KEY_EV_REPEATED
42+ event.down() -> KeyboardInput .KEY_EV_DOWN
43+ else -> KeyboardInput .KEY_EV_UP
44+ }
45+ val keyCode = sdlScancodesToKeys[event.scancode()] ? : UniversalKeyCode (event.key()).also { println (" unmapped: ${event.scancode()} " ) }
46+
47+ val sdlMod = event.mod().toInt()
48+ var modifiers = 0
49+ if (sdlMod and SDL_KMOD_SHIFT != 0 ) modifiers = modifiers or KeyboardInput .KEY_MOD_SHIFT
50+ if (sdlMod and SDL_KMOD_CTRL != 0 ) modifiers = modifiers or KeyboardInput .KEY_MOD_CTRL
51+ if (sdlMod and SDL_KMOD_ALT != 0 ) modifiers = modifiers or KeyboardInput .KEY_MOD_ALT
52+ if (sdlMod and SDL_KMOD_GUI != 0 ) modifiers = modifiers or KeyboardInput .KEY_MOD_SUPER
53+
54+ val ev = KeyEvent (
55+ keyCode = keyCode,
56+ localKeyCode = LocalKeyCode (event.key()),
57+ event = type,
58+ modifiers = modifiers
59+ )
60+ KeyboardInput .handleKeyEvent(ev)
61+ }
62+
63+ companion object {
64+ private val sdlScancodesToKeys = mapOf (
65+ SDL_SCANCODE_A to UniversalKeyCode (' A' ),
66+ SDL_SCANCODE_B to UniversalKeyCode (' B' ),
67+ SDL_SCANCODE_C to UniversalKeyCode (' C' ),
68+ SDL_SCANCODE_D to UniversalKeyCode (' D' ),
69+ SDL_SCANCODE_E to UniversalKeyCode (' E' ),
70+ SDL_SCANCODE_F to UniversalKeyCode (' F' ),
71+ SDL_SCANCODE_G to UniversalKeyCode (' G' ),
72+ SDL_SCANCODE_H to UniversalKeyCode (' H' ),
73+ SDL_SCANCODE_I to UniversalKeyCode (' I' ),
74+ SDL_SCANCODE_J to UniversalKeyCode (' J' ),
75+ SDL_SCANCODE_K to UniversalKeyCode (' K' ),
76+ SDL_SCANCODE_L to UniversalKeyCode (' L' ),
77+ SDL_SCANCODE_M to UniversalKeyCode (' M' ),
78+ SDL_SCANCODE_N to UniversalKeyCode (' N' ),
79+ SDL_SCANCODE_O to UniversalKeyCode (' O' ),
80+ SDL_SCANCODE_P to UniversalKeyCode (' P' ),
81+ SDL_SCANCODE_Q to UniversalKeyCode (' Q' ),
82+ SDL_SCANCODE_R to UniversalKeyCode (' R' ),
83+ SDL_SCANCODE_S to UniversalKeyCode (' S' ),
84+ SDL_SCANCODE_T to UniversalKeyCode (' T' ),
85+ SDL_SCANCODE_U to UniversalKeyCode (' U' ),
86+ SDL_SCANCODE_V to UniversalKeyCode (' V' ),
87+ SDL_SCANCODE_W to UniversalKeyCode (' W' ),
88+ SDL_SCANCODE_X to UniversalKeyCode (' X' ),
89+ SDL_SCANCODE_Y to UniversalKeyCode (' Y' ),
90+ SDL_SCANCODE_Z to UniversalKeyCode (' Z' ),
91+
92+ SDL_SCANCODE_1 to UniversalKeyCode (' 1' ),
93+ SDL_SCANCODE_2 to UniversalKeyCode (' 2' ),
94+ SDL_SCANCODE_3 to UniversalKeyCode (' 3' ),
95+ SDL_SCANCODE_4 to UniversalKeyCode (' 4' ),
96+ SDL_SCANCODE_5 to UniversalKeyCode (' 5' ),
97+ SDL_SCANCODE_6 to UniversalKeyCode (' 6' ),
98+ SDL_SCANCODE_7 to UniversalKeyCode (' 7' ),
99+ SDL_SCANCODE_8 to UniversalKeyCode (' 8' ),
100+ SDL_SCANCODE_9 to UniversalKeyCode (' 9' ),
101+ SDL_SCANCODE_0 to UniversalKeyCode (' 0' ),
102+
103+ SDL_SCANCODE_SPACE to UniversalKeyCode (' ' ),
104+ SDL_SCANCODE_MINUS to UniversalKeyCode (' -' ),
105+ SDL_SCANCODE_EQUALS to UniversalKeyCode (' =' ),
106+ SDL_SCANCODE_LEFTBRACKET to UniversalKeyCode (' [' ),
107+ SDL_SCANCODE_RIGHTBRACKET to UniversalKeyCode (' ]' ),
108+ SDL_SCANCODE_SEMICOLON to UniversalKeyCode (' ;' ),
109+ SDL_SCANCODE_APOSTROPHE to UniversalKeyCode (' \' ' ),
110+ SDL_SCANCODE_GRAVE to UniversalKeyCode (' `' ),
111+ SDL_SCANCODE_COMMA to UniversalKeyCode (' ,' ),
112+ SDL_SCANCODE_PERIOD to UniversalKeyCode (' .' ),
113+ SDL_SCANCODE_SLASH to UniversalKeyCode (' /' ),
114+ SDL_SCANCODE_BACKSLASH to UniversalKeyCode (' \\ ' ),
115+ SDL_SCANCODE_NONUSBACKSLASH to UniversalKeyCode (' \\ ' ),
116+
117+ SDL_SCANCODE_LCTRL to KeyboardInput .KEY_CTRL_LEFT ,
118+ SDL_SCANCODE_RCTRL to KeyboardInput .KEY_CTRL_RIGHT ,
119+ SDL_SCANCODE_LSHIFT to KeyboardInput .KEY_SHIFT_LEFT ,
120+ SDL_SCANCODE_RSHIFT to KeyboardInput .KEY_SHIFT_RIGHT ,
121+ SDL_SCANCODE_LALT to KeyboardInput .KEY_ALT_LEFT ,
122+ SDL_SCANCODE_RALT to KeyboardInput .KEY_ALT_RIGHT ,
123+ SDL_SCANCODE_LGUI to KeyboardInput .KEY_SUPER_LEFT ,
124+ SDL_SCANCODE_RGUI to KeyboardInput .KEY_SUPER_RIGHT ,
125+ SDL_SCANCODE_ESCAPE to KeyboardInput .KEY_ESC ,
126+ SDL_SCANCODE_MENU to KeyboardInput .KEY_MENU ,
127+ SDL_SCANCODE_RETURN to KeyboardInput .KEY_ENTER ,
128+ SDL_SCANCODE_KP_ENTER to KeyboardInput .KEY_NP_ENTER ,
129+ SDL_SCANCODE_KP_DIVIDE to KeyboardInput .KEY_NP_DIV ,
130+ SDL_SCANCODE_KP_MULTIPLY to KeyboardInput .KEY_NP_MUL ,
131+ SDL_SCANCODE_KP_PLUS to KeyboardInput .KEY_NP_PLUS ,
132+ SDL_SCANCODE_KP_MINUS to KeyboardInput .KEY_NP_MINUS ,
133+ SDL_SCANCODE_KP_PERIOD to KeyboardInput .KEY_NP_DECIMAL ,
134+ SDL_SCANCODE_BACKSPACE to KeyboardInput .KEY_BACKSPACE ,
135+ SDL_SCANCODE_TAB to KeyboardInput .KEY_TAB ,
136+ SDL_SCANCODE_DELETE to KeyboardInput .KEY_DEL ,
137+ SDL_SCANCODE_INSERT to KeyboardInput .KEY_INSERT ,
138+ SDL_SCANCODE_HOME to KeyboardInput .KEY_HOME ,
139+ SDL_SCANCODE_END to KeyboardInput .KEY_END ,
140+ SDL_SCANCODE_PAGEUP to KeyboardInput .KEY_PAGE_UP ,
141+ SDL_SCANCODE_PAGEDOWN to KeyboardInput .KEY_PAGE_DOWN ,
142+ SDL_SCANCODE_LEFT to KeyboardInput .KEY_CURSOR_LEFT ,
143+ SDL_SCANCODE_RIGHT to KeyboardInput .KEY_CURSOR_RIGHT ,
144+ SDL_SCANCODE_UP to KeyboardInput .KEY_CURSOR_UP ,
145+ SDL_SCANCODE_DOWN to KeyboardInput .KEY_CURSOR_DOWN ,
146+ SDL_SCANCODE_F1 to KeyboardInput .KEY_F1 ,
147+ SDL_SCANCODE_F2 to KeyboardInput .KEY_F2 ,
148+ SDL_SCANCODE_F3 to KeyboardInput .KEY_F3 ,
149+ SDL_SCANCODE_F4 to KeyboardInput .KEY_F4 ,
150+ SDL_SCANCODE_F5 to KeyboardInput .KEY_F5 ,
151+ SDL_SCANCODE_F6 to KeyboardInput .KEY_F6 ,
152+ SDL_SCANCODE_F7 to KeyboardInput .KEY_F7 ,
153+ SDL_SCANCODE_F8 to KeyboardInput .KEY_F8 ,
154+ SDL_SCANCODE_F9 to KeyboardInput .KEY_F9 ,
155+ SDL_SCANCODE_F10 to KeyboardInput .KEY_F10 ,
156+ SDL_SCANCODE_F11 to KeyboardInput .KEY_F11 ,
157+ SDL_SCANCODE_F12 to KeyboardInput .KEY_F12 ,
158+ )
159+ }
160+ }
0 commit comments