From a5dae3ffd9a9fefd1f535aba93c21acf68246091 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Sat, 11 Oct 2025 11:46:28 +0000 Subject: [PATCH] more handler git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@268 b9cfdab3-6d41-4d17-bbe4-086880011989 --- include/Mw/LowLevel.h | 1 + include/Mw/StringDefs.h | 1 + src/backend/gdi.c | 10 ++++++++-- src/backend/x11.c | 10 ++++++++-- src/core.c | 23 +++++++++++++++-------- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/include/Mw/LowLevel.h b/include/Mw/LowLevel.h index 6900aaa..6dbd171 100644 --- a/include/Mw/LowLevel.h +++ b/include/Mw/LowLevel.h @@ -52,6 +52,7 @@ struct _MwLLHandler { void (*close)(MwLL handle, void* data); void (*move)(MwLL handle, void* data); void (*key)(MwLL handle, void* data); + void (*key_released)(MwLL handle, void* data); }; #ifdef __cplusplus diff --git a/include/Mw/StringDefs.h b/include/Mw/StringDefs.h index c12a3b9..05429ad 100644 --- a/include/Mw/StringDefs.h +++ b/include/Mw/StringDefs.h @@ -36,5 +36,6 @@ #define MwNmouseUpHandler "CmouseUpHandler" #define MwNchangedHandler "CchangedHandler" #define MwNkeyHandler "CkeyHandler" +#define MwNkeyReleasedHandler "CkeyReleasedHandler" #endif diff --git a/src/backend/gdi.c b/src/backend/gdi.c index 07fd062..2c64410 100644 --- a/src/backend/gdi.c +++ b/src/backend/gdi.c @@ -81,13 +81,19 @@ static LRESULT CALLBACK wndproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int n = wp; MwLLDispatch(u->ll, key, &n); - } else if(msg == WM_KEYDOWN) { + } else if(msg == WM_KEYDOWN || msg == WM_KEYUP) { int n = -1; if(wp == VK_LEFT) n = MwLLKeyLeft; if(wp == VK_RIGHT) n = MwLLKeyRight; if(wp == VK_UP) n = MwLLKeyUp; if(wp == VK_DOWN) n = MwLLKeyDown; - if(n != -1) MwLLDispatch(u->ll, key, &n); + if(n != -1) { + if(msg == WM_KEYDOWN) { + MwLLDispatch(u->ll, key, &n); + } else { + MwLLDispatch(u->ll, key_released, &n); + } + } } else if(msg == WM_GETMINMAXINFO) { if(u->min_set || u->max_set) { LPARAM style = GetWindowLongPtr(hWnd, GWL_STYLE); diff --git a/src/backend/x11.c b/src/backend/x11.c index 282332e..23eff8c 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -200,7 +200,7 @@ void MwLLNextEvent(MwLL handle) { p.y = ev.xmotion.y; MwLLDispatch(handle, move, &p); - } else if(ev.type == KeyPress) { + } else if(ev.type == KeyPress || ev.type == KeyRelease) { int n = -1; char str[512]; KeySym sym; @@ -237,7 +237,13 @@ void MwLLNextEvent(MwLL handle) { n = MwLLKeyDown; } - if(n != -1) MwLLDispatch(handle, key, &n); + if(n != -1) { + if(ev.type == KeyPress) { + MwLLDispatch(handle, key, &n); + } else { + MwLLDispatch(handle, key_released, &n); + } + } } if(render) { int x, y; diff --git a/src/core.c b/src/core.c index 03ca7dc..ec39cd3 100644 --- a/src/core.c +++ b/src/core.c @@ -74,6 +74,12 @@ static void llkeyhandler(MwLL handle, void* data) { MwDispatchUserHandler(h, MwNkeyHandler, data); } +static void llkeyrelhandler(MwLL handle, void* data) { + MwWidget h = (MwWidget)handle->user; + + MwDispatchUserHandler(h, MwNkeyReleasedHandler, data); +} + MwWidget MwCreateWidget(MwClass widget_class, const char* name, MwWidget parent, int x, int y, unsigned int width, unsigned int height) { MwWidget h = malloc(sizeof(*h)); @@ -93,14 +99,15 @@ MwWidget MwCreateWidget(MwClass widget_class, const char* name, MwWidget parent, h->destroy_queue = NULL; h->prop_event = 1; - h->lowlevel->user = h; - h->lowlevel->handler->draw = lldrawhandler; - h->lowlevel->handler->up = lluphandler; - h->lowlevel->handler->down = lldownhandler; - h->lowlevel->handler->resize = llresizehandler; - h->lowlevel->handler->close = llclosehandler; - h->lowlevel->handler->move = llmovehandler; - h->lowlevel->handler->key = llkeyhandler; + h->lowlevel->user = h; + h->lowlevel->handler->draw = lldrawhandler; + h->lowlevel->handler->up = lluphandler; + h->lowlevel->handler->down = lldownhandler; + h->lowlevel->handler->resize = llresizehandler; + h->lowlevel->handler->close = llclosehandler; + h->lowlevel->handler->move = llmovehandler; + h->lowlevel->handler->key = llkeyhandler; + h->lowlevel->handler->key_released = llkeyrelhandler; if(parent != NULL) arrput(parent->children, h);