diff --git a/main.c b/main.c index 0b5382a..d729e28 100644 --- a/main.c +++ b/main.c @@ -5,14 +5,14 @@ #include "src/openwindow.h" void handleInput(Window * window) { - if (windowKeyPressed(window, WINDOW_KEY_A)) - printf("A is being pressed\n"); + if (windowKeyPressed(window, WINDOW_KEY_A) && !windowKeyShift(window)) + printf("a is being pressed\n"); - if (windowKeyHeld(window, WINDOW_KEY_A)) - printf("A is being held\n"); + if (windowKeyHeld(window, WINDOW_KEY_A) && !windowKeyShift(window)) + printf("a is being held\n"); - if (windowKeyReleased(window, WINDOW_KEY_A)) - printf("A is being released\n"); + if (windowKeyReleased(window, WINDOW_KEY_A) && !windowKeyShift(window)) + printf("a is being released\n"); } int main(void) diff --git a/src/openwindow.c b/src/openwindow.c index 394713b..87d38c9 100644 --- a/src/openwindow.c +++ b/src/openwindow.c @@ -236,7 +236,7 @@ bool windowKeyPressed(Window * window, char * key) { KeyCode keycode = XKeysymToKeycode(window->x.display, keysym); - return !(window->io.last[keycode / 8] & (1 << (keycode % 8))) && (window->io.current[keycode / 8] & (1 << (keycode % 8))); + return !(window->io.last[keycode >> 3] & (1 << (keycode & 7))) && (window->io.current[keycode >> 3] & (1 << (keycode & 7))); } bool windowKeyHeld(Window * window, char * key) { @@ -245,7 +245,7 @@ bool windowKeyHeld(Window * window, char * key) { KeyCode keycode = XKeysymToKeycode(window->x.display, keysym); - return (window->io.last[keycode / 8] & (1 << (keycode % 8))) && (window->io.current[keycode / 8] & (1 << (keycode % 8))); + return (window->io.last[keycode >> 3] & (1 << (keycode & 7))) && (window->io.current[keycode >> 3] & (1 << (keycode & 7))); } bool windowKeyReleased(Window * window, char * key) { @@ -254,7 +254,28 @@ bool windowKeyReleased(Window * window, char * key) { KeyCode keycode = XKeysymToKeycode(window->x.display, keysym); - return (window->io.last[keycode / 8] & (1 << (keycode % 8))) && !(window->io.current[keycode / 8] & (1 << (keycode % 8))); + return (window->io.last[keycode >> 3] & (1 << (keycode & 7))) && !(window->io.current[keycode >> 3] & (1 << (keycode & 7))); +} + +bool windowKeyShift(Window * window) { + KeyCode sl = XKeysymToKeycode(window->x.display, XK_Shift_L); + KeyCode sr = XKeysymToKeycode(window->x.display, XK_Shift_R); + + return (window->io.last[sl >> 3] & (1 << (sl & 7))) || (window->io.current[sr >> 3] & (1 << (sr & 7))); +} + +bool windowKeyCtrl(Window * window) { + KeyCode cl = XKeysymToKeycode(window->x.display, XK_Control_L); + KeyCode cr = XKeysymToKeycode(window->x.display, XK_Control_R); + + return (window->io.last[cl >> 3] & (1 << (cl & 7))) || (window->io.current[cr >> 3] & (1 << (cr & 7))); +} + +bool windowKeyAlt(Window * window) { + KeyCode al = XKeysymToKeycode(window->x.display, XK_Alt_L); + KeyCode ar = XKeysymToKeycode(window->x.display, XK_Alt_R); + + return (window->io.last[al >> 3] & (1 << (al & 7))) || (window->io.current[ar >> 3] & (1 << (ar & 7))); } #else @@ -454,6 +475,18 @@ bool windowKeyReleased(Window * window, int key) { return (window->io.last[key] & 0x80) && !(window->io.current[key] & 0x80); } +bool windowKeyShift(Window * window) { + return window->io.current[VK_SHIFT] & 0x80; +} + +bool windowKeyCtrl(Window * window) { + return window->io.current[VK_CONTROL] & 0x80; +} + +bool windowKeyAlt(Window * window) { + return window->io.current[VK_MENU] & 0x80; +} + #endif // _WIN32 int getOpenGLProcs(void) { diff --git a/src/openwindow.h b/src/openwindow.h index 8e79ccd..94b2817 100644 --- a/src/openwindow.h +++ b/src/openwindow.h @@ -94,6 +94,10 @@ bool windowKeyPressed(Window * window, char * key); bool windowKeyReleased(Window * window, char * key); bool windowKeyHeld(Window * window, char * key); +bool windowKeyShift(Window * window); +bool windowKeyCtrl(Window * window); +bool windowKeyAlt(Window * window); + #else #include @@ -163,6 +167,9 @@ bool windowKeyPressed(Window * window, int key); bool windowKeyReleased(Window * window, int key); bool windowKeyHeld(Window * window, int key); +bool windowKeyShift(Window * window); +bool windowKeyCtrl(Window * window); +bool windowKeyAlt(Window * window); #endif // _WIN32