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).
+
+-
+
 | Prefer 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).
+
+-
+
 | Prefer 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.
+
+
+
-
@@ -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 @@
-
@@ -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);
-}