AddUserHandler actually adds now

git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@801 b9cfdab3-6d41-4d17-bbe4-086880011989
This commit is contained in:
NishiOwO
2025-11-24 19:18:43 +00:00
parent c8c14bf00f
commit cbc0818e2f
2 changed files with 31 additions and 13 deletions

View File

@@ -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 {

View File

@@ -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;