mirror of
https://gitea.nishi.boats/pyrite-dev/milsko
synced 2026-01-07 09:59:45 +00:00
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:
@@ -12,6 +12,7 @@
|
|||||||
typedef struct _MwClass * MwClass, MwClassRec;
|
typedef struct _MwClass * MwClass, MwClassRec;
|
||||||
typedef struct _MwIntegerKeyValue MwIntegerKeyValue;
|
typedef struct _MwIntegerKeyValue MwIntegerKeyValue;
|
||||||
typedef struct _MwTextKeyValue MwTextKeyValue;
|
typedef struct _MwTextKeyValue MwTextKeyValue;
|
||||||
|
typedef struct _MwUserHandlerArray MwUserHandlerArray;
|
||||||
typedef struct _MwUserHandlerKeyValue MwUserHandlerKeyValue;
|
typedef struct _MwUserHandlerKeyValue MwUserHandlerKeyValue;
|
||||||
typedef struct _MwVoidKeyValue MwVoidKeyValue;
|
typedef struct _MwVoidKeyValue MwVoidKeyValue;
|
||||||
typedef struct _MwMenu* MwMenu;
|
typedef struct _MwMenu* MwMenu;
|
||||||
@@ -48,10 +49,14 @@ struct _MwIntegerKeyValue {
|
|||||||
int value;
|
int value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _MwUserHandlerArray {
|
||||||
|
void* user_data;
|
||||||
|
MwUserHandler handler;
|
||||||
|
};
|
||||||
|
|
||||||
struct _MwUserHandlerKeyValue {
|
struct _MwUserHandlerKeyValue {
|
||||||
char* key;
|
char* key;
|
||||||
void* user_data;
|
MwUserHandlerArray* value;
|
||||||
MwUserHandler value;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MwVoidKeyValue {
|
struct _MwVoidKeyValue {
|
||||||
|
|||||||
29
src/core.c
29
src/core.c
@@ -226,6 +226,9 @@ static void MwFreeWidget(MwWidget handle) {
|
|||||||
handle->text[i].value = NULL;
|
handle->text[i].value = NULL;
|
||||||
}
|
}
|
||||||
shfree(handle->text);
|
shfree(handle->text);
|
||||||
|
for(i = 0; i < shlen(handle->handler); i++) {
|
||||||
|
arrfree(handle->handler[i].value);
|
||||||
|
}
|
||||||
shfree(handle->handler);
|
shfree(handle->handler);
|
||||||
shfree(handle->data);
|
shfree(handle->data);
|
||||||
|
|
||||||
@@ -467,11 +470,7 @@ void MwVaListApply(MwWidget handle, va_list va) {
|
|||||||
MwSetText(handle, key, t);
|
MwSetText(handle, key, t);
|
||||||
} else if(key[0] == 'C') {
|
} else if(key[0] == 'C') {
|
||||||
MwUserHandler h = va_arg(va, MwUserHandler);
|
MwUserHandler h = va_arg(va, MwUserHandler);
|
||||||
int ind;
|
MwAddUserHandler(handle, key, h, NULL);
|
||||||
|
|
||||||
shput(handle->handler, key, h);
|
|
||||||
ind = shgeti(handle->handler, key);
|
|
||||||
handle->handler[ind].user_data = NULL;
|
|
||||||
} else if(key[0] == 'V') {
|
} else if(key[0] == 'V') {
|
||||||
void* v = va_arg(va, void*);
|
void* v = va_arg(va, void*);
|
||||||
MwSetVoid(handle, key, v);
|
MwSetVoid(handle, key, v);
|
||||||
@@ -543,20 +542,34 @@ void MwHideCursor(MwWidget handle) {
|
|||||||
void MwDispatchUserHandler(MwWidget handle, const char* key, void* handler_data) {
|
void MwDispatchUserHandler(MwWidget handle, const char* key, void* handler_data) {
|
||||||
int ind = shgeti(handle->handler, key);
|
int ind = shgeti(handle->handler, key);
|
||||||
int p = handle->prop_event;
|
int p = handle->prop_event;
|
||||||
|
int i;
|
||||||
if(ind == -1) return;
|
if(ind == -1) return;
|
||||||
if(handle->destroyed) return;
|
if(handle->destroyed) return;
|
||||||
|
|
||||||
if(!p) handle->prop_event = 1;
|
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;
|
if(!p) handle->prop_event = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MwAddUserHandler(MwWidget handle, const char* key, MwUserHandler handler, void* user_data) {
|
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);
|
ind = shgeti(handle->handler, key);
|
||||||
handle->handler[ind].user_data = user_data;
|
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;
|
static MwErrorHandler error_handler = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user