added windowKeyHeld and some more keys

This commit is contained in:
Maciej Samborski 2025-07-27 12:52:32 +02:00
parent 14342c8c9f
commit 6951a36932
3 changed files with 57 additions and 40 deletions

17
main.c
View File

@ -4,6 +4,17 @@
#include "src/openwindow.h" #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) int main(void)
{ {
Window * w = openWindow("Window", 800, 600); Window * w = openWindow("Window", 800, 600);
@ -11,11 +22,7 @@ int main(void)
while (!windowKeyPressed(w, WINDOW_KEY_ESC)) { while (!windowKeyPressed(w, WINDOW_KEY_ESC)) {
windowHandleEvents(w); windowHandleEvents(w);
if (windowKeyPressed(w, WINDOW_KEY_A)) handleInput(w);
printf("A is being pressed\n");
if (windowKeyReleased(w, WINDOW_KEY_A))
printf("A is being released\n");
glClearColor(0.1, 0.2, 0.3, 1); glClearColor(0.1, 0.2, 0.3, 1);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);

View File

@ -33,13 +33,8 @@ void windowDefaultEventHandler(Window * w, XEvent xev) {
} }
void windowEventHandler(Window * w, XEvent event) { void windowEventHandler(Window * w, XEvent event) {
if (w->eventHandler == NULL) {
windowDefaultEventHandler(w, event); windowDefaultEventHandler(w, event);
} }
else {
w->eventHandler(w, event);
}
}
bool checkGLXVersion(Window window) { bool checkGLXVersion(Window window) {
int glx_major, glx_minor; int glx_major, glx_minor;
@ -209,10 +204,6 @@ void windowDraw(Window * window) {
usleep(1 / window->fps); usleep(1 / window->fps);
} }
void windowSetEventHandler(Window * window, WindowEventHandler handler) {
window->eventHandler = handler;
}
void resetIOState(Window * window) { void resetIOState(Window * window) {
memcpy(window->io.last, window->io.current, WINDOW_KEY_COUNT); memcpy(window->io.last, window->io.current, WINDOW_KEY_COUNT);
} }
@ -224,14 +215,10 @@ void windowHandleEvents(Window * window) {
while (XPending(window->x.display)) { while (XPending(window->x.display)) {
if (XCheckWindowEvent(window->x.display, window->x.window, window->x.eventMask, &xev)) { 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);
} }
} }
} }
}
void closeWindow(Window * window) { void closeWindow(Window * window) {
glXMakeCurrent(window->x.display, None, None); glXMakeCurrent(window->x.display, None, None);
@ -249,7 +236,16 @@ bool windowKeyPressed(Window * window, char * key) {
KeyCode keycode = XKeysymToKeycode(window->x.display, keysym); 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) { 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); Window * window = (Window *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (window == NULL) goto uninit; if (window == NULL) goto uninit;
if (window->eventHandler == NULL) {
windowDefaultEventHandler(window, event, wParam, lParam); windowDefaultEventHandler(window, event, wParam, lParam);
} else {
window->eventHandler(window, event, wParam, lParam);
}
uninit: uninit:
return (DefWindowProc(hwnd, event, wParam, lParam)); return (DefWindowProc(hwnd, event, wParam, lParam));
@ -425,10 +417,6 @@ void windowDraw(Window * window) {
SwapBuffers(window->wgl.display); SwapBuffers(window->wgl.display);
} }
void windowSetEventHandler(Window * window, WindowEventHandler handler) {
window->eventHandler = handler;
}
void resetIOState(Window * window) { void resetIOState(Window * window) {
memcpy(window->io.last, window->io.current, WINDOW_KEY_COUNT); memcpy(window->io.last, window->io.current, WINDOW_KEY_COUNT);
} }
@ -455,7 +443,11 @@ void closeWindow(Window * window) {
} }
bool windowKeyPressed(Window * window, int key) { 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) { bool windowKeyReleased(Window * window, int key) {

View File

@ -41,13 +41,11 @@ typedef struct {
} WindowIOState; } WindowIOState;
typedef struct Window Window; typedef struct Window Window;
typedef void(* WindowEventHandler)(Window * window, XEvent event);
typedef struct Window { typedef struct Window {
WindowIOState io; WindowIOState io;
GLX glx; GLX glx;
X11 x; X11 x;
WindowEventHandler eventHandler;
uint32_t fps; uint32_t fps;
} Window; } Window;
@ -78,10 +76,23 @@ typedef struct Window {
#define WINDOW_KEY_N ("n") #define WINDOW_KEY_N ("n")
#define WINDOW_KEY_M ("m") #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_ESC ("Escape")
#define WINDOW_KEY_SPACE ("space")
bool windowKeyPressed(Window * window, char * key); bool windowKeyPressed(Window * window, char * key);
bool windowKeyReleased(Window * window, char * key); bool windowKeyReleased(Window * window, char * key);
bool windowKeyHeld(Window * window, char * key);
#else #else
@ -100,12 +111,10 @@ typedef struct {
} WindowIOState; } WindowIOState;
typedef struct Window Window; typedef struct Window Window;
typedef void(* WindowEventHandler)(Window * window, unsigned int event, WPARAM wParam, LPARAM lParam);
typedef struct Window { typedef struct Window {
WindowIOState io; WindowIOState io;
WGL wgl; WGL wgl;
WindowEventHandler eventHandler;
uint32_t fps; uint32_t fps;
} Window; } Window;
@ -136,24 +145,33 @@ typedef struct Window {
#define WINDOW_KEY_N ('N') #define WINDOW_KEY_N ('N')
#define WINDOW_KEY_M ('M') #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_ESC (VK_ESCAPE)
#define WINDOW_KEY_SPACE (VK_SPACE)
bool windowKeyPressed(Window * window, int key); bool windowKeyPressed(Window * window, int key);
bool windowKeyReleased(Window * window, int key); bool windowKeyReleased(Window * window, int key);
bool windowKeyHeld(Window * window, int key);
#endif // _WIN32 #endif // _WIN32
Window * openWindow(const char * name, size_t width, size_t height); Window * openWindow(const char * name, size_t width, size_t height);
void windowSetFps(Window * window, uint32_t fps); void windowSetFps(Window * window, uint32_t fps);
void windowDraw(Window * window); void windowDraw(Window * window);
void windowSetEventHandler(Window * window, WindowEventHandler handler);
void windowHandleEvents(Window * window); void windowHandleEvents(Window * window);
void closeWindow(Window * window); void closeWindow(Window * window);
typedef enum {
WindowKeyPress = 0,
} WindowEvent;
int getOpenGLProcs(void); int getOpenGLProcs(void);
#endif // _OPEN_WINDOW_H_ #endif // _OPEN_WINDOW_H_