From a1601bb0b4186a93b9050e56e57bac049c4731b7 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Sun, 28 Sep 2025 22:21:51 +0000 Subject: [PATCH] name git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@33 b9cfdab3-6d41-4d17-bbe4-086880011989 --- example.c | 8 ++++++++ include/Milsko/Core.h | 18 ++++++++++++------ include/Milsko/GDI.h | 2 +- include/Milsko/LowLevel.h | 6 +++--- include/Milsko/StringDefs.h | 2 ++ include/Milsko/TypeDefs.h | 14 +++++++++----- include/Milsko/X11.h | 2 +- src/button.c | 6 +++++- src/core.c | 27 ++++++++++++++++++++++----- src/lowlevel.c | 6 +++--- 10 files changed, 66 insertions(+), 25 deletions(-) diff --git a/example.c b/example.c index f0f1a62..1227a7a 100644 --- a/example.c +++ b/example.c @@ -2,6 +2,10 @@ #include +void handler(MilskoWidget handle){ + printf("hello world!\n"); +} + int main(){ MilskoWidget window = MilskoCreateWidget(MilskoWindowClass, "main", NULL, 0, 0, 400, 400); MilskoWidget button = MilskoCreateWidget(MilskoButtonClass, "button", window, 50, 50, 300, 300); @@ -10,5 +14,9 @@ int main(){ MilskoNtitle, "hello world", NULL); + MilskoApply(button, + MilskoNactivateHandler, handler, + NULL); + MilskoLoop(window); } diff --git a/include/Milsko/Core.h b/include/Milsko/Core.h index f6b15be..5409830 100644 --- a/include/Milsko/Core.h +++ b/include/Milsko/Core.h @@ -5,6 +5,9 @@ #include #include +#define MilskoDispatch(x, y) \ + if(x->class != NULL && x->class->y != NULL) x->class->y(x) + MILSKODECL MilskoWidget MilskoCreateWidget(MilskoClass class, const char* name, MilskoWidget parent, int x, int y, unsigned int width, unsigned int height); MILSKODECL void MilskoDestroyWidget(MilskoWidget handle); @@ -12,11 +15,14 @@ MILSKODECL void MilskoLoop(MilskoWidget handle); MILSKODECL void MilskoStep(MilskoWidget handle); MILSKODECL int MilskoPending(MilskoWidget handle); -MILSKODECL void MilskoSetInteger(MilskoWidget handle, const char* key, int n); -MILSKODECL void MilskoSetText(MilskoWidget handle, const char* key, const char* value); -MILSKODECL int MilskoGetInteger(MilskoWidget handle, const char* key); -MILSKODECL const char* MilskoGetText(MilskoWidget handle, const char* key); -MILSKODECL void MilskoSetDefault(MilskoWidget handle); -MILSKODECL void MilskoApply(MilskoWidget handle, ...); +MILSKODECL void MilskoSetInteger(MilskoWidget handle, const char* key, int n); +MILSKODECL void MilskoSetText(MilskoWidget handle, const char* key, const char* value); +MILSKODECL void MilskoSetHandler(MilskoWidget handle, const char* key, MilskoHandler value); +MILSKODECL int MilskoGetInteger(MilskoWidget handle, const char* key); +MILSKODECL const char* MilskoGetText(MilskoWidget handle, const char* key); +MILSKODECL MilskoHandler MilskoGetHandler(MilskoWidget handle, const char* key); +MILSKODECL void MilskoDispatchHandler(MilskoWidget handle, const char* key); +MILSKODECL void MilskoSetDefault(MilskoWidget handle); +MILSKODECL void MilskoApply(MilskoWidget handle, ...); #endif diff --git a/include/Milsko/GDI.h b/include/Milsko/GDI.h index c093a93..f57b19f 100644 --- a/include/Milsko/GDI.h +++ b/include/Milsko/GDI.h @@ -15,7 +15,7 @@ typedef struct _MilskoLLColor *MilskoLLColor, MilskoLLColorRec; struct _MilskoLL { void* user; - void (*draw)(MilskoLL handle); + MilskoLLHandler handler; }; struct _MilskoColor { diff --git a/include/Milsko/LowLevel.h b/include/Milsko/LowLevel.h index ea5064c..f6eb82f 100644 --- a/include/Milsko/LowLevel.h +++ b/include/Milsko/LowLevel.h @@ -4,7 +4,7 @@ #include -typedef struct _MilskoLLCallback *MilskoLLCallback, MilskoLLCallbackRec; +typedef struct _MilskoLLHandler *MilskoLLHandler, MilskoLLHandlerRec; #ifdef _MILSKO typedef struct _MilskoLL * MilskoLL, MilskoLLRec; typedef struct _MilskoLLColor *MilskoLLColor, MilskoLLColorRec; @@ -24,9 +24,9 @@ typedef void* MilskoLLColor; #include #define MilskoLLDispatch(x, y) \ - if(x->callback != NULL && x->callback->y != NULL) x->callback->y(x) + if(x->handler != NULL && x->handler->y != NULL) x->handler->y(x) -struct _MilskoLLCallback { +struct _MilskoLLHandler { void (*draw)(MilskoLL handle); void (*up)(MilskoLL handle); void (*down)(MilskoLL handle); diff --git a/include/Milsko/StringDefs.h b/include/Milsko/StringDefs.h index 2ef6562..7cf1f8a 100644 --- a/include/Milsko/StringDefs.h +++ b/include/Milsko/StringDefs.h @@ -10,4 +10,6 @@ #define MilskoNtitle "Stitle" #define MilskoNbackground "Sbackground" +#define MilskoNactivateHandler "Cactivate" + #endif diff --git a/include/Milsko/TypeDefs.h b/include/Milsko/TypeDefs.h index c5d57db..17feb88 100644 --- a/include/Milsko/TypeDefs.h +++ b/include/Milsko/TypeDefs.h @@ -7,8 +7,9 @@ typedef struct _MilskoClass * MilskoClass, MilskoClassRec; typedef struct _MilskoPoint MilskoPoint; typedef struct _MilskoRect MilskoRect; -typedef struct _MilskoTextKeyValue MilskoTextKeyValue; typedef struct _MilskoIntegerKeyValue MilskoIntegerKeyValue; +typedef struct _MilskoTextKeyValue MilskoTextKeyValue; +typedef struct _MilskoHandlerKeyValue MilskoHandlerKeyValue; #ifdef _MILSKO typedef struct _MilskoWidget *MilskoWidget, MilskoWidgetRec; #else @@ -20,9 +21,6 @@ typedef void (*MilskoHandler)(MilskoWidget handle); #include #endif -#define MilskoDispatch(x, y) \ - if(x->class != NULL && x->class->y != NULL) x->class->y(x) - struct _MilskoPoint { int x; int y; @@ -45,6 +43,11 @@ struct _MilskoIntegerKeyValue { int value; }; +struct _MilskoHandlerKeyValue { + char* key; + MilskoHandler value; +}; + #ifdef _MILSKO struct _MilskoWidget { char* name; @@ -56,8 +59,9 @@ struct _MilskoWidget { int pressed; - MilskoTextKeyValue* text; MilskoIntegerKeyValue* integer; + MilskoTextKeyValue* text; + MilskoHandlerKeyValue* handler; }; #endif diff --git a/include/Milsko/X11.h b/include/Milsko/X11.h index 5f19296..d3edc32 100644 --- a/include/Milsko/X11.h +++ b/include/Milsko/X11.h @@ -20,7 +20,7 @@ struct _MilskoLL { Colormap colormap; void* user; - MilskoLLCallback callback; + MilskoLLHandler handler; }; struct _MilskoLLColor { diff --git a/src/button.c b/src/button.c index cd3fa74..68fbf77 100644 --- a/src/button.c +++ b/src/button.c @@ -18,11 +18,15 @@ static void draw(MilskoWidget handle) { MilskoDrawRect(handle, &r, MilskoParseColor(handle, MilskoGetText(handle, MilskoNbackground))); } +static void click(MilskoWidget handle) { + MilskoDispatchHandler(handle, MilskoNactivateHandler); +} + MilskoClassRec MilskoButtonClassRec = { NULL, /* opaque */ create, /* create */ NULL, /* destroy */ draw, /* draw */ - NULL /* click */ + click /* click */ }; MilskoClass MilskoButtonClass = &MilskoButtonClassRec; diff --git a/src/core.c b/src/core.c index f2215b2..f7e221d 100644 --- a/src/core.c +++ b/src/core.c @@ -32,18 +32,19 @@ MilskoWidget MilskoCreateWidget(MilskoClass class, const char* name, MilskoWidge h->class = class; h->pressed = 0; - h->lowlevel->user = h; - h->lowlevel->callback->draw = lldrawhandler; - h->lowlevel->callback->up = lluphandler; - h->lowlevel->callback->down = lldownhandler; + h->lowlevel->user = h; + h->lowlevel->handler->draw = lldrawhandler; + h->lowlevel->handler->up = lluphandler; + h->lowlevel->handler->down = lldownhandler; if(parent != NULL) arrput(parent->children, h); sh_new_strdup(h->text); sh_new_strdup(h->integer); - shdefault(h->text, NULL); shdefault(h->integer, -1); + shdefault(h->text, NULL); + shdefault(h->handler, NULL); MilskoDispatch(h, create); @@ -141,6 +142,10 @@ void MilskoSetText(MilskoWidget handle, const char* key, const char* value) { } } +void MilskoSetHandler(MilskoWidget handle, const char* key, MilskoHandler value) { + shput(handle->handler, key, value); +} + int MilskoGetInteger(MilskoWidget handle, const char* key) { if(strcmp(key, MilskoNx) == 0 || strcmp(key, MilskoNy) == 0 || strcmp(key, MilskoNwidth) == 0 || strcmp(key, MilskoNheight) == 0) { int x, y; @@ -162,6 +167,10 @@ const char* MilskoGetText(MilskoWidget handle, const char* key) { return shget(handle->text, key); } +MilskoHandler MilskoGetHandler(MilskoWidget handle, const char* key) { + return shget(handle->handler, key); +} + void MilskoApply(MilskoWidget handle, ...) { va_list va; char* key; @@ -174,6 +183,9 @@ void MilskoApply(MilskoWidget handle, ...) { } else if(key[0] == 'S') { char* t = va_arg(va, char*); MilskoSetText(handle, key, t); + } else if(key[0] == 'C') { + MilskoHandler h = va_arg(va, MilskoHandler); + MilskoSetHandler(handle, key, h); } } va_end(va); @@ -182,3 +194,8 @@ void MilskoApply(MilskoWidget handle, ...) { void MilskoSetDefault(MilskoWidget handle) { MilskoSetText(handle, MilskoNbackground, MilskoDefaultBackground); } + +void MilskoDispatchHandler(MilskoWidget handle, const char* key) { + MilskoHandler handler = MilskoGetHandler(handle, key); + if(handler != NULL) handler(handle); +} diff --git a/src/lowlevel.c b/src/lowlevel.c index 8e22ee6..d3aed0e 100644 --- a/src/lowlevel.c +++ b/src/lowlevel.c @@ -2,10 +2,10 @@ #include void MilskoLLCreateCommon(MilskoLL handle) { - handle->callback = malloc(sizeof(*handle->callback)); - memset(handle->callback, 0, sizeof(*handle->callback)); + handle->handler = malloc(sizeof(*handle->handler)); + memset(handle->handler, 0, sizeof(*handle->handler)); } void MilskoLLDestroyCommon(MilskoLL handle) { - free(handle->callback); + free(handle->handler); }