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"
|
#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);
|
||||||
|
|
|
@ -33,12 +33,7 @@ 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) {
|
||||||
|
@ -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,11 +215,7 @@ 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) {
|
windowEventHandler(window, xev);
|
||||||
window->eventHandler(window, xev);
|
|
||||||
} else {
|
|
||||||
windowEventHandler(window, xev);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
|
|
@ -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_
|
||||||
|
|
Loading…
Reference in New Issue