diff --git a/src/gui/jtk/Jtk.h b/src/gui/jtk/Jtk.h index f132677..7eccbf1 100644 --- a/src/gui/jtk/Jtk.h +++ b/src/gui/jtk/Jtk.h @@ -2,6 +2,7 @@ #define JTK_H #include "Jtk_event.h" +#include "Jtk_keys.h" #include "Jtk_time.h" #include "Jtk_timer.h" #include "Jtk_window.h" diff --git a/src/gui/jtk/Jtk_event.cc b/src/gui/jtk/Jtk_event.cc index d710543..4efff2a 100644 --- a/src/gui/jtk/Jtk_event.cc +++ b/src/gui/jtk/Jtk_event.cc @@ -11,6 +11,48 @@ /** Do not wait longer than 100ms */ #define MAX_WAIT_TIME 100000u +/** + * Process an X keyboard event. + * + * @param x_event + * Pointer to the X event. + * @param event + * Pointer to the Jtk event. + */ +static bool ProcessXKeyEvent(XEvent * x_event, Jtk_Event * event) +{ + char buffer; + KeySym keysym; + if (XLookupString(&x_event->xkey, &buffer, 1, &keysym, nullptr) > 0) + { + uint8_t mods = 0u; + if (x_event->xkey.state & ShiftMask) + { + mods |= JTK_KEY_MODS_SHIFT; + } + if (x_event->xkey.state & LockMask) + { + mods |= JTK_KEY_MODS_LOCK; + } + if (x_event->xkey.state & ControlMask) + { + mods |= JTK_KEY_MODS_CTRL; + } + event->key.key = buffer; + event->key.mods = mods; + } + else + { + switch (keysym) + { + case XK_F1: event->key.key = JTK_KEY_F1; break; + default: + return false; + } + } + return true; +} + /** * Process an X event. * @@ -29,10 +71,12 @@ static bool ProcessXEvent(XEvent * x_event, Jtk_Event * event) switch (x_event->type) { case KeyPress: - break; + event->type = JTK_EVENT_KEY_PRESS; + return ProcessXKeyEvent(x_event, event); case KeyRelease: - break; + event->type = JTK_EVENT_KEY_RELEASE; + return ProcessXKeyEvent(x_event, event); case ButtonPress: break; diff --git a/src/gui/jtk/Jtk_keys.h b/src/gui/jtk/Jtk_keys.h new file mode 100644 index 0000000..f4dc28c --- /dev/null +++ b/src/gui/jtk/Jtk_keys.h @@ -0,0 +1,10 @@ +#ifndef JTK_KEYS_H +#define JTK_KEYS_H + +#define JTK_KEY_MODS_SHIFT 0x1u +#define JTK_KEY_MODS_LOCK 0x2u +#define JTK_KEY_MODS_CTRL 0x4u + +#define JTK_KEY_F1 0xFF000001u + +#endif