-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathkeymap.cpp
More file actions
190 lines (131 loc) · 4.56 KB
/
Copy pathkeymap.cpp
File metadata and controls
190 lines (131 loc) · 4.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
// Copyright 2019 David Butler <croepha@gmail.com>
#define _ANON_START namespace {
#define _ANON_END }
#include <stdio.h>
#include "util_types.hpp"
#include "keymap.hpp"
#include <easy/profiler.h>
// #include <linux/input-event-codes.h>
#define KEY_MAX 0x2ff
extern u16 frame_time_delta_ms;
extern bool _debug_ignoring_events;
_ANON_START
u16 scancode_down_ms[KEY_MAX + 1];
bool numlock_active;
bool capslock_active;
bool input_should_capture_text = 1;
const int text_input_buffer_SIZE = 8;
char text_input_buffer[text_input_buffer_SIZE + 1];
int text_input_buffer_len;
void add_char(char c) {
assert(text_input_buffer_len < text_input_buffer_SIZE);
text_input_buffer[text_input_buffer_len++] = c;
}
void press(u16 scancode) {
if (scancode < 256 && input_should_capture_text) {
switch ((key_map_special)scancode) {
case key_map_special::CAPSLOCK: {
capslock_active =! capslock_active;
} break;
case key_map_special::NUMLOCK: {
numlock_active =! numlock_active;
} break;
case key_map_special::TAB:
case key_map_special::SHIFT_L:
case key_map_special::SHIFT_R:
default: {
bool is_shifted =
scancode_down_ms[(int)key_map_special::SHIFT_L] != 0xFFFF ||
scancode_down_ms[(int)key_map_special::SHIFT_R] != 0xFFFF;
char numpad_sym = 0;
if (numlock_active) {
numpad_sym = key_map_numpad[scancode];
}
char unlocked_sym;
if (is_shifted || capslock_active) {
unlocked_sym = key_map_unlocked_shifted[scancode];
} else {
unlocked_sym = key_map_unlocked_unshifted[scancode];
}
char locked_sym;
if (is_shifted) {
locked_sym = key_map_shifted[scancode];
} else {
locked_sym = key_map_unshifted[scancode];
}
if (numpad_sym) {
add_char(numpad_sym);
} else if (unlocked_sym) {
add_char(unlocked_sym);
} else if (locked_sym) {
add_char(locked_sym);
} else {
}
} break;
}
}
}
_ANON_END
bool keymap_is_pressed(u16 scancode) {
return scancode_down_ms[scancode] != 0xFFFF;
}
bool keymap_is_pressed_this_frame(u16 scancode) {
#if 0
if (scancode_down_ms[scancode] != 0xFFFF &&
scancode_down_ms[scancode] != 0) {
printf("keymap_is_pressed_this_frame MISS %hu\n",
scancode_down_ms[scancode] );
}
#endif
return scancode_down_ms[scancode] == 0;
}
void keymap_scancode(u16 scancode, s32 raw_value) {
assert(raw_value >= 0);
assert(raw_value <= 3);
// printf("Got scancode %hu\n", scancode);
assert(scancode <= KEY_MAX);
bool down_old = scancode_down_ms[scancode] != 0xFFFF;
bool down_new = !!raw_value;
if (down_old != down_new) {
//printf("Key value changed: %d %d\n", scancode, new_value);
if (down_new) {
press(scancode);
}
if (down_new) {
scancode_down_ms[scancode] = 0;
} else {
scancode_down_ms[scancode] = 0xFFFF;
}
}
}
Buffer keymap_frame() {
EASY_FUNCTION();
if (_debug_ignoring_events) {
for (u16 i=0; i<ArrayLen(scancode_down_ms); i++) {
auto&down = scancode_down_ms[i];
down = 0xFFFF;
}
}
for (u16 i=0; i<ArrayLen(scancode_down_ms); i++) {
auto&down = scancode_down_ms[i];
if (down != 0xFFFF) {
//printf("Doing repeat for %hu\n", i);
down += frame_time_delta_ms;
u16 key_repeat_interval = 35;
u16 key_repeat_delay = 250;
if (down > key_repeat_delay + key_repeat_interval) {
down -= key_repeat_interval;
press(i);
}
}
}
auto ret_len = text_input_buffer_len;
text_input_buffer_len = 0;
return {text_input_buffer, (size_t)ret_len};
}
void keymap_init() {
for (u16 i=0; i<ArrayLen(scancode_down_ms); i++) {
auto&down = scancode_down_ms[i];
down = 0xFFFF;
}
}