SBgl 0.1.0
A graphics framework in C99
Loading...
Searching...
No Matches
input.c File Reference
#include "win32_internal.h"
#include <string.h>
Include dependency graph for input.c:

Go to the source code of this file.

Functions

static SBGL_Scancode win32_vk_to_scancode (WPARAM wparam)
 
void win32_internal_process_message (sbgl_InputState *input, UINT msg, WPARAM wparam, LPARAM lparam)
 
void win32_internal_update_input_states (sbgl_InputState *input, sbgl_Window *window)
 

Function Documentation

◆ win32_internal_process_message()

void win32_internal_process_message ( sbgl_InputState * input,
UINT msg,
WPARAM wparam,
LPARAM lparam )

Definition at line 98 of file input.c.

98 {
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}
SBGL_Scancode
OS-independent physical scancodes.
Definition sbgl_input.h:21
@ SBGL_SCANCODE_MAX
Definition sbgl_input.h:137
@ SBGL_MOUSE_BUTTON_MIDDLE
Definition sbgl_input.h:146
@ SBGL_MOUSE_BUTTON_LEFT
Definition sbgl_input.h:144
@ SBGL_MOUSE_BUTTON_RIGHT
Definition sbgl_input.h:145
static SBGL_Scancode win32_vk_to_scancode(WPARAM wparam)
Definition input.c:4
bool mouseDown[SBGL_MOUSE_BUTTON_MAX]
Definition sbgl_input.h:168
bool keysPressed[SBGL_SCANCODE_MAX]
Definition sbgl_input.h:167
bool keysDown[SBGL_SCANCODE_MAX]
Definition sbgl_input.h:166

◆ win32_internal_update_input_states()

void win32_internal_update_input_states ( sbgl_InputState * input,
sbgl_Window * window )

Definition at line 142 of file input.c.

142 {
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}

◆ win32_vk_to_scancode()

static SBGL_Scancode win32_vk_to_scancode ( WPARAM wparam)
static

Definition at line 4 of file input.c.

4 {
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}
@ SBGL_SCANCODE_F3
Definition sbgl_input.h:82
@ SBGL_SCANCODE_LEFTBRACKET
Definition sbgl_input.h:128
@ SBGL_SCANCODE_UNKNOWN
Definition sbgl_input.h:22
@ SBGL_SCANCODE_0
Definition sbgl_input.h:59
@ SBGL_SCANCODE_RALT
Definition sbgl_input.h:135
@ SBGL_SCANCODE_SPACE
Definition sbgl_input.h:65
@ SBGL_SCANCODE_RIGHT
Definition sbgl_input.h:70
@ SBGL_SCANCODE_KP_8
Definition sbgl_input.h:115
@ SBGL_SCANCODE_F9
Definition sbgl_input.h:88
@ SBGL_SCANCODE_A
Definition sbgl_input.h:23
@ SBGL_SCANCODE_KP_6
Definition sbgl_input.h:113
@ SBGL_SCANCODE_LALT
Definition sbgl_input.h:77
@ SBGL_SCANCODE_RCTRL
Definition sbgl_input.h:134
@ SBGL_SCANCODE_SLASH
Definition sbgl_input.h:126
@ SBGL_SCANCODE_RIGHTBRACKET
Definition sbgl_input.h:130
@ SBGL_SCANCODE_LEFT
Definition sbgl_input.h:71
@ SBGL_SCANCODE_APOSTROPHE
Definition sbgl_input.h:122
@ SBGL_SCANCODE_RSHIFT
Definition sbgl_input.h:133
@ SBGL_SCANCODE_INSERT
Definition sbgl_input.h:94
@ SBGL_SCANCODE_NUMLOCKCLEAR
Definition sbgl_input.h:102
@ SBGL_SCANCODE_F8
Definition sbgl_input.h:87
@ SBGL_SCANCODE_KP_MULTIPLY
Definition sbgl_input.h:104
@ SBGL_SCANCODE_F10
Definition sbgl_input.h:89
@ SBGL_SCANCODE_KP_9
Definition sbgl_input.h:116
@ SBGL_SCANCODE_KP_4
Definition sbgl_input.h:111
@ SBGL_SCANCODE_LSHIFT
Definition sbgl_input.h:75
@ SBGL_SCANCODE_PERIOD
Definition sbgl_input.h:125
@ SBGL_SCANCODE_PAGEUP
Definition sbgl_input.h:96
@ SBGL_SCANCODE_ESCAPE
Definition sbgl_input.h:62
@ SBGL_SCANCODE_KP_PERIOD
Definition sbgl_input.h:118
@ SBGL_SCANCODE_LCTRL
Definition sbgl_input.h:76
@ SBGL_SCANCODE_UP
Definition sbgl_input.h:73
@ SBGL_SCANCODE_DOWN
Definition sbgl_input.h:72
@ SBGL_SCANCODE_CAPSLOCK
Definition sbgl_input.h:127
@ SBGL_SCANCODE_TAB
Definition sbgl_input.h:64
@ SBGL_SCANCODE_GRAVE
Definition sbgl_input.h:123
@ SBGL_SCANCODE_F7
Definition sbgl_input.h:86
@ SBGL_SCANCODE_MINUS
Definition sbgl_input.h:67
@ SBGL_SCANCODE_KP_7
Definition sbgl_input.h:114
@ SBGL_SCANCODE_DELETE
Definition sbgl_input.h:97
@ SBGL_SCANCODE_HOME
Definition sbgl_input.h:95
@ SBGL_SCANCODE_RETURN
Definition sbgl_input.h:61
@ SBGL_SCANCODE_KP_ENTER
Definition sbgl_input.h:107
@ SBGL_SCANCODE_F6
Definition sbgl_input.h:85
@ SBGL_SCANCODE_F12
Definition sbgl_input.h:91
@ SBGL_SCANCODE_1
Definition sbgl_input.h:50
@ SBGL_SCANCODE_COMMA
Definition sbgl_input.h:124
@ SBGL_SCANCODE_F4
Definition sbgl_input.h:83
@ SBGL_SCANCODE_KP_PLUS
Definition sbgl_input.h:106
@ SBGL_SCANCODE_F11
Definition sbgl_input.h:90
@ SBGL_SCANCODE_KP_0
Definition sbgl_input.h:117
@ SBGL_SCANCODE_END
Definition sbgl_input.h:98
@ SBGL_SCANCODE_BACKSLASH
Definition sbgl_input.h:129
@ SBGL_SCANCODE_KP_DIVIDE
Definition sbgl_input.h:103
@ SBGL_SCANCODE_KP_5
Definition sbgl_input.h:112
@ SBGL_SCANCODE_F1
Definition sbgl_input.h:80
@ SBGL_SCANCODE_BACKSPACE
Definition sbgl_input.h:63
@ SBGL_SCANCODE_KP_3
Definition sbgl_input.h:110
@ SBGL_SCANCODE_KP_1
Definition sbgl_input.h:108
@ SBGL_SCANCODE_SEMICOLON
Definition sbgl_input.h:121
@ SBGL_SCANCODE_KP_MINUS
Definition sbgl_input.h:105
@ SBGL_SCANCODE_F5
Definition sbgl_input.h:84
@ SBGL_SCANCODE_EQUAL
Definition sbgl_input.h:68
@ SBGL_SCANCODE_PAGEDOWN
Definition sbgl_input.h:99
@ SBGL_SCANCODE_KP_2
Definition sbgl_input.h:109
@ SBGL_SCANCODE_F2
Definition sbgl_input.h:81