added windowKeyHeld and some more keys
This commit is contained in:
parent
14342c8c9f
commit
6951a36932
17
main.c
17
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);
|
||||
|
|
|
@ -33,13 +33,8 @@ void windowDefaultEventHandler(Window * w, XEvent xev) {
|
|||
}
|
||||
|
||||
void windowEventHandler(Window * w, XEvent event) {
|
||||
if (w->eventHandler == NULL) {
|
||||
windowDefaultEventHandler(w, event);
|
||||
}
|
||||
else {
|
||||
w->eventHandler(w, event);
|
||||
}
|
||||
}
|
||||
|
||||
bool checkGLXVersion(Window window) {
|
||||
int glx_major, glx_minor;
|
||||
|
@ -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,14 +215,10 @@ 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void closeWindow(Window * window) {
|
||||
glXMakeCurrent(window->x.display, None, None);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
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) {
|
||||
|
|
|
@ -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_
|
||||
|
|
Loading…
Reference in New Issue