From ebc674f403f9a85ccb6d8049bc86be33f0971b1d Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 20 Oct 2025 21:55:30 +0000 Subject: [PATCH] merge generic_func_idea from git git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@433 b9cfdab3-6d41-4d17-bbe4-086880011989 --- .gitignore | 12 +-- doc/index.html | 138 +++++++++++++++++++++++++++++----- include/Mw/Core.h | 16 ++++ include/Mw/MachDep.h | 2 + include/Mw/TypeDefs.h | 31 ++++---- include/Mw/Widget/ListBox.h | 27 +++++-- include/Mw/Widget/Menu.h | 7 +- include/Mw/Widget/OpenGL.h | 15 +++- include/Mw/Widget/ScrollBar.h | 7 +- include/Mw/Widget/SubMenu.h | 5 +- include/Mw/Widget/Viewport.h | 11 ++- include/Mw/Widget/Vulkan.h | 7 +- include/Mw/Widget/Window.h | 5 +- src/core.c | 13 ++++ src/widget/button.c | 2 +- src/widget/checkbox.c | 2 +- src/widget/entry.c | 2 +- src/widget/frame.c | 2 +- src/widget/image.c | 2 +- src/widget/label.c | 2 +- src/widget/listbox.c | 65 ++++++++++------ src/widget/menu.c | 46 +++++++----- src/widget/numberentry.c | 2 +- src/widget/opengl.c | 55 ++++++++------ src/widget/scrollbar.c | 54 +++++++------ src/widget/submenu.c | 48 +++++++----- src/widget/viewport.c | 51 ++++++++----- src/widget/vulkan.c | 63 +++++++++------- src/widget/window.c | 41 +++++----- 29 files changed, 499 insertions(+), 234 deletions(-) diff --git a/.gitignore b/.gitignore index a22edab..487c2b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,9 @@ *.o *.so -examples/example -examples/image -examples/opengl -examples/rotate -examples/vulkan +examples/* +examples/*.exe +examples/*/* +examples/*/*.exe +!examples/*/ +!examples/*.* +!examples/*/*.* diff --git a/doc/index.html b/doc/index.html index 824e8de..cff64ea 100644 --- a/doc/index.html +++ b/doc/index.html @@ -77,6 +77,12 @@
MwDestroyWidget
+
+ MwWidgetExecute +
+
+ MwVaWidgetExecute +
MwLoop
@@ -267,7 +273,7 @@ MwGetLastError
- Mw/FileChoose.h + Mw/FileChooser.h
Mw/Font.h @@ -377,6 +383,18 @@
MwUTF32ToUTF8
+
+ Mw/Version.h +
+
+ MwMAJOR +
+
+ MwMINOR +
+
+ MwVERSION +
Mw/Widget/Button.h
@@ -979,6 +997,60 @@
+
MWDECL void MwWidgetExecute (
+	MwWidget handle,
+	const char* func_name,
+	void* out,
+	...
+);
+
+
+ Executes a method specific to the widget (varadic version). +
+
+
warningPrefer using corresponding functions for better code clarity and type safety.
+
+
+ Parameter handle +
+
+ Widget. +
+
+ Parameter ... +
+
+ Widget function arguments. +
+
+
+
MWDECL void MwVaWidgetExecute (
+	MwWidget handle,
+	const char* func_name,
+	void* out,
+	va_list va
+);
+
+
+ Executes a method specific to the widget (va_list version). +
+
+
warningPrefer using corresponding functions for better code clarity and type safety.
+
+
+ Parameter handle +
+
+ Widget. +
+
+ Parameter va +
+
+ Widget function arguments. +
+
+
MWDECL void MwLoop (
 	MwWidget handle
 );
@@ -2257,7 +2329,7 @@
-

Mw/FileChoose.h

+

Mw/FileChooser.h

File chooser. @@ -2680,6 +2752,34 @@

+

Mw/Version.h

+
+
+ Version informations. +
+
+
+
#define MwMAJOR 0
+
+
+ Major version. +
+
+
+
#define MwMINOR 0
+
+
+ Minor version. +
+
+
+
#define MwVERSION "pre-1.0"
+
+
+ Version in string. +
+
+

Mw/Widget/Button.h

@@ -2778,7 +2878,7 @@

-
MWDECL void MwListBoxInsert (
+
void MwListBoxInsert (
 	MwWidget handle,
 	int index,
 	MwLLPixmap pixmap,
@@ -2814,7 +2914,7 @@
 
 
 
-
MWDECL void MwListBoxInsertMultiple (
+
void MwListBoxInsertMultiple (
 	MwWidget handle,
 	int index,
 	int count,
@@ -2857,7 +2957,7 @@
 
 
 
-
MWDECL void MwListBoxVaInsert (
+
void MwListBoxVaInsert (
 	MwWidget handle,
 	int index,
 	MwLLPixmap pixmap,
@@ -2893,7 +2993,7 @@
 
 
 
-
MWDECL void MwListBoxVaInsertMultiple (
+
void MwListBoxVaInsertMultiple (
 	MwWidget handle,
 	int index,
 	int count,
@@ -2936,7 +3036,7 @@
 
 
 
-
MWDECL void MwListBoxDelete (
+
MwInline void MwListBoxDelete (
 	MwWidget handle,
 	int index
 );
@@ -2958,7 +3058,7 @@
-
MWDECL const char* MwListBoxGet (
+
MwInline const char* MwListBoxGet (
 	MwWidget handle,
 	int index
 );
@@ -2986,7 +3086,7 @@
-
MWDECL void MwListBoxSetWidth (
+
MwInline void MwListBoxSetWidth (
 	MwWidget handle,
 	int index,
 	int width
@@ -3015,7 +3115,7 @@
 
 
 
-
MWDECL void MwListBoxReset (
+
MwInline void MwListBoxReset (
 	MwWidget handle
 );
@@ -3044,7 +3144,7 @@

-
MWDECL MwMenu MwMenuAdd (
+
MwInline MwMenu MwMenuAdd (
 	MwWidget handle,
 	MwMenu menu,
 	const char* name
@@ -3107,7 +3207,7 @@
 
 
 
-
MWDECL void MwOpenGLMakeCurrent (
+
MwInline void MwOpenGLMakeCurrent (
 	MwWidget handle
 );
@@ -3122,7 +3222,7 @@

-
MWDECL void* MwOpenGLGetProcAddress (
+
MwInline void* MwOpenGLGetProcAddress (
 	MwWidget handle,
 	const char* name
 );
@@ -3150,7 +3250,7 @@
-
MWDECL void MwOpenGLSwapBuffer (
+
MwInline void MwOpenGLSwapBuffer (
 	MwWidget handle
 );
@@ -3179,7 +3279,7 @@

-
MWDECL int MwScrollBarGetVisibleLength (
+
MwInline int MwScrollBarGetVisibleLength (
 	MwWidget handle
 );
@@ -3228,7 +3328,7 @@

-
MWDECL MwWidget MwViewportGetViewport (
+
MwInline MwWidget MwViewportGetViewport (
 	MwWidget handle
 );
@@ -3249,7 +3349,7 @@

-
MWDECL void MwViewportSetSize (
+
MwInline void MwViewportSetSize (
 	MwWidget handle,
 	int w,
 	int h
@@ -3422,7 +3522,7 @@
 
 
 
-
MWDECL void* MwVulkanGetField (
+
MwInline void* MwVulkanGetField (
 	MwWidget handle,
 	MwVulkanField field,
 	MwErrorEnum* out
@@ -3459,7 +3559,7 @@
 
 
 
-
MWDECL void MwWindowMakeBorderless (
+
MwInline void MwWindowMakeBorderless (
 	MwWidget handle,
 	int toggle
 );
diff --git a/include/Mw/Core.h b/include/Mw/Core.h index 2ac6711..4a4a154 100644 --- a/include/Mw/Core.h +++ b/include/Mw/Core.h @@ -91,6 +91,22 @@ MWDECL MwWidget MwVaListCreateWidget(MwClass widget_class, const char* name, MwW */ MWDECL void MwDestroyWidget(MwWidget handle); +/*! + * %brief Executes a method specific to the widget (varadic version). + * %warning Prefer using corresponding functions for better code clarity and type safety. + * %param handle Widget + * %param ... Widget function arguments. + */ +MWDECL void MwWidgetExecute(MwWidget handle, const char* func_name, void* out, ...); + +/*! + * %brief Executes a method specific to the widget (va_list version). + * %warning Prefer using corresponding functions for better code clarity and type safety. + * %param handle Widget + * %param va Widget function arguments. + */ +MWDECL void MwVaWidgetExecute(MwWidget handle, const char* func_name, void* out, va_list va); + /*! * %brief Runs the main loop * %param handle Widget diff --git a/include/Mw/MachDep.h b/include/Mw/MachDep.h index 0f14b84..a5cb307 100644 --- a/include/Mw/MachDep.h +++ b/include/Mw/MachDep.h @@ -39,4 +39,6 @@ #define MWDECL extern #endif +#define MwInline __inline + #endif diff --git a/include/Mw/TypeDefs.h b/include/Mw/TypeDefs.h index 5f45f49..f100abd 100644 --- a/include/Mw/TypeDefs.h +++ b/include/Mw/TypeDefs.h @@ -36,6 +36,7 @@ typedef void (*MwHandler4)(MwWidget handle, int key); typedef void (*MwHandler5)(MwWidget handle, void* ptr); typedef void (*MwUserHandler)(MwWidget handle, void* user_data, void* call_data); typedef void (*MwErrorHandler)(int code, const char* message, void* user_data); +typedef void (*MwHandlerExecute)(MwWidget handle, const char* name, void* out, va_list args); #if __STDC_VERSION__ >= 199901L || __GNUC__ > 2 typedef unsigned long long MwOffset; @@ -174,21 +175,21 @@ struct _MwCursor { }; struct _MwClass { - MwHandler2 create; - MwHandler destroy; - MwHandler draw; - MwHandler click; - MwHandler parent_resize; - MwHandler3 prop_change; - MwHandler mouse_move; - MwHandler5 mouse_up; - MwHandler5 mouse_down; - MwHandler4 key; - void* reserved1; - void* reserved2; - void* reserved3; - void* reserved4; - void* reserved5; + MwHandler2 create; + MwHandler destroy; + MwHandler draw; + MwHandler click; + MwHandler parent_resize; + MwHandler3 prop_change; + MwHandler mouse_move; + MwHandler5 mouse_up; + MwHandler5 mouse_down; + MwHandler4 key; + MwHandlerExecute execute; + void* reserved2; + void* reserved3; + void* reserved4; + void* reserved5; }; struct _MwFont { diff --git a/include/Mw/Widget/ListBox.h b/include/Mw/Widget/ListBox.h index a3519e0..53ea858 100644 --- a/include/Mw/Widget/ListBox.h +++ b/include/Mw/Widget/ListBox.h @@ -9,6 +9,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -26,7 +27,7 @@ MWDECL MwClass MwListBoxClass; * %param pixmap Pixmap * %param ... Text */ -MWDECL void MwListBoxInsert(MwWidget handle, int index, MwLLPixmap pixmap, ...); /* VA_HINT:pixmap */ +void MwListBoxInsert(MwWidget handle, int index, MwLLPixmap pixmap, ...); /* VA_HINT:pixmap */ /*! * %brief Inserts multiple items on the listbox @@ -36,7 +37,7 @@ MWDECL void MwListBoxInsert(MwWidget handle, int index, MwLLPixmap pixmap, ...); * %param pixmap Pixmap * %param ... Text */ -MWDECL void MwListBoxInsertMultiple(MwWidget handle, int index, int count, MwLLPixmap* pixmap, ...); /* VA_HINT:pixmap */ +void MwListBoxInsertMultiple(MwWidget handle, int index, int count, MwLLPixmap* pixmap, ...); /* VA_HINT:pixmap */ /*! * %brief Inserts item on the listbox @@ -45,7 +46,7 @@ MWDECL void MwListBoxInsertMultiple(MwWidget handle, int index, int count, MwLLP * %param pixmap Pixmap * %param va Text */ -MWDECL void MwListBoxVaInsert(MwWidget handle, int index, MwLLPixmap pixmap, va_list va); +void MwListBoxVaInsert(MwWidget handle, int index, MwLLPixmap pixmap, va_list va); /*! * %brief Inserts multiple items on the listbox @@ -55,14 +56,16 @@ MWDECL void MwListBoxVaInsert(MwWidget handle, int index, MwLLPixmap pixmap, va_ * %param pixmap Pixmap * %param va Text */ -MWDECL void MwListBoxVaInsertMultiple(MwWidget handle, int index, int count, MwLLPixmap* pixmap, va_list va); +void MwListBoxVaInsertMultiple(MwWidget handle, int index, int count, MwLLPixmap* pixmap, va_list va); /*! * %brief Deletes item from the listbox * %param handle Widget * %param index Index */ -MWDECL void MwListBoxDelete(MwWidget handle, int index); +MwInline void MwListBoxDelete(MwWidget handle, int index) { + MwWidgetExecute(handle, "mwListboxDelete", NULL, index); +}; /*! * %brief Gets item from the listbox @@ -70,7 +73,11 @@ MWDECL void MwListBoxDelete(MwWidget handle, int index); * %param index Index * %return Item */ -MWDECL const char* MwListBoxGet(MwWidget handle, int index); +MwInline const char* MwListBoxGet(MwWidget handle, int index) { + const char* out; + MwWidgetExecute(handle, "mwListBoxGet", &out, index); + return out; +}; /*! * %brief Sets an item width of the listbox @@ -78,13 +85,17 @@ MWDECL const char* MwListBoxGet(MwWidget handle, int index); * %param index Column index * %param width Width */ -MWDECL void MwListBoxSetWidth(MwWidget handle, int index, int width); +MwInline void MwListBoxSetWidth(MwWidget handle, int index, int width) { + MwWidgetExecute(handle, "mwListBoxSetWidth", NULL, index, width); +}; /*! * %brief Resets the listbox * %param handle Widget */ -MWDECL void MwListBoxReset(MwWidget handle); +MwInline void MwListBoxReset(MwWidget handle) { + MwWidgetExecute(handle, "mwListBoxReset", NULL, handle); +}; #ifdef __cplusplus } diff --git a/include/Mw/Widget/Menu.h b/include/Mw/Widget/Menu.h index a63f22d..900aa7c 100644 --- a/include/Mw/Widget/Menu.h +++ b/include/Mw/Widget/Menu.h @@ -8,6 +8,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -25,7 +26,11 @@ MWDECL MwClass MwMenuClass; * %param name Menu name * %return Menu */ -MWDECL MwMenu MwMenuAdd(MwWidget handle, MwMenu menu, const char* name); +MwInline MwMenu MwMenuAdd(MwWidget handle, MwMenu menu, const char* name) { + MwMenu out; + MwWidgetExecute(handle, "mwMenuAdd", &out, menu, name); + return out; +}; #ifdef __cplusplus } diff --git a/include/Mw/Widget/OpenGL.h b/include/Mw/Widget/OpenGL.h index ee892f8..9fcb836 100644 --- a/include/Mw/Widget/OpenGL.h +++ b/include/Mw/Widget/OpenGL.h @@ -8,6 +8,7 @@ #include #include +#include #ifdef _WIN32 #include @@ -33,7 +34,9 @@ MWDECL MwClass MwOpenGLClass; * %brief Make a widget current OpenGL context * %param handle Widget */ -MWDECL void MwOpenGLMakeCurrent(MwWidget handle); +MwInline void MwOpenGLMakeCurrent(MwWidget handle) { + MwWidgetExecute(handle, "mwOpenGLMakeCurrent", NULL); +}; /*! * %brief Get a procedure from OpenGL @@ -41,13 +44,19 @@ MWDECL void MwOpenGLMakeCurrent(MwWidget handle); * %param name Name * %return Procedure */ -MWDECL void* MwOpenGLGetProcAddress(MwWidget handle, const char* name); +MwInline void* MwOpenGLGetProcAddress(MwWidget handle, const char* name) { + void* out; + MwWidgetExecute(handle, "mwOpenGLGetProcAddress", &out, name); + return out; +}; /*! * %brief Swaps the buffer of OpenGL context * %param handle Widget */ -MWDECL void MwOpenGLSwapBuffer(MwWidget handle); +MwInline void MwOpenGLSwapBuffer(MwWidget handle) { + MwWidgetExecute(handle, "mwOpenGLSwapBuffer", NULL); +}; #ifdef __cplusplus } diff --git a/include/Mw/Widget/ScrollBar.h b/include/Mw/Widget/ScrollBar.h index 03ce649..3c138be 100644 --- a/include/Mw/Widget/ScrollBar.h +++ b/include/Mw/Widget/ScrollBar.h @@ -9,6 +9,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -24,7 +25,11 @@ MWDECL MwClass MwScrollBarClass; * %param handle Widget * %return Visible length */ -MWDECL int MwScrollBarGetVisibleLength(MwWidget handle); +MwInline int MwScrollBarGetVisibleLength(MwWidget handle) { + int out; + MwWidgetExecute(handle, "mwScrollBarGetVisibleLength", &out, NULL); + return out; +}; #ifdef __cplusplus } diff --git a/include/Mw/Widget/SubMenu.h b/include/Mw/Widget/SubMenu.h index 588a323..0063420 100644 --- a/include/Mw/Widget/SubMenu.h +++ b/include/Mw/Widget/SubMenu.h @@ -8,6 +8,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -18,7 +19,9 @@ extern "C" { */ MWDECL MwClass MwSubMenuClass; -MWDECL void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point); +MwInline void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point) { + MwWidgetExecute(handle, "mwSubMenuAppear", NULL, menu, point); +}; #ifdef __cplusplus } diff --git a/include/Mw/Widget/Viewport.h b/include/Mw/Widget/Viewport.h index 5a006d6..3d217e4 100644 --- a/include/Mw/Widget/Viewport.h +++ b/include/Mw/Widget/Viewport.h @@ -8,6 +8,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -23,7 +24,11 @@ MWDECL MwClass MwViewportClass; * %param handle Widget * %return Widget */ -MWDECL MwWidget MwViewportGetViewport(MwWidget handle); +MwInline MwWidget MwViewportGetViewport(MwWidget handle) { + MwWidget out; + MwWidgetExecute(handle, "mwViewportGetViewport", &out); + return out; +}; /*! * %brief Set viewport size @@ -31,7 +36,9 @@ MWDECL MwWidget MwViewportGetViewport(MwWidget handle); * %param w Width * %param h Height */ -MWDECL void MwViewportSetSize(MwWidget handle, int w, int h); +MwInline void MwViewportSetSize(MwWidget handle, int w, int h) { + MwWidgetExecute(handle, "mwViewportSetSize", NULL, w, h); +}; #ifdef __cplusplus } diff --git a/include/Mw/Widget/Vulkan.h b/include/Mw/Widget/Vulkan.h index 8591475..d5d41c3 100644 --- a/include/Mw/Widget/Vulkan.h +++ b/include/Mw/Widget/Vulkan.h @@ -21,6 +21,7 @@ #include #include +#include #include #ifdef __cplusplus @@ -112,7 +113,11 @@ typedef enum MwVulkanField_T { * %brief Function for getting a field from within Vulkan. * %warning Consult the documentation for MwVulkanField to know what type is expected for out. */ -MWDECL void* MwVulkanGetField(MwWidget handle, MwVulkanField field, MwErrorEnum* out); +MwInline void* MwVulkanGetField(MwWidget handle, MwVulkanField field, MwErrorEnum* out) { + void* field_out; + MwWidgetExecute(handle, "mwVulkanGetField", &field_out, field, out); + return field_out; +}; /*! * %brief Return whether Vulkan is installed on the target platform. diff --git a/include/Mw/Widget/Window.h b/include/Mw/Widget/Window.h index 91f8160..52ebac8 100644 --- a/include/Mw/Widget/Window.h +++ b/include/Mw/Widget/Window.h @@ -9,6 +9,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -24,7 +25,9 @@ MWDECL MwClass MwWindowClass; * %param handle Widget * %param toggle Toggle */ -MWDECL void MwWindowMakeBorderless(MwWidget handle, int toggle); +MwInline void MwWindowMakeBorderless(MwWidget handle, int toggle) { + MwWidgetExecute(handle, "mwWindowMakeBorderless", NULL, toggle); +}; #ifdef __cplusplus } diff --git a/src/core.c b/src/core.c index d0ada52..6da568d 100644 --- a/src/core.c +++ b/src/core.c @@ -230,6 +230,19 @@ void MwDestroyWidget(MwWidget handle) { handle->destroyed = 1; } +void MwWidgetExecute(MwWidget handle, const char* func_name, void* out, ...) { + va_list args; + va_start(args, out); + va_end(args); + MwVaWidgetExecute(handle, func_name, out, args); +} + +void MwVaWidgetExecute(MwWidget handle, const char* func_name, void* out, va_list va) { + if(handle->widget_class->execute != NULL) { + handle->widget_class->execute(handle, func_name, out, va); + } +} + static void clean_destroy_queue(MwWidget handle) { int i, j; for(i = 0; i < arrlen(handle->destroy_queue); i++) { diff --git a/src/widget/button.c b/src/widget/button.c index c3e2da9..f3404cd 100644 --- a/src/widget/button.c +++ b/src/widget/button.c @@ -76,7 +76,7 @@ MwClassRec MwButtonClassRec = { MwForceRender2, /* mouse_up */ MwForceRender2, /* mouse_down */ NULL, /* key */ - NULL, + NULL, /* custom */ NULL, NULL, NULL, diff --git a/src/widget/checkbox.c b/src/widget/checkbox.c index 57fc250..3562cb9 100644 --- a/src/widget/checkbox.c +++ b/src/widget/checkbox.c @@ -48,7 +48,7 @@ MwClassRec MwCheckBoxClassRec = { MwForceRender2, /* mouse_up */ MwForceRender2, /* mouse_down */ NULL, /* key */ - NULL, + NULL, /* custom */ NULL, NULL, NULL, diff --git a/src/widget/entry.c b/src/widget/entry.c index 62c7f09..caab181 100644 --- a/src/widget/entry.c +++ b/src/widget/entry.c @@ -134,7 +134,7 @@ MwClassRec MwEntryClassRec = { MwForceRender2, /* mouse_up */ MwForceRender2, /* mouse_down */ key, /* key */ - NULL, + NULL, /* custom */ NULL, NULL, NULL, diff --git a/src/widget/frame.c b/src/widget/frame.c index 68326ce..63af441 100644 --- a/src/widget/frame.c +++ b/src/widget/frame.c @@ -51,7 +51,7 @@ MwClassRec MwFrameClassRec = { NULL, /* mouse_up */ NULL, /* mouse_down */ NULL, /* key */ - NULL, + NULL, /* custom */ NULL, NULL, NULL, diff --git a/src/widget/image.c b/src/widget/image.c index 89636cd..3cbcbfe 100644 --- a/src/widget/image.c +++ b/src/widget/image.c @@ -39,7 +39,7 @@ MwClassRec MwImageClassRec = { NULL, /* mouse_up */ NULL, /* mouse_down */ NULL, /* key */ - NULL, + NULL, /* custom */ NULL, NULL, NULL, diff --git a/src/widget/label.c b/src/widget/label.c index 76e58d3..6dce018 100644 --- a/src/widget/label.c +++ b/src/widget/label.c @@ -56,7 +56,7 @@ MwClassRec MwLabelClassRec = { NULL, /* mouse_up */ NULL, /* mouse_down */ NULL, /* key */ - NULL, + NULL, /* custom */ NULL, NULL, NULL, diff --git a/src/widget/listbox.c b/src/widget/listbox.c index 82b3b35..5f04830 100644 --- a/src/widget/listbox.c +++ b/src/widget/listbox.c @@ -312,24 +312,6 @@ static void prop_change(MwWidget handle, const char* prop) { } } -MwClassRec MwListBoxClassRec = { - create, /* create */ - destroy, /* destroy */ - draw, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - prop_change, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - NULL, - NULL, - NULL, - NULL, - NULL}; -MwClass MwListBoxClass = &MwListBoxClassRec; - void MwListBoxVaInsert(MwWidget handle, int index, MwLLPixmap pixmap, va_list va) { MwListBox lb = handle->internal; MwListBoxEntry entry; @@ -392,7 +374,7 @@ void MwListBoxVaInsertMultiple(MwWidget handle, int index, int count, MwLLPixmap } } -void MwListBoxDelete(MwWidget handle, int index) { +static void mwListBoxDeleteImpl(MwWidget handle, int index) { MwListBox lb = handle->internal; int i; @@ -416,7 +398,7 @@ void MwListBoxDelete(MwWidget handle, int index) { } } -void MwListBoxReset(MwWidget handle) { +static void mwListBoxResetImpl(MwWidget handle) { MwListBox lb = handle->internal; int i; @@ -448,7 +430,7 @@ void MwListBoxInsert(MwWidget handle, int index, MwLLPixmap pixmap, ...) { va_end(va); } -const char* MwListBoxGet(MwWidget handle, int index) { +static const char* mwListBoxGetImpl(MwWidget handle, int index) { MwListBox lb = handle->internal; if(index < 0) return NULL; @@ -457,7 +439,7 @@ const char* MwListBoxGet(MwWidget handle, int index) { return lb->list[index].name[0]; } -void MwListBoxSetWidth(MwWidget handle, int index, int width) { +static void mwListBoxSetWidthImpl(MwWidget handle, int index, int width) { MwListBox lb = handle->internal; while(((index + 1) - arrlen(lb->width)) > 0) arrput(lb->width, 0); @@ -467,3 +449,42 @@ void MwListBoxSetWidth(MwWidget handle, int index, int width) { MwForceRender(handle); MwForceRender(lb->frame); } + +static void func_handler(MwWidget handle, const char* name, void* out, va_list va) { + (void)out; + + if(strcmp(name, "mwListBoxDelete") == 0) { + int index = va_arg(va, int); + mwListBoxDeleteImpl(handle, index); + } + if(strcmp(name, "mwListBoxReset") == 0) { + mwListBoxResetImpl(handle); + } + if(strcmp(name, "mwListBoxGet") == 0) { + int index = va_arg(va, int); + mwListBoxGetImpl(handle, index); + } + if(strcmp(name, "mwListBoxSetWidth") == 0) { + int index = va_arg(va, int); + int width = va_arg(va, int); + mwListBoxSetWidthImpl(handle, index, width); + } +} + +MwClassRec MwListBoxClassRec = { + create, /* create */ + destroy, /* destroy */ + draw, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + prop_change, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler, /* custom */ + NULL, + NULL, + NULL, + NULL}; +MwClass MwListBoxClass = &MwListBoxClassRec; diff --git a/src/widget/menu.c b/src/widget/menu.c index f095a39..2d982db 100644 --- a/src/widget/menu.c +++ b/src/widget/menu.c @@ -172,25 +172,7 @@ static void mouse_up(MwWidget handle, void* ptr) { MwForceRender(handle); } -MwClassRec MwMenuClassRec = { - create, /* create */ - destroy, /* destroy */ - draw, /* draw */ - NULL, /* click */ - parent_resize, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - mouse_up, /* mouse_up */ - mouse_down, /* mouse_down */ - NULL, /* key */ - NULL, - NULL, - NULL, - NULL, - NULL}; -MwClass MwMenuClass = &MwMenuClassRec; - -MwMenu MwMenuAdd(MwWidget handle, MwMenu menu, const char* name) { +static MwMenu mwMenuAddImpl(MwWidget handle, MwMenu menu, const char* name) { MwMenu m = menu == NULL ? handle->internal : menu; MwMenu new = malloc(sizeof(*new)); new->name = MwStringDupliacte(name); @@ -204,3 +186,29 @@ MwMenu MwMenuAdd(MwWidget handle, MwMenu menu, const char* name) { return new; } + +static void func_handler(MwWidget handle, const char* name, void* out, va_list va) { + if(strcmp(name, "mwMenuAdd") == 0) { + MwMenu menu = va_arg(va, MwMenu); + const char* name = va_arg(va, const char*); + *(MwMenu*)out = mwMenuAddImpl(handle, menu, name); + } +} + +MwClassRec MwMenuClassRec = { + create, /* create */ + destroy, /* destroy */ + draw, /* draw */ + NULL, /* click */ + parent_resize, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + mouse_up, /* mouse_up */ + mouse_down, /* mouse_down */ + NULL, /* key */ + func_handler, /* custom */ + NULL, + NULL, + NULL, + NULL}; +MwClass MwMenuClass = &MwMenuClassRec; diff --git a/src/widget/numberentry.c b/src/widget/numberentry.c index 98c2b19..31051ba 100644 --- a/src/widget/numberentry.c +++ b/src/widget/numberentry.c @@ -141,7 +141,7 @@ MwClassRec MwNumberEntryClassRec = { mouse_up, /* mouse_up */ mouse_down, /* mouse_down */ key, /* key */ - NULL, + NULL, /* custom */ NULL, NULL, NULL, diff --git a/src/widget/opengl.c b/src/widget/opengl.c index 5a18ff5..70bacab 100644 --- a/src/widget/opengl.c +++ b/src/widget/opengl.c @@ -126,25 +126,7 @@ static void destroy(MwWidget handle) { free(o); } -MwClassRec MwOpenGLClassRec = { - create, /* create */ - destroy, /* destroy */ - NULL, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - NULL, - NULL, - NULL, - NULL, - NULL}; -MwClass MwOpenGLClass = &MwOpenGLClassRec; - -void MwOpenGLMakeCurrent(MwWidget handle) { +static void mwOpenGLMakeCurrentImpl(MwWidget handle) { opengl_t* o = (opengl_t*)handle->internal; #ifdef _WIN32 o->wglMakeCurrent(o->dc, o->gl); @@ -153,7 +135,7 @@ void MwOpenGLMakeCurrent(MwWidget handle) { #endif } -void MwOpenGLSwapBuffer(MwWidget handle) { +static void mwOpenGLSwapBufferImpl(MwWidget handle) { opengl_t* o = (opengl_t*)handle->internal; #ifdef _WIN32 SwapBuffers(o->dc); @@ -164,7 +146,7 @@ void MwOpenGLSwapBuffer(MwWidget handle) { #endif } -void* MwOpenGLGetProcAddress(MwWidget handle, const char* name) { +static void* mwOpenGLGetProcAddressImpl(MwWidget handle, const char* name) { opengl_t* o = (opengl_t*)handle->internal; #ifdef _WIN32 return o->wglGetProcAddress(name); @@ -172,3 +154,34 @@ void* MwOpenGLGetProcAddress(MwWidget handle, const char* name) { return o->glXGetProcAddress((const GLubyte*)name); #endif } + +static void func_handler(MwWidget handle, const char* name, void* out, va_list va) { + if(strcmp(name, "mwOpenGLMakeCurrent") == 0) { + mwOpenGLMakeCurrentImpl(handle); + } + if(strcmp(name, "mwOpenGLSwapBuffer") == 0) { + mwOpenGLSwapBufferImpl(handle); + } + if(strcmp(name, "mwOpenGLGetProcAddress") == 0) { + const char* _name = va_arg(va, const char*); + *(void**)out = mwOpenGLGetProcAddressImpl(handle, _name); + } +} + +MwClassRec MwOpenGLClassRec = { + create, /* create */ + destroy, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler, /* custom */ + NULL, + NULL, + NULL, + NULL}; +MwClass MwOpenGLClass = &MwOpenGLClassRec; diff --git a/src/widget/scrollbar.c b/src/widget/scrollbar.c index fa4a037..6dc69a8 100644 --- a/src/widget/scrollbar.c +++ b/src/widget/scrollbar.c @@ -132,7 +132,7 @@ static void draw(MwWidget handle) { } static void mouse_move(MwWidget handle) { - int or = MwGetInteger(handle, MwNorientation); + int or = MwGetInteger(handle, MwNorientation); scrollbar_t* scr = handle->internal; if(!handle->pressed) return; @@ -160,9 +160,9 @@ static void mouse_move(MwWidget handle) { } static void mouse_down(MwWidget handle, void* ptr) { - int ww = MwGetInteger(handle, MwNwidth); - int wh = MwGetInteger(handle, MwNheight); - int or = MwGetInteger(handle, MwNorientation); + int ww = MwGetInteger(handle, MwNwidth); + int wh = MwGetInteger(handle, MwNheight); + int or = MwGetInteger(handle, MwNorientation); scrollbar_t* scr = handle->internal; MwLLMouse* m = ptr; @@ -219,25 +219,7 @@ static void prop_change(MwWidget handle, const char* key) { } } -MwClassRec MwScrollBarClassRec = { - create, /* create */ - destroy, /* destroy */ - draw, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - prop_change, /* prop_change */ - mouse_move, /* mouse_move */ - MwForceRender2, /* mouse_up */ - mouse_down, /* mouse_down */ - NULL, /* key */ - NULL, - NULL, - NULL, - NULL, - NULL}; -MwClass MwScrollBarClass = &MwScrollBarClassRec; - -int MwScrollBarGetVisibleLength(MwWidget handle) { +static int mwScrollBarGetVisibleLengthImpl(MwWidget handle) { int ww = MwGetInteger(handle, MwNwidth); int wh = MwGetInteger(handle, MwNheight); int or = MwGetInteger(handle, MwNorientation); @@ -253,3 +235,29 @@ int MwScrollBarGetVisibleLength(MwWidget handle) { } return s - tri - MwDefaultBorderWidth * 2; } + +static void func_handler(MwWidget handle, const char* name, void* out, va_list va) { + (void)va; + + if(strcmp(name, "mwScrollBarGetVisibleLength") == 0) { + *(int*)out = mwScrollBarGetVisibleLengthImpl(handle); + } +} + +MwClassRec MwScrollBarClassRec = { + create, /* create */ + destroy, /* destroy */ + draw, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + prop_change, /* prop_change */ + mouse_move, /* mouse_move */ + MwForceRender2, /* mouse_up */ + mouse_down, /* mouse_down */ + NULL, /* key */ + func_handler, /* custom */ + NULL, + NULL, + NULL, + NULL}; +MwClass MwScrollBarClass = &MwScrollBarClassRec; diff --git a/src/widget/submenu.c b/src/widget/submenu.c index d5d3d07..94c8fd3 100644 --- a/src/widget/submenu.c +++ b/src/widget/submenu.c @@ -146,25 +146,7 @@ static void click(MwWidget handle) { } } -MwClassRec MwSubMenuClassRec = { - create, /* create */ - destroy, /* destroy */ - draw, /* draw */ - click, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - MwForceRender2, /* mouse_up */ - MwForceRender2, /* mouse_down */ - NULL, /* key */ - NULL, - NULL, - NULL, - NULL, - NULL}; -MwClass MwSubMenuClass = &MwSubMenuClassRec; - -void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point) { +static void mwSubMenuAppearImpl(MwWidget handle, MwMenu menu, MwPoint* point) { int i, w = 0, h = 0; #ifdef UNIX XSetWindowAttributes xswa; @@ -204,3 +186,31 @@ void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point) { MwNheight, h, NULL); } + +static void func_handler(MwWidget handle, const char* name, void* out, va_list va) { + (void)out; + + if(strcmp(name, "mwSubMenuAppear") == 0) { + MwMenu menu = va_arg(va, MwMenu); + MwPoint* point = va_arg(va, MwPoint*); + mwSubMenuAppearImpl(handle, menu, point); + } +} + +MwClassRec MwSubMenuClassRec = { + create, /* create */ + destroy, /* destroy */ + draw, /* draw */ + click, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + MwForceRender2, /* mouse_up */ + MwForceRender2, /* mouse_down */ + NULL, /* key */ + func_handler, /* custom */ + NULL, + NULL, + NULL, + NULL}; +MwClass MwSubMenuClass = &MwSubMenuClassRec; diff --git a/src/widget/viewport.c b/src/widget/viewport.c index 6d368cc..6fad383 100644 --- a/src/widget/viewport.c +++ b/src/widget/viewport.c @@ -118,31 +118,13 @@ static void prop_change(MwWidget handle, const char* prop) { if(strcmp(prop, MwNwidth) == 0 || strcmp(prop, MwNheight) == 0) resize(handle); } -MwClassRec MwViewportClassRec = { - create, /* create */ - destroy, /* destroy */ - draw, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - prop_change, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - NULL, - NULL, - NULL, - NULL, - NULL}; -MwClass MwViewportClass = &MwViewportClassRec; - -MwWidget MwViewportGetViewport(MwWidget handle) { +static MwWidget mwViewportGetViewportImpl(MwWidget handle) { MwViewport vp = handle->internal; return vp->inframe; } -void MwViewportSetSize(MwWidget handle, int w, int h) { +static void mwViewportSetSizeImpl(MwWidget handle, int w, int h) { MwViewport vp = handle->internal; MwVaApply(vp->inframe, @@ -152,3 +134,32 @@ void MwViewportSetSize(MwWidget handle, int w, int h) { resize(handle); } + +static void func_handler(MwWidget handle, const char* name, void* out, va_list va) { + if(strcmp(name, "mwViewportGetViewport") == 0) { + *(MwWidget*)out = mwViewportGetViewportImpl(handle); + } + if(strcmp(name, "mwViewportSetSize") == 0) { + int w = va_arg(va, int); + int h = va_arg(va, int); + mwViewportSetSizeImpl(handle, w, h); + } +} + +MwClassRec MwViewportClassRec = { + create, /* create */ + destroy, /* destroy */ + draw, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + prop_change, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler, /* custom */ + NULL, + NULL, + NULL, + NULL}; +MwClass MwViewportClass = &MwViewportClassRec; diff --git a/src/widget/vulkan.c b/src/widget/vulkan.c index 0ec6ed1..7cf4e33 100644 --- a/src/widget/vulkan.c +++ b/src/widget/vulkan.c @@ -452,7 +452,25 @@ void MwVulkanEnableExtension(const char* name) { void MwVulkanEnableLayer(const char* name) { arrput(enabledLayers, name); } -void* MwVulkanGetField(MwWidget handle, MwVulkanField field, MwErrorEnum* out) { + +VkBool32 MwVulkanSupported(void) { + if(vulkan_supported == VULKAN_SUPPORTED_UNKNOWN) { + LIB_TYPE lib = vulkan_lib_load(); + if(lib == NULL) { + vulkan_supported = VULKAN_SUPPORTED_NO; + } else { + vulkan_supported = VULKAN_SUPPORTED_YES; + LIB_CLOSE(lib); + } + } + if(vulkan_supported == VULKAN_SUPPORTED_YES) { + return VK_TRUE; + } else { + return VK_FALSE; + } +}; + +static void* mwVulkanGetFieldImpl(MwWidget handle, MwVulkanField field, MwErrorEnum* out) { vulkan_t* o = handle->internal; switch(field) { @@ -486,35 +504,26 @@ void* MwVulkanGetField(MwWidget handle, MwVulkanField field, MwErrorEnum* out) { } }; -VkBool32 MwVulkanSupported(void) { - if(vulkan_supported == VULKAN_SUPPORTED_UNKNOWN) { - LIB_TYPE lib = vulkan_lib_load(); - if(lib == NULL) { - vulkan_supported = VULKAN_SUPPORTED_NO; - } else { - vulkan_supported = VULKAN_SUPPORTED_YES; - LIB_CLOSE(lib); - } +static void func_handler(MwWidget handle, const char* name, void* out, va_list va) { + if(strcmp(name, "mwVulkanGetField") == 0) { + MwVulkanField field = va_arg(va, MwVulkanField); + MwErrorEnum* err = va_arg(va, MwErrorEnum*); + *(void**)out = mwVulkanGetFieldImpl(handle, field, err); } - if(vulkan_supported == VULKAN_SUPPORTED_YES) { - return VK_TRUE; - } else { - return VK_FALSE; - } -}; +} MwClassRec MwVulkanClassRec = { - create, /* create */ - destroy, /* destroy */ - NULL, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - NULL, + create, /* create */ + destroy, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler, /* custom */ NULL, NULL, NULL, diff --git a/src/widget/window.c b/src/widget/window.c index 53b046b..e40400f 100644 --- a/src/widget/window.c +++ b/src/widget/window.c @@ -20,29 +20,32 @@ static void draw(MwWidget handle) { MwLLFreeColor(c); } +static void mwWindowMakeBorderlessImpl(MwWidget handle, int toggle) { + MwLLMakeBorderless(handle->lowlevel, toggle); +} +static void func_handler(MwWidget handle, const char* name, void* out, va_list va) { + (void)out; + + if(strcmp(name, "mwWindowMakeBorderless") == 0) { + int toggle = va_arg(va, int); + mwWindowMakeBorderlessImpl(handle, toggle); + } +} MwClassRec MwWindowClassRec = { - create, /* create */ - NULL, /* destroy */ - draw, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - NULL, + create, /* create */ + NULL, /* destroy */ + draw, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler, /* custom */ NULL, NULL, NULL, NULL}; MwClass MwWindowClass = &MwWindowClassRec; - -void MwWindowSetIcon(MwWidget handle, MwLLPixmap pixmap) { - MwLLSetIcon(handle->lowlevel, pixmap); -} - -void MwWindowMakeBorderless(MwWidget handle, int toggle) { - MwLLMakeBorderless(handle->lowlevel, toggle); -}