From cbc0818e2fbffe517015ac78e41fb119e9cb7c36 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 24 Nov 2025 19:18:43 +0000 Subject: [PATCH] AddUserHandler actually adds now git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@801 b9cfdab3-6d41-4d17-bbe4-086880011989 --- include/Mw/TypeDefs.h | 11 ++++++++--- src/core.c | 33 +++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/include/Mw/TypeDefs.h b/include/Mw/TypeDefs.h index d8e556f..64c9a0c 100644 --- a/include/Mw/TypeDefs.h +++ b/include/Mw/TypeDefs.h @@ -12,6 +12,7 @@ typedef struct _MwClass * MwClass, MwClassRec; typedef struct _MwIntegerKeyValue MwIntegerKeyValue; typedef struct _MwTextKeyValue MwTextKeyValue; +typedef struct _MwUserHandlerArray MwUserHandlerArray; typedef struct _MwUserHandlerKeyValue MwUserHandlerKeyValue; typedef struct _MwVoidKeyValue MwVoidKeyValue; typedef struct _MwMenu* MwMenu; @@ -48,10 +49,14 @@ struct _MwIntegerKeyValue { int value; }; -struct _MwUserHandlerKeyValue { - char* key; +struct _MwUserHandlerArray { void* user_data; - MwUserHandler value; + MwUserHandler handler; +}; + +struct _MwUserHandlerKeyValue { + char* key; + MwUserHandlerArray* value; }; struct _MwVoidKeyValue { diff --git a/src/core.c b/src/core.c index 6db32c2..6fb31a3 100644 --- a/src/core.c +++ b/src/core.c @@ -226,6 +226,9 @@ static void MwFreeWidget(MwWidget handle) { handle->text[i].value = NULL; } shfree(handle->text); + for(i = 0; i < shlen(handle->handler); i++) { + arrfree(handle->handler[i].value); + } shfree(handle->handler); shfree(handle->data); @@ -467,11 +470,7 @@ void MwVaListApply(MwWidget handle, va_list va) { MwSetText(handle, key, t); } else if(key[0] == 'C') { MwUserHandler h = va_arg(va, MwUserHandler); - int ind; - - shput(handle->handler, key, h); - ind = shgeti(handle->handler, key); - handle->handler[ind].user_data = NULL; + MwAddUserHandler(handle, key, h, NULL); } else if(key[0] == 'V') { void* v = va_arg(va, void*); MwSetVoid(handle, key, v); @@ -543,20 +542,34 @@ void MwHideCursor(MwWidget handle) { void MwDispatchUserHandler(MwWidget handle, const char* key, void* handler_data) { int ind = shgeti(handle->handler, key); int p = handle->prop_event; + int i; if(ind == -1) return; if(handle->destroyed) return; if(!p) handle->prop_event = 1; - handle->handler[ind].value(handle, handle->handler[ind].user_data, handler_data); + for(i = 0; i < arrlen(handle->handler[ind].value); i++) { + handle->handler[ind].value[i].handler(handle, handle->handler[ind].value[i].user_data, handler_data); + } if(!p) handle->prop_event = 0; } void MwAddUserHandler(MwWidget handle, const char* key, MwUserHandler handler, void* user_data) { - int ind; + int ind; + MwUserHandlerArray a; + a.handler = handler; + a.user_data = user_data; - shput(handle->handler, key, handler); - ind = shgeti(handle->handler, key); - handle->handler[ind].user_data = user_data; + ind = shgeti(handle->handler, key); + if(ind == -1) { + MwUserHandlerKeyValue e; + e.key = (char*)key; + e.value = NULL; + + arrput(e.value, a); + shputs(handle->handler, e); + } else { + arrput(handle->handler[ind].value, a); + } } static MwErrorHandler error_handler = NULL;