summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plat.c100
-rw-r--r--plat.h85
2 files changed, 185 insertions, 0 deletions
diff --git a/plat.c b/plat.c
index da32e29..5f77e8a 100644
--- a/plat.c
+++ b/plat.c
@@ -274,6 +274,85 @@ typedef struct {
Atom wm_delete;
} App_Internal;
+Key key_from_xkey(unsigned key) {
+ switch (key) {
+ case 0x61: return key_A;
+ case 0x62: return key_B;
+ case 0x63: return key_C;
+ case 0x64: return key_D;
+ case 0x65: return key_E;
+ case 0x66: return key_F;
+ case 0x67: return key_G;
+ case 0x68: return key_H;
+ case 0x69: return key_I;
+ case 0x6A: return key_J;
+ case 0x6B: return key_K;
+ case 0x6C: return key_L;
+ case 0x6D: return key_M;
+ case 0x6E: return key_N;
+ case 0x6F: return key_O;
+ case 0x70: return key_P;
+ case 0x71: return key_Q;
+ case 0x72: return key_R;
+ case 0x73: return key_S;
+ case 0x74: return key_T;
+ case 0x75: return key_U;
+ case 0x76: return key_V;
+ case 0x77: return key_W;
+ case 0x78: return key_X;
+ case 0x79: return key_Y;
+ case 0x7A: return key_Z;
+ case XK_F1: return key_f1;
+ case XK_F2: return key_f2;
+ case XK_F3: return key_f3;
+ case XK_F4: return key_f4;
+ case XK_F5: return key_f5;
+ case XK_F6: return key_f6;
+ case XK_F7: return key_f7;
+ case XK_F8: return key_f8;
+ case XK_F9: return key_f9;
+ case XK_F10: return key_f10;
+ case XK_F11: return key_f11;
+ case XK_F12: return key_f12;
+ case XK_Down: return key_down;
+ case XK_Left: return key_left;
+ case XK_Right: return key_right;
+ case XK_Up: return key_up;
+ case XK_Escape: return key_escape;
+ case XK_Return: return key_return;
+ case XK_BackSpace: return key_backspace;
+ case XK_Linefeed: return key_return;
+ case XK_Tab: return key_tab;
+ case XK_Delete: return key_delete;
+ case XK_Home: return key_home;
+ case XK_End: return key_end;
+ case XK_Page_Up: return key_page_up;
+ case XK_Page_Down: return key_page_down;
+ case XK_Insert: return key_insert;
+ case XK_Shift_L: return key_shift;
+ case XK_Shift_R: return key_shift;
+ case XK_Control_L: return key_control;
+ case XK_Control_R: return key_control;
+ case XK_Super_L: return key_super;
+ case XK_Super_R: return key_super;
+ case XK_Alt_L: return key_alt;
+ case XK_Alt_R: return key_alt;
+ case XK_space: return key_space;
+ case XK_period: return key_period;
+ case XK_0: return key_0;
+ case XK_1: return key_1;
+ case XK_2: return key_2;
+ case XK_3: return key_3;
+ case XK_4: return key_4;
+ case XK_5: return key_5;
+ case XK_6: return key_6;
+ case XK_7: return key_7;
+ case XK_8: return key_8;
+ case XK_9: return key_9;
+ default: return key_unknown;
+ }
+}
+
void init_rendering(
App* a,
App_Internal* i,
@@ -406,10 +485,18 @@ void app_begin(App* a) {
App_Internal* i = (App_Internal*)(&a[1]);
Display* d = i->d;
Window w = i->wi;
+ int j;
i->begin = get_timer();
+ for (j = 0; j < key_count; j++) {
+ a->key_states[j] &= ~(
+ key_state_just_pressed | key_state_just_released
+ );
+ }
while (XPending(d)) {
XEvent e;
XWindowAttributes wa;
+ KeySym sym;
+ Key key;
XNextEvent(d, &e);
switch (e.type) {
case ClientMessage:
@@ -435,6 +522,19 @@ void app_begin(App* a) {
a->my = e.xmotion.y / a->s;
}
break;
+ case KeyPress:
+ sym = XLookupKeysym(&e.xkey, 0);
+ key = key_from_xkey(sym);
+ a->key_states[key] |=
+ key_state_pressed |
+ key_state_just_pressed;
+ break;
+ case KeyRelease:
+ sym = XLookupKeysym(&e.xkey, 0);
+ key = key_from_xkey(sym);
+ a->key_states[key] &= ~key_state_pressed;
+ a->key_states[key] |= key_state_just_released;
+ break;
case GenericEvent:
if (!i->ms) {
if (
diff --git a/plat.h b/plat.h
index 1d79465..70fdf36 100644
--- a/plat.h
+++ b/plat.h
@@ -64,6 +64,90 @@ void fps_begin(FPS* f);
void fps_end(FPS* f);
void fps_update(FPS* f);
+#define key_xmacro() \
+ x(key_unknown) \
+ x(key_A) \
+ x(key_B) \
+ x(key_C) \
+ x(key_D) \
+ x(key_E) \
+ x(key_F) \
+ x(key_G) \
+ x(key_H) \
+ x(key_I) \
+ x(key_J) \
+ x(key_K) \
+ x(key_L) \
+ x(key_M) \
+ x(key_N) \
+ x(key_O) \
+ x(key_P) \
+ x(key_Q) \
+ x(key_R) \
+ x(key_S) \
+ x(key_T) \
+ x(key_U) \
+ x(key_V) \
+ x(key_W) \
+ x(key_X) \
+ x(key_Y) \
+ x(key_Z) \
+ x(key_f1) \
+ x(key_f2) \
+ x(key_f3) \
+ x(key_f4) \
+ x(key_f5) \
+ x(key_f6) \
+ x(key_f7) \
+ x(key_f8) \
+ x(key_f9) \
+ x(key_f10) \
+ x(key_f11) \
+ x(key_f12) \
+ x(key_down) \
+ x(key_left) \
+ x(key_right) \
+ x(key_up) \
+ x(key_escape) \
+ x(key_return) \
+ x(key_backspace) \
+ x(key_tab) \
+ x(key_delete) \
+ x(key_home) \
+ x(key_end) \
+ x(key_page_up) \
+ x(key_page_down) \
+ x(key_insert) \
+ x(key_shift) \
+ x(key_control) \
+ x(key_super) \
+ x(key_alt) \
+ x(key_space) \
+ x(key_period) \
+ x(key_0) \
+ x(key_1) \
+ x(key_2) \
+ x(key_3) \
+ x(key_4) \
+ x(key_5) \
+ x(key_6) \
+ x(key_7) \
+ x(key_8) \
+ x(key_9) \
+
+typedef enum {
+#define x(name) name,
+ key_xmacro()
+#undef x
+ key_count
+} Key;
+
+typedef enum {
+ key_state_pressed = 1 << 0,
+ key_state_just_pressed = 1 << 1,
+ key_state_just_released = 1 << 2
+} Key_State;
+
typedef struct {
int w, h, s, o, mpf;
int fps;
@@ -72,6 +156,7 @@ typedef struct {
Error err;
Colour* fb;
Heap* heap;
+ unsigned char key_states[key_count];
} App;
App* new_app(Heap* mem, int w, int h, const char* n);