diff --git a/main.c b/main.c index 993a4f8..0b5382a 100644 --- a/main.c +++ b/main.c @@ -4,6 +4,17 @@ #include "src/openwindow.h" +void handleInput(Window * window) { + if (windowKeyPressed(window, WINDOW_KEY_A)) + printf("A is being pressed\n"); + + if (windowKeyHeld(window, WINDOW_KEY_A)) + printf("A is being held\n"); + + if (windowKeyReleased(window, WINDOW_KEY_A)) + printf("A is being released\n"); +} + int main(void) { Window * w = openWindow("Window", 800, 600); @@ -11,11 +22,7 @@ int main(void) while (!windowKeyPressed(w, WINDOW_KEY_ESC)) { windowHandleEvents(w); - if (windowKeyPressed(w, WINDOW_KEY_A)) - printf("A is being pressed\n"); - - if (windowKeyReleased(w, WINDOW_KEY_A)) - printf("A is being released\n"); + handleInput(w); glClearColor(0.1, 0.2, 0.3, 1); glClear(GL_COLOR_BUFFER_BIT); diff --git a/src/openwindow.c b/src/openwindow.c index 8ddf370..394713b 100644 --- a/src/openwindow.c +++ b/src/openwindow.c @@ -33,12 +33,7 @@ void windowDefaultEventHandler(Window * w, XEvent xev) { } void windowEventHandler(Window * w, XEvent event) { - if (w->eventHandler == NULL) { - windowDefaultEventHandler(w, event); - } - else { - w->eventHandler(w, event); - } + windowDefaultEventHandler(w, event); } bool checkGLXVersion(Window window) { @@ -209,10 +204,6 @@ void windowDraw(Window * window) { usleep(1 / window->fps); } -void windowSetEventHandler(Window * window, WindowEventHandler handler) { - window->eventHandler = handler; -} - void resetIOState(Window * window) { memcpy(window->io.last, window->io.current, WINDOW_KEY_COUNT); } @@ -224,11 +215,7 @@ void windowHandleEvents(Window * window) { while (XPending(window->x.display)) { if (XCheckWindowEvent(window->x.display, window->x.window, window->x.eventMask, &xev)) { - if (window->eventHandler != NULL) { - window->eventHandler(window, xev); - } else { - windowEventHandler(window, xev); - } + windowEventHandler(window, xev); } } } @@ -249,7 +236,16 @@ bool windowKeyPressed(Window * window, char * key) { KeyCode keycode = XKeysymToKeycode(window->x.display, keysym); - return window->io.current[keycode / 8] & (1 << (keycode % 8)); + return !(window->io.last[keycode / 8] & (1 << (keycode % 8))) && (window->io.current[keycode / 8] & (1 << (keycode % 8))); +} + +bool windowKeyHeld(Window * window, char * key) { + KeySym keysym = XStringToKeysym(key); + if (keysym == NoSymbol) return false; + + KeyCode keycode = XKeysymToKeycode(window->x.display, keysym); + + return (window->io.last[keycode / 8] & (1 << (keycode % 8))) && (window->io.current[keycode / 8] & (1 << (keycode % 8))); } bool windowKeyReleased(Window * window, char * key) { @@ -289,11 +285,7 @@ LRESULT CALLBACK windowEventHandler(HWND hwnd, unsigned int event, WPARAM wParam Window * window = (Window *)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (window == NULL) goto uninit; - if (window->eventHandler == NULL) { - windowDefaultEventHandler(window, event, wParam, lParam); - } else { - window->eventHandler(window, event, wParam, lParam); - } + windowDefaultEventHandler(window, event, wParam, lParam); uninit: return (DefWindowProc(hwnd, event, wParam, lParam)); @@ -425,10 +417,6 @@ void windowDraw(Window * window) { SwapBuffers(window->wgl.display); } -void windowSetEventHandler(Window * window, WindowEventHandler handler) { - window->eventHandler = handler; -} - void resetIOState(Window * window) { memcpy(window->io.last, window->io.current, WINDOW_KEY_COUNT); } @@ -455,7 +443,11 @@ void closeWindow(Window * window) { } bool windowKeyPressed(Window * window, int key) { - return window->io.current[key] & 0x80; + return !(window->io.last[key] & 0x80) && (window->io.current[key] & 0x80); +} + +bool windowKeyHeld(Window * window, int key) { + return (window->io.last[key] & 0x80) && (window->io.current[key] & 0x80); } bool windowKeyReleased(Window * window, int key) { diff --git a/src/openwindow.h b/src/openwindow.h index 3af11e4..8e79ccd 100644 --- a/src/openwindow.h +++ b/src/openwindow.h @@ -41,13 +41,11 @@ typedef struct { } WindowIOState; typedef struct Window Window; -typedef void(* WindowEventHandler)(Window * window, XEvent event); typedef struct Window { WindowIOState io; GLX glx; X11 x; - WindowEventHandler eventHandler; uint32_t fps; } Window; @@ -78,10 +76,23 @@ typedef struct Window { #define WINDOW_KEY_N ("n") #define WINDOW_KEY_M ("m") +#define WINDOW_KEY_1 ("1") +#define WINDOW_KEY_2 ("2") +#define WINDOW_KEY_3 ("3") +#define WINDOW_KEY_4 ("4") +#define WINDOW_KEY_5 ("5") +#define WINDOW_KEY_6 ("6") +#define WINDOW_KEY_7 ("7") +#define WINDOW_KEY_8 ("8") +#define WINDOW_KEY_9 ("9") +#define WINDOW_KEY_0 ("0") + #define WINDOW_KEY_ESC ("Escape") +#define WINDOW_KEY_SPACE ("space") bool windowKeyPressed(Window * window, char * key); bool windowKeyReleased(Window * window, char * key); +bool windowKeyHeld(Window * window, char * key); #else @@ -100,12 +111,10 @@ typedef struct { } WindowIOState; typedef struct Window Window; -typedef void(* WindowEventHandler)(Window * window, unsigned int event, WPARAM wParam, LPARAM lParam); typedef struct Window { WindowIOState io; WGL wgl; - WindowEventHandler eventHandler; uint32_t fps; } Window; @@ -136,24 +145,33 @@ typedef struct Window { #define WINDOW_KEY_N ('N') #define WINDOW_KEY_M ('M') +#define WINDOW_KEY_1 ('1') +#define WINDOW_KEY_2 ('2') +#define WINDOW_KEY_3 ('3') +#define WINDOW_KEY_4 ('4') +#define WINDOW_KEY_5 ('5') +#define WINDOW_KEY_6 ('6') +#define WINDOW_KEY_7 ('7') +#define WINDOW_KEY_8 ('8') +#define WINDOW_KEY_9 ('9') +#define WINDOW_KEY_0 ('0') + #define WINDOW_KEY_ESC (VK_ESCAPE) +#define WINDOW_KEY_SPACE (VK_SPACE) bool windowKeyPressed(Window * window, int key); bool windowKeyReleased(Window * window, int key); +bool windowKeyHeld(Window * window, int key); + #endif // _WIN32 Window * openWindow(const char * name, size_t width, size_t height); void windowSetFps(Window * window, uint32_t fps); void windowDraw(Window * window); -void windowSetEventHandler(Window * window, WindowEventHandler handler); void windowHandleEvents(Window * window); void closeWindow(Window * window); -typedef enum { - WindowKeyPress = 0, -} WindowEvent; - int getOpenGLProcs(void); #endif // _OPEN_WINDOW_H_