SBgl
0.1.0
A graphics framework in C99
Loading...
Searching...
No Matches
input.c
Go to the documentation of this file.
1
#include "
win32_internal.h
"
2
#include <string.h>
3
4
static
SBGL_Scancode
win32_vk_to_scancode
(WPARAM wparam) {
5
if
(wparam >=
'A'
&& wparam <=
'Z'
)
return
(
SBGL_Scancode
)(
SBGL_SCANCODE_A
+ (wparam -
'A'
));
6
if
(wparam ==
'0'
)
return
SBGL_SCANCODE_0
;
7
if
(wparam >=
'1'
&& wparam <=
'9'
)
return
(
SBGL_Scancode
)(
SBGL_SCANCODE_1
+ (wparam -
'1'
));
8
9
switch
(wparam) {
10
/* Basic keys */
11
case
VK_ESCAPE:
return
SBGL_SCANCODE_ESCAPE
;
12
case
VK_RETURN:
return
SBGL_SCANCODE_RETURN
;
13
case
VK_BACK:
return
SBGL_SCANCODE_BACKSPACE
;
14
case
VK_TAB:
return
SBGL_SCANCODE_TAB
;
15
case
VK_SPACE:
return
SBGL_SCANCODE_SPACE
;
16
case
VK_UP:
return
SBGL_SCANCODE_UP
;
17
case
VK_DOWN:
return
SBGL_SCANCODE_DOWN
;
18
case
VK_LEFT:
return
SBGL_SCANCODE_LEFT
;
19
case
VK_RIGHT:
return
SBGL_SCANCODE_RIGHT
;
20
21
/* Left modifiers */
22
case
VK_LSHIFT:
return
SBGL_SCANCODE_LSHIFT
;
23
case
VK_LCONTROL:
return
SBGL_SCANCODE_LCTRL
;
24
case
VK_LMENU:
return
SBGL_SCANCODE_LALT
;
25
26
/* Right modifiers */
27
case
VK_RSHIFT:
return
SBGL_SCANCODE_RSHIFT
;
28
case
VK_RCONTROL:
return
SBGL_SCANCODE_RCTRL
;
29
case
VK_RMENU:
return
SBGL_SCANCODE_RALT
;
30
31
/* Legacy modifier fallbacks */
32
case
VK_SHIFT:
return
SBGL_SCANCODE_LSHIFT
;
33
case
VK_CONTROL:
return
SBGL_SCANCODE_LCTRL
;
34
case
VK_MENU:
return
SBGL_SCANCODE_LALT
;
35
36
/* Symbol keys */
37
case
VK_OEM_PLUS:
return
SBGL_SCANCODE_EQUAL
;
38
case
VK_OEM_MINUS:
return
SBGL_SCANCODE_MINUS
;
39
case
VK_OEM_1:
return
SBGL_SCANCODE_SEMICOLON
;
// ;:
40
case
VK_OEM_2:
return
SBGL_SCANCODE_SLASH
;
// /?
41
case
VK_OEM_3:
return
SBGL_SCANCODE_GRAVE
;
// `~
42
case
VK_OEM_4:
return
SBGL_SCANCODE_LEFTBRACKET
;
// [{
43
case
VK_OEM_5:
return
SBGL_SCANCODE_BACKSLASH
;
// \|
44
case
VK_OEM_6:
return
SBGL_SCANCODE_RIGHTBRACKET
;
// ]}
45
case
VK_OEM_7:
return
SBGL_SCANCODE_APOSTROPHE
;
// '"
46
case
VK_OEM_COMMA:
return
SBGL_SCANCODE_COMMA
;
// ,<
47
case
VK_OEM_PERIOD:
return
SBGL_SCANCODE_PERIOD
;
// .>
48
49
/* Function keys */
50
case
VK_F1:
return
SBGL_SCANCODE_F1
;
51
case
VK_F2:
return
SBGL_SCANCODE_F2
;
52
case
VK_F3:
return
SBGL_SCANCODE_F3
;
53
case
VK_F4:
return
SBGL_SCANCODE_F4
;
54
case
VK_F5:
return
SBGL_SCANCODE_F5
;
55
case
VK_F6:
return
SBGL_SCANCODE_F6
;
56
case
VK_F7:
return
SBGL_SCANCODE_F7
;
57
case
VK_F8:
return
SBGL_SCANCODE_F8
;
58
case
VK_F9:
return
SBGL_SCANCODE_F9
;
59
case
VK_F10:
return
SBGL_SCANCODE_F10
;
60
case
VK_F11:
return
SBGL_SCANCODE_F11
;
61
case
VK_F12:
return
SBGL_SCANCODE_F12
;
62
63
/* Navigation keys */
64
case
VK_INSERT:
return
SBGL_SCANCODE_INSERT
;
65
case
VK_DELETE:
return
SBGL_SCANCODE_DELETE
;
66
case
VK_HOME:
return
SBGL_SCANCODE_HOME
;
67
case
VK_END:
return
SBGL_SCANCODE_END
;
68
case
VK_PRIOR:
return
SBGL_SCANCODE_PAGEUP
;
69
case
VK_NEXT:
return
SBGL_SCANCODE_PAGEDOWN
;
70
71
/* Numpad */
72
case
VK_NUMPAD0:
return
SBGL_SCANCODE_KP_0
;
73
case
VK_NUMPAD1:
return
SBGL_SCANCODE_KP_1
;
74
case
VK_NUMPAD2:
return
SBGL_SCANCODE_KP_2
;
75
case
VK_NUMPAD3:
return
SBGL_SCANCODE_KP_3
;
76
case
VK_NUMPAD4:
return
SBGL_SCANCODE_KP_4
;
77
case
VK_NUMPAD5:
return
SBGL_SCANCODE_KP_5
;
78
case
VK_NUMPAD6:
return
SBGL_SCANCODE_KP_6
;
79
case
VK_NUMPAD7:
return
SBGL_SCANCODE_KP_7
;
80
case
VK_NUMPAD8:
return
SBGL_SCANCODE_KP_8
;
81
case
VK_NUMPAD9:
return
SBGL_SCANCODE_KP_9
;
82
case
VK_MULTIPLY:
return
SBGL_SCANCODE_KP_MULTIPLY
;
83
case
VK_ADD:
return
SBGL_SCANCODE_KP_PLUS
;
84
case
VK_SUBTRACT:
return
SBGL_SCANCODE_KP_MINUS
;
85
case
VK_DECIMAL:
return
SBGL_SCANCODE_KP_PERIOD
;
86
case
VK_DIVIDE:
return
SBGL_SCANCODE_KP_DIVIDE
;
87
case
VK_SEPARATOR:
return
SBGL_SCANCODE_KP_ENTER
;
88
89
/* Lock keys */
90
case
VK_CAPITAL:
return
SBGL_SCANCODE_CAPSLOCK
;
91
case
VK_NUMLOCK:
return
SBGL_SCANCODE_NUMLOCKCLEAR
;
92
case
VK_SCROLL:
return
SBGL_SCANCODE_SCROLLLOCK;
93
94
default
:
return
SBGL_SCANCODE_UNKNOWN
;
95
}
96
}
97
98
void
win32_internal_process_message
(
sbgl_InputState
* input, UINT msg, WPARAM wparam, LPARAM lparam) {
99
if
(!input)
return
;
100
switch
(msg) {
101
case
WM_KEYDOWN:
102
case
WM_SYSKEYDOWN: {
103
SBGL_Scancode
code =
win32_vk_to_scancode
(wparam);
104
if
(code <
SBGL_SCANCODE_MAX
) {
105
// Filter auto-repeat: bit 30 of lparam indicates previous key state
106
// If set, this is an auto-repeat message, not an initial press
107
bool
isRepeat = (lparam & (1 << 30)) != 0;
108
if
(!isRepeat) {
109
input->
keysPressed
[code] =
true
;
110
}
111
input->
keysDown
[code] =
true
;
112
}
113
break
;
114
}
115
case
WM_KEYUP:
116
case
WM_SYSKEYUP: {
117
SBGL_Scancode
code =
win32_vk_to_scancode
(wparam);
118
if
(code <
SBGL_SCANCODE_MAX
) input->
keysDown
[code] =
false
;
119
break
;
120
}
121
case
WM_MOUSEMOVE: {
122
input->
mouseX
= LOWORD(lparam);
123
input->
mouseY
= HIWORD(lparam);
124
break
;
125
}
126
case
WM_LBUTTONDOWN: input->
mouseDown
[
SBGL_MOUSE_BUTTON_LEFT
] =
true
;
break
;
127
case
WM_LBUTTONUP: input->
mouseDown
[
SBGL_MOUSE_BUTTON_LEFT
] =
false
;
break
;
128
case
WM_RBUTTONDOWN: input->
mouseDown
[
SBGL_MOUSE_BUTTON_RIGHT
] =
true
;
break
;
129
case
WM_RBUTTONUP: input->
mouseDown
[
SBGL_MOUSE_BUTTON_RIGHT
] =
false
;
break
;
130
case
WM_MBUTTONDOWN: input->
mouseDown
[
SBGL_MOUSE_BUTTON_MIDDLE
] =
true
;
break
;
131
case
WM_MBUTTONUP: input->
mouseDown
[
SBGL_MOUSE_BUTTON_MIDDLE
] =
false
;
break
;
132
case
WM_KILLFOCUS: {
133
/* Input states are cleared when the window loses focus to prevent
134
stuck keys or buttons from affecting the simulation. */
135
memset(input->
keysDown
, 0,
sizeof
(input->
keysDown
));
136
memset(input->
mouseDown
, 0,
sizeof
(input->
mouseDown
));
137
break
;
138
}
139
}
140
}
141
142
void
win32_internal_update_input_states
(
sbgl_InputState
* input,
sbgl_Window
* window) {
143
if
(!input)
return
;
144
145
if
(window && window->
cursorLocked
) {
146
// Use accumulated raw input deltas for high-precision camera control
147
input->
mouseDeltaX
= window->
accumulatedDeltaX
;
148
input->
mouseDeltaY
= window->
accumulatedDeltaY
;
149
150
// Reset accumulators for next frame
151
window->
accumulatedDeltaX
= 0;
152
window->
accumulatedDeltaY
= 0;
153
154
// Keep internal tracking in sync
155
input->
_internalMouseX
= input->
mouseX
;
156
input->
_internalMouseY
= input->
mouseY
;
157
}
else
{
158
// Use standard position-based delta calculation
159
input->
mouseDeltaX
= input->
mouseX
- input->
_internalMouseX
;
160
input->
mouseDeltaY
= input->
mouseY
- input->
_internalMouseY
;
161
input->
_internalMouseX
= input->
mouseX
;
162
input->
_internalMouseY
= input->
mouseY
;
163
}
164
}
SBGL_Scancode
SBGL_Scancode
OS-independent physical scancodes.
Definition
sbgl_input.h:21
SBGL_SCANCODE_F3
@ SBGL_SCANCODE_F3
Definition
sbgl_input.h:82
SBGL_SCANCODE_LEFTBRACKET
@ SBGL_SCANCODE_LEFTBRACKET
Definition
sbgl_input.h:128
SBGL_SCANCODE_UNKNOWN
@ SBGL_SCANCODE_UNKNOWN
Definition
sbgl_input.h:22
SBGL_SCANCODE_0
@ SBGL_SCANCODE_0
Definition
sbgl_input.h:59
SBGL_SCANCODE_RALT
@ SBGL_SCANCODE_RALT
Definition
sbgl_input.h:135
SBGL_SCANCODE_SPACE
@ SBGL_SCANCODE_SPACE
Definition
sbgl_input.h:65
SBGL_SCANCODE_RIGHT
@ SBGL_SCANCODE_RIGHT
Definition
sbgl_input.h:70
SBGL_SCANCODE_KP_8
@ SBGL_SCANCODE_KP_8
Definition
sbgl_input.h:115
SBGL_SCANCODE_F9
@ SBGL_SCANCODE_F9
Definition
sbgl_input.h:88
SBGL_SCANCODE_A
@ SBGL_SCANCODE_A
Definition
sbgl_input.h:23
SBGL_SCANCODE_KP_6
@ SBGL_SCANCODE_KP_6
Definition
sbgl_input.h:113
SBGL_SCANCODE_LALT
@ SBGL_SCANCODE_LALT
Definition
sbgl_input.h:77
SBGL_SCANCODE_RCTRL
@ SBGL_SCANCODE_RCTRL
Definition
sbgl_input.h:134
SBGL_SCANCODE_SLASH
@ SBGL_SCANCODE_SLASH
Definition
sbgl_input.h:126
SBGL_SCANCODE_RIGHTBRACKET
@ SBGL_SCANCODE_RIGHTBRACKET
Definition
sbgl_input.h:130
SBGL_SCANCODE_LEFT
@ SBGL_SCANCODE_LEFT
Definition
sbgl_input.h:71
SBGL_SCANCODE_APOSTROPHE
@ SBGL_SCANCODE_APOSTROPHE
Definition
sbgl_input.h:122
SBGL_SCANCODE_RSHIFT
@ SBGL_SCANCODE_RSHIFT
Definition
sbgl_input.h:133
SBGL_SCANCODE_INSERT
@ SBGL_SCANCODE_INSERT
Definition
sbgl_input.h:94
SBGL_SCANCODE_NUMLOCKCLEAR
@ SBGL_SCANCODE_NUMLOCKCLEAR
Definition
sbgl_input.h:102
SBGL_SCANCODE_F8
@ SBGL_SCANCODE_F8
Definition
sbgl_input.h:87
SBGL_SCANCODE_KP_MULTIPLY
@ SBGL_SCANCODE_KP_MULTIPLY
Definition
sbgl_input.h:104
SBGL_SCANCODE_F10
@ SBGL_SCANCODE_F10
Definition
sbgl_input.h:89
SBGL_SCANCODE_KP_9
@ SBGL_SCANCODE_KP_9
Definition
sbgl_input.h:116
SBGL_SCANCODE_KP_4
@ SBGL_SCANCODE_KP_4
Definition
sbgl_input.h:111
SBGL_SCANCODE_LSHIFT
@ SBGL_SCANCODE_LSHIFT
Definition
sbgl_input.h:75
SBGL_SCANCODE_PERIOD
@ SBGL_SCANCODE_PERIOD
Definition
sbgl_input.h:125
SBGL_SCANCODE_PAGEUP
@ SBGL_SCANCODE_PAGEUP
Definition
sbgl_input.h:96
SBGL_SCANCODE_ESCAPE
@ SBGL_SCANCODE_ESCAPE
Definition
sbgl_input.h:62
SBGL_SCANCODE_KP_PERIOD
@ SBGL_SCANCODE_KP_PERIOD
Definition
sbgl_input.h:118
SBGL_SCANCODE_LCTRL
@ SBGL_SCANCODE_LCTRL
Definition
sbgl_input.h:76
SBGL_SCANCODE_UP
@ SBGL_SCANCODE_UP
Definition
sbgl_input.h:73
SBGL_SCANCODE_DOWN
@ SBGL_SCANCODE_DOWN
Definition
sbgl_input.h:72
SBGL_SCANCODE_CAPSLOCK
@ SBGL_SCANCODE_CAPSLOCK
Definition
sbgl_input.h:127
SBGL_SCANCODE_TAB
@ SBGL_SCANCODE_TAB
Definition
sbgl_input.h:64
SBGL_SCANCODE_GRAVE
@ SBGL_SCANCODE_GRAVE
Definition
sbgl_input.h:123
SBGL_SCANCODE_F7
@ SBGL_SCANCODE_F7
Definition
sbgl_input.h:86
SBGL_SCANCODE_MINUS
@ SBGL_SCANCODE_MINUS
Definition
sbgl_input.h:67
SBGL_SCANCODE_KP_7
@ SBGL_SCANCODE_KP_7
Definition
sbgl_input.h:114
SBGL_SCANCODE_DELETE
@ SBGL_SCANCODE_DELETE
Definition
sbgl_input.h:97
SBGL_SCANCODE_HOME
@ SBGL_SCANCODE_HOME
Definition
sbgl_input.h:95
SBGL_SCANCODE_RETURN
@ SBGL_SCANCODE_RETURN
Definition
sbgl_input.h:61
SBGL_SCANCODE_KP_ENTER
@ SBGL_SCANCODE_KP_ENTER
Definition
sbgl_input.h:107
SBGL_SCANCODE_F6
@ SBGL_SCANCODE_F6
Definition
sbgl_input.h:85
SBGL_SCANCODE_F12
@ SBGL_SCANCODE_F12
Definition
sbgl_input.h:91
SBGL_SCANCODE_1
@ SBGL_SCANCODE_1
Definition
sbgl_input.h:50
SBGL_SCANCODE_COMMA
@ SBGL_SCANCODE_COMMA
Definition
sbgl_input.h:124
SBGL_SCANCODE_F4
@ SBGL_SCANCODE_F4
Definition
sbgl_input.h:83
SBGL_SCANCODE_MAX
@ SBGL_SCANCODE_MAX
Definition
sbgl_input.h:137
SBGL_SCANCODE_KP_PLUS
@ SBGL_SCANCODE_KP_PLUS
Definition
sbgl_input.h:106
SBGL_SCANCODE_F11
@ SBGL_SCANCODE_F11
Definition
sbgl_input.h:90
SBGL_SCANCODE_KP_0
@ SBGL_SCANCODE_KP_0
Definition
sbgl_input.h:117
SBGL_SCANCODE_END
@ SBGL_SCANCODE_END
Definition
sbgl_input.h:98
SBGL_SCANCODE_BACKSLASH
@ SBGL_SCANCODE_BACKSLASH
Definition
sbgl_input.h:129
SBGL_SCANCODE_KP_DIVIDE
@ SBGL_SCANCODE_KP_DIVIDE
Definition
sbgl_input.h:103
SBGL_SCANCODE_KP_5
@ SBGL_SCANCODE_KP_5
Definition
sbgl_input.h:112
SBGL_SCANCODE_F1
@ SBGL_SCANCODE_F1
Definition
sbgl_input.h:80
SBGL_SCANCODE_BACKSPACE
@ SBGL_SCANCODE_BACKSPACE
Definition
sbgl_input.h:63
SBGL_SCANCODE_KP_3
@ SBGL_SCANCODE_KP_3
Definition
sbgl_input.h:110
SBGL_SCANCODE_KP_1
@ SBGL_SCANCODE_KP_1
Definition
sbgl_input.h:108
SBGL_SCANCODE_SEMICOLON
@ SBGL_SCANCODE_SEMICOLON
Definition
sbgl_input.h:121
SBGL_SCANCODE_KP_MINUS
@ SBGL_SCANCODE_KP_MINUS
Definition
sbgl_input.h:105
SBGL_SCANCODE_F5
@ SBGL_SCANCODE_F5
Definition
sbgl_input.h:84
SBGL_SCANCODE_EQUAL
@ SBGL_SCANCODE_EQUAL
Definition
sbgl_input.h:68
SBGL_SCANCODE_PAGEDOWN
@ SBGL_SCANCODE_PAGEDOWN
Definition
sbgl_input.h:99
SBGL_SCANCODE_KP_2
@ SBGL_SCANCODE_KP_2
Definition
sbgl_input.h:109
SBGL_SCANCODE_F2
@ SBGL_SCANCODE_F2
Definition
sbgl_input.h:81
SBGL_MOUSE_BUTTON_MIDDLE
@ SBGL_MOUSE_BUTTON_MIDDLE
Definition
sbgl_input.h:146
SBGL_MOUSE_BUTTON_LEFT
@ SBGL_MOUSE_BUTTON_LEFT
Definition
sbgl_input.h:144
SBGL_MOUSE_BUTTON_RIGHT
@ SBGL_MOUSE_BUTTON_RIGHT
Definition
sbgl_input.h:145
win32_internal_process_message
void win32_internal_process_message(sbgl_InputState *input, UINT msg, WPARAM wparam, LPARAM lparam)
Definition
input.c:98
win32_internal_update_input_states
void win32_internal_update_input_states(sbgl_InputState *input, sbgl_Window *window)
Definition
input.c:142
win32_vk_to_scancode
static SBGL_Scancode win32_vk_to_scancode(WPARAM wparam)
Definition
input.c:4
sbgl_InputState
Represents the real-time state of physical inputs.
Definition
sbgl_input.h:165
sbgl_InputState::mouseDown
bool mouseDown[SBGL_MOUSE_BUTTON_MAX]
Definition
sbgl_input.h:168
sbgl_InputState::_internalMouseY
int _internalMouseY
Definition
sbgl_input.h:171
sbgl_InputState::keysPressed
bool keysPressed[SBGL_SCANCODE_MAX]
Definition
sbgl_input.h:167
sbgl_InputState::mouseY
int mouseY
Definition
sbgl_input.h:169
sbgl_InputState::mouseX
int mouseX
Definition
sbgl_input.h:169
sbgl_InputState::keysDown
bool keysDown[SBGL_SCANCODE_MAX]
Definition
sbgl_input.h:166
sbgl_InputState::mouseDeltaY
int mouseDeltaY
Definition
sbgl_input.h:170
sbgl_InputState::mouseDeltaX
int mouseDeltaX
Definition
sbgl_input.h:170
sbgl_InputState::_internalMouseX
int _internalMouseX
Definition
sbgl_input.h:171
sbgl_Window
Native X11 window state.
Definition
linux_internal.h:50
sbgl_Window::accumulatedDeltaY
int accumulatedDeltaY
Definition
win32_internal.h:28
sbgl_Window::accumulatedDeltaX
int accumulatedDeltaX
Definition
win32_internal.h:27
sbgl_Window::cursorLocked
bool cursorLocked
Definition
win32_internal.h:22
win32_internal.h
src
platform
win32
input.c
Generated by
1.12.0