diff --git a/BorMakefile b/BorMakefile
index 8138859..9e8af9f 100644
--- a/BorMakefile
+++ b/BorMakefile
@@ -19,6 +19,7 @@ clean:
del /f /q src\color.obj
del /f /q src\directory.obj
del /f /q src\messagebox.obj
+ del /f /q src\string.obj
del /f /q src\boldfont.obj
del /f /q external\ds.obj
del /f /q external\image.obj
@@ -66,8 +67,8 @@ clean:
del /f /q src\Mw.dll
del /f /q oosrc\MwOO.dll
-src\Mw.dll: src\core.obj src\draw.obj src\default.obj src\lowlevel.obj src\error.obj src\unicode.obj src\font.obj src\color.obj src\directory.obj src\messagebox.obj src\boldfont.obj external\ds.obj external\image.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\question.obj src\icon\directory.obj src\icon\file.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\backend\gdi.obj
- $(LD) $(LDFLAGS) -e$@ src\core.obj src\draw.obj src\default.obj src\lowlevel.obj src\error.obj src\unicode.obj src\font.obj src\color.obj src\directory.obj src\messagebox.obj src\boldfont.obj external\ds.obj external\image.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\question.obj src\icon\directory.obj src\icon\file.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\backend\gdi.obj -lopengl32.lib -lgdi32.lib -luser32.lib
+src\Mw.dll: src\core.obj src\draw.obj src\default.obj src\lowlevel.obj src\error.obj src\unicode.obj src\font.obj src\color.obj src\directory.obj src\messagebox.obj src\string.obj src\boldfont.obj external\ds.obj external\image.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\question.obj src\icon\directory.obj src\icon\file.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\backend\gdi.obj
+ $(LD) $(LDFLAGS) -e$@ src\core.obj src\draw.obj src\default.obj src\lowlevel.obj src\error.obj src\unicode.obj src\font.obj src\color.obj src\directory.obj src\messagebox.obj src\string.obj src\boldfont.obj external\ds.obj external\image.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\question.obj src\icon\directory.obj src\icon\file.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\backend\gdi.obj -lopengl32.lib -lgdi32.lib -luser32.lib
implib src\Mw.lib src\Mw.dll
oosrc\MwOO.dll: oosrc\base.obj oosrc\widget\button.obj oosrc\widget\frame.obj oosrc\widget\image.obj oosrc\widget\menu.obj oosrc\widget\opengl.obj oosrc\widget\scrollbar.obj oosrc\widget\submenu.obj oosrc\widget\window.obj oosrc\widget\checkbox.obj oosrc\widget\viewport.obj oosrc\widget\listbox.obj oosrc\widget\label.obj oosrc\widget\entry.obj oosrc\widget\numberentry.obj
diff --git a/NTMakefile b/NTMakefile
index d143e2d..a6b9830 100644
--- a/NTMakefile
+++ b/NTMakefile
@@ -19,6 +19,7 @@ clean:
del /f /q src\color.obj
del /f /q src\directory.obj
del /f /q src\messagebox.obj
+ del /f /q src\string.obj
del /f /q src\boldfont.obj
del /f /q external\ds.obj
del /f /q external\image.obj
@@ -66,8 +67,8 @@ clean:
del /f /q src\Mw.dll
del /f /q oosrc\MwOO.dll
-src\Mw.dll: src\core.obj src\draw.obj src\default.obj src\lowlevel.obj src\error.obj src\unicode.obj src\font.obj src\color.obj src\directory.obj src\messagebox.obj src\boldfont.obj external\ds.obj external\image.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\question.obj src\icon\directory.obj src\icon\file.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\backend\gdi.obj
- $(LD) $(LDFLAGS) /OUT:$@ src\core.obj src\draw.obj src\default.obj src\lowlevel.obj src\error.obj src\unicode.obj src\font.obj src\color.obj src\directory.obj src\messagebox.obj src\boldfont.obj external\ds.obj external\image.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\question.obj src\icon\directory.obj src\icon\file.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\backend\gdi.obj opengl32.lib gdi32.lib user32.lib
+src\Mw.dll: src\core.obj src\draw.obj src\default.obj src\lowlevel.obj src\error.obj src\unicode.obj src\font.obj src\color.obj src\directory.obj src\messagebox.obj src\string.obj src\boldfont.obj external\ds.obj external\image.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\question.obj src\icon\directory.obj src\icon\file.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\backend\gdi.obj
+ $(LD) $(LDFLAGS) /OUT:$@ src\core.obj src\draw.obj src\default.obj src\lowlevel.obj src\error.obj src\unicode.obj src\font.obj src\color.obj src\directory.obj src\messagebox.obj src\string.obj src\boldfont.obj external\ds.obj external\image.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\question.obj src\icon\directory.obj src\icon\file.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\backend\gdi.obj opengl32.lib gdi32.lib user32.lib
oosrc\MwOO.dll: oosrc\base.obj oosrc\widget\button.obj oosrc\widget\frame.obj oosrc\widget\image.obj oosrc\widget\menu.obj oosrc\widget\opengl.obj oosrc\widget\scrollbar.obj oosrc\widget\submenu.obj oosrc\widget\window.obj oosrc\widget\checkbox.obj oosrc\widget\viewport.obj oosrc\widget\listbox.obj oosrc\widget\label.obj oosrc\widget\entry.obj oosrc\widget\numberentry.obj
diff --git a/WatMakefile b/WatMakefile
index 0d0c336..a3aab5e 100644
--- a/WatMakefile
+++ b/WatMakefile
@@ -18,6 +18,7 @@ clean: .SYMBOLIC
%erase src/color.obj
%erase src/directory.obj
%erase src/messagebox.obj
+ %erase src/string.obj
%erase src/boldfont.obj
%erase external/ds.obj
%erase external/image.obj
@@ -65,8 +66,8 @@ clean: .SYMBOLIC
%erase src/Mw.dll
%erase oosrc/MwOO.dll
-src/Mw.dll: src/core.obj src/draw.obj src/default.obj src/lowlevel.obj src/error.obj src/unicode.obj src/font.obj src/color.obj src/directory.obj src/messagebox.obj src/boldfont.obj external/ds.obj external/image.obj src/icon/info.obj src/icon/note.obj src/icon/warning.obj src/icon/error.obj src/icon/news.obj src/icon/question.obj src/icon/directory.obj src/icon/file.obj src/cursor/default.obj src/cursor/cross.obj src/cursor/text.obj src/widget/button.obj src/widget/frame.obj src/widget/opengl.obj src/widget/window.obj src/widget/menu.obj src/widget/entry.obj src/widget/submenu.obj src/widget/viewport.obj src/widget/image.obj src/widget/scrollbar.obj src/widget/checkbox.obj src/widget/label.obj src/widget/listbox.obj src/widget/numberentry.obj src/backend/gdi.obj
- $(LD) $(LDFLAGS) option implib=src/Mw.lib name $@ file src/core.obj file src/draw.obj file src/default.obj file src/lowlevel.obj file src/error.obj file src/unicode.obj file src/font.obj file src/color.obj file src/directory.obj file src/messagebox.obj file src/boldfont.obj file external/ds.obj file external/image.obj file src/icon/info.obj file src/icon/note.obj file src/icon/warning.obj file src/icon/error.obj file src/icon/news.obj file src/icon/question.obj file src/icon/directory.obj file src/icon/file.obj file src/cursor/default.obj file src/cursor/cross.obj file src/cursor/text.obj file src/widget/button.obj file src/widget/frame.obj file src/widget/opengl.obj file src/widget/window.obj file src/widget/menu.obj file src/widget/entry.obj file src/widget/submenu.obj file src/widget/viewport.obj file src/widget/image.obj file src/widget/scrollbar.obj file src/widget/checkbox.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/numberentry.obj file src/backend/gdi.obj library clib3r.lib library opengl32.lib library gdi32.lib library user32.lib
+src/Mw.dll: src/core.obj src/draw.obj src/default.obj src/lowlevel.obj src/error.obj src/unicode.obj src/font.obj src/color.obj src/directory.obj src/messagebox.obj src/string.obj src/boldfont.obj external/ds.obj external/image.obj src/icon/info.obj src/icon/note.obj src/icon/warning.obj src/icon/error.obj src/icon/news.obj src/icon/question.obj src/icon/directory.obj src/icon/file.obj src/cursor/default.obj src/cursor/cross.obj src/cursor/text.obj src/widget/button.obj src/widget/frame.obj src/widget/opengl.obj src/widget/window.obj src/widget/menu.obj src/widget/entry.obj src/widget/submenu.obj src/widget/viewport.obj src/widget/image.obj src/widget/scrollbar.obj src/widget/checkbox.obj src/widget/label.obj src/widget/listbox.obj src/widget/numberentry.obj src/backend/gdi.obj
+ $(LD) $(LDFLAGS) option implib=src/Mw.lib name $@ file src/core.obj file src/draw.obj file src/default.obj file src/lowlevel.obj file src/error.obj file src/unicode.obj file src/font.obj file src/color.obj file src/directory.obj file src/messagebox.obj file src/string.obj file src/boldfont.obj file external/ds.obj file external/image.obj file src/icon/info.obj file src/icon/note.obj file src/icon/warning.obj file src/icon/error.obj file src/icon/news.obj file src/icon/question.obj file src/icon/directory.obj file src/icon/file.obj file src/cursor/default.obj file src/cursor/cross.obj file src/cursor/text.obj file src/widget/button.obj file src/widget/frame.obj file src/widget/opengl.obj file src/widget/window.obj file src/widget/menu.obj file src/widget/entry.obj file src/widget/submenu.obj file src/widget/viewport.obj file src/widget/image.obj file src/widget/scrollbar.obj file src/widget/checkbox.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/numberentry.obj file src/backend/gdi.obj library clib3r.lib library opengl32.lib library gdi32.lib library user32.lib
oosrc/MwOO.dll: oosrc/base.obj oosrc/widget/button.obj oosrc/widget/frame.obj oosrc/widget/image.obj oosrc/widget/menu.obj oosrc/widget/opengl.obj oosrc/widget/scrollbar.obj oosrc/widget/submenu.obj oosrc/widget/window.obj oosrc/widget/checkbox.obj oosrc/widget/viewport.obj oosrc/widget/listbox.obj oosrc/widget/label.obj oosrc/widget/entry.obj oosrc/widget/numberentry.obj
@@ -94,6 +95,8 @@ src/directory.obj: src/directory.c
$(CC) $(CFLAGS) -fo=$@ $<
src/messagebox.obj: src/messagebox.c
$(CC) $(CFLAGS) -fo=$@ $<
+src/string.obj: src/string.c
+ $(CC) $(CFLAGS) -fo=$@ $<
src/boldfont.obj: src/boldfont.c
$(CC) $(CFLAGS) -fo=$@ $<
external/ds.obj: external/ds.c
diff --git a/doc/index.html b/doc/index.html
index 5849daa..d44d9d2 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -24,7 +24,7 @@
MwDEFAULT
- enum;
+ MwDIRECTORY_TYPE
MwMB_ICONMASK
@@ -299,6 +299,15 @@
Mw/Milsko.h
+
+ Mw/String.h
+
+
+ MwStringDupliacte
+
+
+ MwStringConcat
+
Mw/StringDefs.h
@@ -368,12 +377,21 @@
MwListBoxInsertMultiple
+
+ MwListBoxVaInsert
+
+
+ MwListBoxVaInsertMultiple
+
MwListBoxDelete
MwListBoxGet
+
+ MwListBoxSetWidth
+
Mw/Widget/Menu.h
@@ -537,7 +555,7 @@
-enum;
+enum MwDIRECTORY_TYPE;
-
Directory entry type.
@@ -2258,6 +2276,62 @@
+Mw/String.h
+
+-
+ String utilities.
+
+
+
+MWDECL char* MwStringDupliacte (
+ const char* str
+);
+
+-
+ Duplicates a string.
+
+-
+ Parameter
str
+
+-
+ String.
+
+-
+ Returns
+
+-
+ String.
+
+
+
+MWDECL char* MwStringConcat (
+ const char* str1,
+ const char* str2
+);
+
+-
+ Concatenates 2 strings.
+
+-
+ Parameter
str1
+
+-
+ String.
+
+-
+ Parameter
str2
+
+-
+ String.
+
+-
+ Returns
+
+-
+ String.
+
+
+
Mw/StringDefs.h
-
@@ -2446,8 +2520,8 @@
MWDECL void MwListBoxInsert (
MwWidget handle,
int index,
- const char* text,
- MwLLPixmap pixmap
+ MwLLPixmap pixmap,
+ ...
);
-
@@ -2465,26 +2539,26 @@
-
Index.
- -
- Parameter
text
-
--
- Text.
-
-
Parameter
pixmap
-
Pixmap.
+-
+ Parameter
...
+
+-
+ Text.
+
MWDECL void MwListBoxInsertMultiple (
MwWidget handle,
int index,
- char** text,
+ int count,
MwLLPixmap* pixmap,
- int count
+ ...
);
-
@@ -2503,10 +2577,10 @@
Index.
-
- Parameter
text
+ Parameter count
-
- Text.
+ Count.
-
Parameter
pixmap
@@ -2514,12 +2588,91 @@
-
Pixmap.
+-
+ Parameter
...
+
+-
+ Text.
+
+
+
+MWDECL void MwListBoxVaInsert (
+ MwWidget handle,
+ int index,
+ MwLLPixmap pixmap,
+ va_list va
+);
+
+-
+ Inserts item on the listbox.
+
+-
+ Parameter
handle
+
+-
+ Widget.
+
+-
+ Parameter
index
+
+-
+ Index.
+
+-
+ Parameter
pixmap
+
+-
+ Pixmap.
+
+-
+ Parameter
va
+
+-
+ Text.
+
+
+
+MWDECL void MwListBoxVaInsertMultiple (
+ MwWidget handle,
+ int index,
+ int count,
+ MwLLPixmap* pixmap,
+ va_list va
+);
+
+-
+ Inserts multiple items on the listbox.
+
+-
+ Parameter
handle
+
+-
+ Widget.
+
+-
+ Parameter
index
+
+-
+ Index.
+
-
Parameter
count
-
Count.
+-
+ Parameter
pixmap
+
+-
+ Pixmap.
+
+-
+ Parameter
va
+
+-
+ Text.
+
MWDECL void MwListBoxDelete (
@@ -2572,6 +2725,35 @@
+MWDECL void MwListBoxSetWidth (
+ MwWidget handle,
+ int index,
+ int width
+);
+
+-
+ Sets an item width of the listbox.
+
+-
+ Parameter
handle
+
+-
+ Widget.
+
+-
+ Parameter
index
+
+-
+ Column index.
+
+-
+ Parameter
width
+
+-
+ Width.
+
+
+
-
diff --git a/examples/basic/listbox.c b/examples/basic/listbox.c
index 2b4bc09..19476ea 100644
--- a/examples/basic/listbox.c
+++ b/examples/basic/listbox.c
@@ -25,13 +25,29 @@ void activate(MwWidget handle, void* user, void* call) {
int main() {
MwWidget lb;
+ int len = sizeof(harvard) / sizeof(harvard[0]) - 1;
+ char** list = malloc(sizeof(*list) * len);
+ int i;
wmain = MwVaCreateWidget(MwWindowClass, "main", NULL, MwDEFAULT, MwDEFAULT, 640, 480,
MwNtitle, "listbox",
NULL);
lb = MwCreateWidget(MwListBoxClass, "listbox", wmain, 5, 5, 630, 470);
+ for(i = 0; i < len; i++) {
+ list[i] = malloc(16);
+ sprintf(list[i], "%d", (int)strlen(harvard[i]));
+ }
+
MwAddUserHandler(lb, MwNactivateHandler, activate, NULL);
- MwListBoxInsertMultiple(lb, -1, (char**)harvard, NULL, sizeof(harvard) / sizeof(harvard[0]) - 1);
+ MwListBoxInsert(lb, -1, NULL, "Harvard sentences", "Length", NULL);
+ MwListBoxInsertMultiple(lb, -1, len, NULL, (char**)harvard, (char**)list, NULL);
+ MwVaApply(lb,
+ MwNhasHeading, 1,
+ NULL);
+ MwListBoxSetWidth(lb, 0, -64);
+
+ for(i = 0; i < len; i++) free(list[i]);
+ free(list);
MwLoop(wmain);
}
diff --git a/include/Mw/Constants.h b/include/Mw/Constants.h
index 6b14f23..bb52d09 100644
--- a/include/Mw/Constants.h
+++ b/include/Mw/Constants.h
@@ -41,7 +41,7 @@ enum MwALIGNMENT {
/*!
* %brief Directory entry type
*/
-enum {
+enum MwDIRECTORY_TYPE {
MwDIRECTORY_FILE = 0,
MwDIRECTORY_DIRECTORY
};
diff --git a/include/Mw/StringDefs.h b/include/Mw/StringDefs.h
index 69bb258..97fe556 100644
--- a/include/Mw/StringDefs.h
+++ b/include/Mw/StringDefs.h
@@ -20,6 +20,7 @@
#define MwNbold "Ibold"
#define MwNmain "Imain"
#define MwNleftPadding "IleftPadding"
+#define MwNhasHeading "IhasHeading"
#define MwNtitle "Stitle"
#define MwNtext "Stext"
diff --git a/include/Mw/TypeDefs.h b/include/Mw/TypeDefs.h
index e1a63c5..006265d 100644
--- a/include/Mw/TypeDefs.h
+++ b/include/Mw/TypeDefs.h
@@ -121,7 +121,7 @@ struct _MwViewport {
};
struct _MwListBoxEntry {
- char* name;
+ char** name;
MwLLPixmap pixmap;
};
@@ -132,6 +132,7 @@ struct _MwListBox {
int selected;
unsigned long click_time;
int pressed;
+ int* width;
};
struct _MwSizeHints {
diff --git a/include/Mw/Widget/ListBox.h b/include/Mw/Widget/ListBox.h
index 838d9c6..4a07ec1 100644
--- a/include/Mw/Widget/ListBox.h
+++ b/include/Mw/Widget/ListBox.h
@@ -23,20 +23,39 @@ MWDECL MwClass MwListBoxClass;
* %brief Inserts item on the listbox
* %param handle Widget
* %param index Index
- * %param text Text
* %param pixmap Pixmap
+ * %param ... Text
*/
-MWDECL void MwListBoxInsert(MwWidget handle, int index, const char* text, MwLLPixmap pixmap);
+MWDECL void MwListBoxInsert(MwWidget handle, int index, MwLLPixmap pixmap, ...); /* VA_HINT:pixmap */
/*!
* %brief Inserts multiple items on the listbox
* %param handle Widget
* %param index Index
- * %param text Text
- * %param pixmap Pixmap
* %param count Count
+ * %param pixmap Pixmap
+ * %param ... Text
*/
-MWDECL void MwListBoxInsertMultiple(MwWidget handle, int index, char** text, MwLLPixmap* pixmap, int count);
+MWDECL void MwListBoxInsertMultiple(MwWidget handle, int index, int count, MwLLPixmap* pixmap, ...); /* VA_HINT:pixmap */
+
+/*!
+ * %brief Inserts item on the listbox
+ * %param handle Widget
+ * %param index Index
+ * %param pixmap Pixmap
+ * %param va Text
+ */
+MWDECL void MwListBoxVaInsert(MwWidget handle, int index, MwLLPixmap pixmap, va_list va);
+
+/*!
+ * %brief Inserts multiple items on the listbox
+ * %param handle Widget
+ * %param index Index
+ * %param count Count
+ * %param pixmap Pixmap
+ * %param va Text
+ */
+MWDECL void MwListBoxVaInsertMultiple(MwWidget handle, int index, int count, MwLLPixmap* pixmap, va_list va);
/*!
* %brief Deletes item from the listbox
@@ -53,6 +72,14 @@ MWDECL void MwListBoxDelete(MwWidget handle, int index);
*/
MWDECL const char* MwListBoxGet(MwWidget handle, int index);
+/*!
+ * %brief Sets an item width of the listbox
+ * %param handle Widget
+ * %param index Column index
+ * %param width Width
+ */
+MWDECL void MwListBoxSetWidth(MwWidget handle, int index, int width);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/MwOO/Base.h b/include/MwOO/Base.h
index d03e4d6..5d7630a 100644
--- a/include/MwOO/Base.h
+++ b/include/MwOO/Base.h
@@ -33,6 +33,7 @@ class Base {
/* END AUTOGENERATE */
+ Base(void);
Base(MwClass widget_class, const char* widget_name, MwOO::Base* parent, int x, int y, int w, int h);
Base(MwWidget widget, int gc = 0);
~Base(void);
diff --git a/include/MwOO/Widget/ListBox.h b/include/MwOO/Widget/ListBox.h
index 8c5eeac..4867b23 100644
--- a/include/MwOO/Widget/ListBox.h
+++ b/include/MwOO/Widget/ListBox.h
@@ -8,10 +8,13 @@ namespace MwOO {
class ListBox : public MwOO::Base {
public:
ListBox(const char* widget_name, MwOO::Base* parent, int x, int y, int w, int h);
- void Insert(int index, const char* text, MwLLPixmap pixmap);
- void InsertMultiple(int index, char** text, MwLLPixmap* pixmap, int count);
+ void Insert(int index, MwLLPixmap pixmap, ...);
+ void InsertMultiple(int index, int count, MwLLPixmap* pixmap, ...);
+ void VaInsert(int index, MwLLPixmap pixmap, va_list va);
+ void VaInsertMultiple(int index, int count, MwLLPixmap* pixmap, va_list va);
void Delete(int index);
const char* Get(int index);
+ void SetWidth(int index, int width);
void SetLeftPadding(int value);
int GetLeftPadding(void);
void SetBackground(const char* value);
diff --git a/oosrc/base.cc b/oosrc/base.cc
index 0253268..b24cf3b 100644
--- a/oosrc/base.cc
+++ b/oosrc/base.cc
@@ -15,6 +15,11 @@ MwOO::Base::Base(MwWidget widget, int gc){
this->SetHandler();
}
+MwOO::Base::Base(void){
+ this->widget = NULL;
+ this->can_be_gc = 0;
+}
+
MwOO::Base::~Base(void){
if(this->can_be_gc) MwDestroyWidget(this->widget);
}
diff --git a/oosrc/widget/listbox.cc b/oosrc/widget/listbox.cc
index 16ea75b..e659fdc 100644
--- a/oosrc/widget/listbox.cc
+++ b/oosrc/widget/listbox.cc
@@ -5,18 +5,42 @@
MwOO::ListBox::ListBox(const char* widget_name, MwOO::Base* parent, int x, int y, int w, int h) : MwOO::Base(MwListBoxClass, widget_name, parent, x, y, w, h){
}
-void MwOO::ListBox::Insert(int index, const char* text, MwLLPixmap pixmap){
- MwListBoxInsert(this->widget, index, text, pixmap);
+void MwOO::ListBox::Insert(int index, MwLLPixmap pixmap, ...){
+ va_list va;
+ va_start(va, pixmap);
+ MwListBoxVaInsert(this->widget, index, pixmap, va);
+ va_end(va);
}
-void MwOO::ListBox::InsertMultiple(int index, char** text, MwLLPixmap* pixmap, int count){
- MwListBoxInsertMultiple(this->widget, index, text, pixmap, count);
+
+void MwOO::ListBox::InsertMultiple(int index, int count, MwLLPixmap* pixmap, ...){
+ va_list va;
+ va_start(va, pixmap);
+ MwListBoxVaInsertMultiple(this->widget, index, count, pixmap, va);
+ va_end(va);
}
+
+void MwOO::ListBox::VaInsert(int index, MwLLPixmap pixmap, va_list va){
+ MwListBoxVaInsert(this->widget, index, pixmap, va);
+}
+
+void MwOO::ListBox::VaInsertMultiple(int index, int count, MwLLPixmap* pixmap, va_list va){
+ MwListBoxVaInsertMultiple(this->widget, index, count, pixmap, va);
+}
+
void MwOO::ListBox::Delete(int index){
MwListBoxDelete(this->widget, index);
}
+
const char* MwOO::ListBox::Get(int index){
- return MwListBoxGet(this->widget, index);
+ const char* ret;
+ ret = MwListBoxGet(this->widget, index);
+ return ret;
}
+
+void MwOO::ListBox::SetWidth(int index, int width){
+ MwListBoxSetWidth(this->widget, index, width);
+}
+
void MwOO::ListBox::SetLeftPadding(int value){
MwSetInteger(this->widget, MwNleftPadding, value);
}
diff --git a/oosrc/widget/menu.cc b/oosrc/widget/menu.cc
index b6aa490..09ba2fc 100644
--- a/oosrc/widget/menu.cc
+++ b/oosrc/widget/menu.cc
@@ -6,8 +6,11 @@ MwOO::Menu::Menu(const char* widget_name, MwOO::Base* parent, int x, int y, int
}
MwMenu MwOO::Menu::Add(MwMenu menu, const char* name){
- return MwMenuAdd(this->widget, menu, name);
+ MwMenu ret;
+ ret = MwMenuAdd(this->widget, menu, name);
+ return ret;
}
+
void MwOO::Menu::SetBackground(const char* value){
MwSetText(this->widget, MwNbackground, value);
}
diff --git a/oosrc/widget/opengl.cc b/oosrc/widget/opengl.cc
index 78c6cc2..a42f3c3 100644
--- a/oosrc/widget/opengl.cc
+++ b/oosrc/widget/opengl.cc
@@ -8,12 +8,17 @@ MwOO::OpenGL::OpenGL(const char* widget_name, MwOO::Base* parent, int x, int y,
void MwOO::OpenGL::MakeCurrent(void){
MwOpenGLMakeCurrent(this->widget);
}
+
void* MwOO::OpenGL::GetProcAddress(const char* name){
- return MwOpenGLGetProcAddress(this->widget, name);
+ void* ret;
+ ret = MwOpenGLGetProcAddress(this->widget, name);
+ return ret;
}
+
void MwOO::OpenGL::SwapBuffer(void){
MwOpenGLSwapBuffer(this->widget);
}
+
void MwOO::OpenGL::SetBackground(const char* value){
MwSetText(this->widget, MwNbackground, value);
}
diff --git a/oosrc/widget/scrollbar.cc b/oosrc/widget/scrollbar.cc
index 6f65f87..e1e29ca 100644
--- a/oosrc/widget/scrollbar.cc
+++ b/oosrc/widget/scrollbar.cc
@@ -6,8 +6,11 @@ MwOO::ScrollBar::ScrollBar(const char* widget_name, MwOO::Base* parent, int x, i
}
int MwOO::ScrollBar::GetVisibleLength(void){
- return MwScrollBarGetVisibleLength(this->widget);
+ int ret;
+ ret = MwScrollBarGetVisibleLength(this->widget);
+ return ret;
}
+
void MwOO::ScrollBar::SetAreaShown(int value){
MwSetInteger(this->widget, MwNareaShown, value);
}
diff --git a/oosrc/widget/submenu.cc b/oosrc/widget/submenu.cc
index 02c56f7..6a98cbe 100644
--- a/oosrc/widget/submenu.cc
+++ b/oosrc/widget/submenu.cc
@@ -8,6 +8,7 @@ MwOO::SubMenu::SubMenu(const char* widget_name, MwOO::Base* parent, int x, int y
void MwOO::SubMenu::Appear(MwMenu menu, MwPoint* point){
MwSubMenuAppear(this->widget, menu, point);
}
+
void MwOO::SubMenu::SetBackground(const char* value){
MwSetText(this->widget, MwNbackground, value);
}
diff --git a/oosrc/widget/viewport.cc b/oosrc/widget/viewport.cc
index 0fcb25d..4b5d6ef 100644
--- a/oosrc/widget/viewport.cc
+++ b/oosrc/widget/viewport.cc
@@ -6,11 +6,15 @@ MwOO::Viewport::Viewport(const char* widget_name, MwOO::Base* parent, int x, int
}
MwOO::Base MwOO::Viewport::GetViewport(void){
- return MwOO::Base(MwViewportGetViewport(this->widget));
+ MwOO::Base ret;
+ ret = MwOO::Base(MwViewportGetViewport(this->widget));
+ return ret;
}
+
void MwOO::Viewport::SetSize(int w, int h){
MwViewportSetSize(this->widget, w, h);
}
+
void MwOO::Viewport::SetBackground(const char* value){
MwSetText(this->widget, MwNbackground, value);
}
diff --git a/oosrc/widget/vulkan.cc b/oosrc/widget/vulkan.cc
index e3db0cf..52afc7c 100644
--- a/oosrc/widget/vulkan.cc
+++ b/oosrc/widget/vulkan.cc
@@ -8,18 +8,27 @@ MwOO::Vulkan::Vulkan(const char* widget_name, MwOO::Base* parent, int x, int y,
void MwOO::Vulkan::EnableExtension(void){
MwVulkanEnableExtension(this->widget);
}
+
void MwOO::Vulkan::EnableLayer(void){
MwVulkanEnableLayer(this->widget);
}
+
void MwOO::Vulkan::Configure(void){
MwVulkanConfigure(this->widget);
}
+
void* MwOO::Vulkan::GetField(MwVulkanField field, MwErrorEnum* out){
- return MwVulkanGetField(this->widget, field, out);
+ void* ret;
+ ret = MwVulkanGetField(this->widget, field, out);
+ return ret;
}
+
VkBool32 MwOO::Vulkan::Supported(void){
- return MwVulkanSupported(this->widget);
+ VkBool32 ret;
+ ret = MwVulkanSupported(this->widget);
+ return ret;
}
+
void MwOO::Vulkan::SetBackground(const char* value){
MwSetText(this->widget, MwNbackground, value);
}
diff --git a/oosrc/widget/window.cc b/oosrc/widget/window.cc
index e1caa99..b27df5e 100644
--- a/oosrc/widget/window.cc
+++ b/oosrc/widget/window.cc
@@ -8,6 +8,7 @@ MwOO::Window::Window(const char* widget_name, MwOO::Base* parent, int x, int y,
void MwOO::Window::MakeBorderless(int toggle){
MwWindowMakeBorderless(this->widget, toggle);
}
+
void MwOO::Window::SetTitle(const char* value){
MwSetText(this->widget, MwNtitle, value);
}
diff --git a/src/widget/listbox.c b/src/widget/listbox.c
index 5c6e69f..e36bbe7 100644
--- a/src/widget/listbox.c
+++ b/src/widget/listbox.c
@@ -3,15 +3,54 @@
#include "../../external/stb_ds.h"
-static int get_first_entry(MwListBox lb) {
+static int get_first_entry(MwWidget handle, MwListBox lb) {
int st = 0;
- st = MwGetInteger(lb->vscroll, MwNvalue);
- st = st * (MwGetInteger(lb->vscroll, MwNmaxValue) - MwGetInteger(lb->vscroll, MwNareaShown)) / MwGetInteger(lb->vscroll, MwNmaxValue);
- if(st < 0) st = 0;
+ int y = MwGetInteger(handle, MwNhasHeading) ? 1 : 0;
+
+ st = MwGetInteger(lb->vscroll, MwNvalue);
+ st = st * (MwGetInteger(lb->vscroll, MwNmaxValue) - MwGetInteger(lb->vscroll, MwNareaShown)) / MwGetInteger(lb->vscroll, MwNmaxValue);
+ if(st < y) st = y;
return st;
}
+static int get_col_width(MwListBox lb, int ind) {
+ int total = MwGetInteger(lb->frame, MwNwidth);
+ int wid, i;
+ if(arrlen(lb->width) <= ind) {
+ wid = 0;
+ } else {
+ wid = lb->width[ind];
+ }
+ if(wid > 0) return wid;
+
+ if(wid == 0) {
+ for(i = 0; i < arrlen(lb->width) && i < ind; i++) {
+ int w = lb->width[i];
+ if(w < 0) {
+ total -= total + w;
+ } else if(wid > 0) {
+ total -= w;
+ }
+ }
+ return total;
+ }
+
+ if(wid < 0) {
+ for(i = 0; i < arrlen(lb->width) && i < ind; i++) {
+ int w = lb->width[i];
+ if(w < 0) {
+ total -= total + w;
+ } else if(wid > 0) {
+ total -= w;
+ }
+ }
+ return total + wid;
+ }
+
+ return 0;
+}
+
static void vscroll_changed(MwWidget handle, void* user, void* call) {
MwListBox lb = handle->parent->internal;
@@ -33,7 +72,7 @@ static void frame_mouse_down(MwWidget handle, void* user, void* call) {
int y = MwDefaultBorderWidth;
int h = MwGetInteger(handle, MwNheight);
- st = get_first_entry(lb);
+ st = get_first_entry(handle->parent, lb);
for(i = 0; i < (h - MwDefaultBorderWidth * 2) / MwTextHeight(handle, "M"); i++) {
if(y <= m->point.y && m->point.y <= (y + MwTextHeight(handle, "M"))) {
unsigned long t;
@@ -74,7 +113,7 @@ static void frame_mouse_move(MwWidget handle, void* user, void* call) {
int y = MwDefaultBorderWidth;
int h = MwGetInteger(handle, MwNheight);
- st = get_first_entry(lb);
+ st = get_first_entry(handle->parent, lb);
for(i = 0; i < (h - MwDefaultBorderWidth * 2) / MwTextHeight(handle, "M"); i++) {
if(y <= p->y && p->y <= (y + MwTextHeight(handle, "M"))) {
lb->selected = st + i;
@@ -103,17 +142,18 @@ static void frame_draw(MwWidget handle) {
p.x = MwDefaultBorderWidth + MwGetInteger(handle->parent, MwNleftPadding);
p.y = MwDefaultBorderWidth;
- st = get_first_entry(lb);
+ st = get_first_entry(handle->parent, lb);
for(i = st; i < arrlen(lb->list) && i < st + (r.height - MwDefaultBorderWidth * 2) / MwTextHeight(handle, "M"); i++) {
int selected = lb->selected == i ? 1 : 0;
+ int j;
if(selected) {
MwRect r2;
r2.x = 0;
r2.y = p.y;
r2.width = r.width;
- r2.height = MwTextHeight(handle, lb->list[i].name);
+ r2.height = MwTextHeight(handle, "M");
MwDrawRect(handle, &r2, text);
}
if(lb->list[i].pixmap != NULL) {
@@ -125,9 +165,14 @@ static void frame_draw(MwWidget handle) {
r2.height = h;
MwLLDrawPixmap(handle->lowlevel, &r2, lb->list[i].pixmap);
}
- p.y += MwTextHeight(handle, lb->list[i].name) / 2;
- MwDrawText(handle, &p, lb->list[i].name, 0, MwALIGNMENT_BEGINNING, selected ? base : text);
- p.y += MwTextHeight(handle, lb->list[i].name) / 2;
+ p.y += MwTextHeight(handle, "M") / 2;
+ p.x = 0;
+ for(j = 0; j < arrlen(lb->list[i].name); j++) {
+ p.x += MwDefaultBorderWidth;
+ if(strlen(lb->list[i].name[j]) > 0) MwDrawText(handle, &p, lb->list[i].name[j], 0, MwALIGNMENT_BEGINNING, selected ? base : text);
+ p.x += get_col_width(lb, j) - MwDefaultBorderWidth;
+ }
+ p.y += MwTextHeight(handle, "M") / 2;
}
MwDrawFrame(handle, &r, base, 1);
@@ -140,7 +185,10 @@ static void resize(MwWidget handle) {
MwListBox lb = handle->internal;
int w = MwGetInteger(handle, MwNwidth);
int h = MwGetInteger(handle, MwNheight);
- int ih;
+ int ih, y;
+
+ y = MwGetInteger(handle, MwNhasHeading) ? (MwTextHeight(handle, "M") + MwDefaultBorderWidth * 2) : 0;
+
if(lb->vscroll == NULL) {
lb->vscroll = MwVaCreateWidget(MwScrollBarClass, "vscroll", handle, w - 16, 0, 16, h, NULL);
MwAddUserHandler(lb->vscroll, MwNchangedHandler, vscroll_changed, NULL);
@@ -152,8 +200,10 @@ static void resize(MwWidget handle) {
MwNheight, h,
NULL);
}
+
+ h -= y;
if(lb->frame == NULL) {
- lb->frame = MwVaCreateWidget(MwFrameClass, "frame", handle, 0, 0, w - 16, h, NULL);
+ lb->frame = MwVaCreateWidget(MwFrameClass, "frame", handle, 0, y, w - 16, h, NULL);
lb->frame->draw_inject = frame_draw;
MwAddUserHandler(lb->frame, MwNmouseDownHandler, frame_mouse_down, NULL);
MwAddUserHandler(lb->frame, MwNmouseUpHandler, frame_mouse_up, NULL);
@@ -161,11 +211,12 @@ static void resize(MwWidget handle) {
} else {
MwVaApply(lb->frame,
MwNx, 0,
- MwNy, 0,
+ MwNy, y,
MwNwidth, w - 16,
MwNheight, h,
NULL);
}
+ h -= MwDefaultBorderWidth * 2;
ih = arrlen(lb->list);
if(ih == 0) ih = 1;
@@ -188,8 +239,10 @@ static int create(MwWidget handle) {
lb->list = NULL;
lb->selected = -1;
lb->click_time = 0;
+ lb->width = NULL;
MwSetInteger(handle, MwNleftPadding, 0);
+ MwSetInteger(handle, MwNhasHeading, 0);
return 0;
}
@@ -201,12 +254,15 @@ static void destroy(MwWidget handle) {
free(lb->list[i].name);
}
arrfree(lb->list);
+ arrfree(lb->width);
free(handle->internal);
}
static void draw(MwWidget handle) {
MwRect r;
MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground));
+ MwLLColor text = MwParseColor(handle, MwGetText(handle, MwNforeground));
+ MwListBox lb = handle->internal;
r.x = 0;
r.y = 0;
@@ -214,16 +270,43 @@ static void draw(MwWidget handle) {
r.height = MwGetInteger(handle, MwNheight);
MwDrawRect(handle, &r, base);
+ if(MwGetInteger(handle, MwNhasHeading) && arrlen(lb->list) > 0) {
+ MwPoint p;
+ int i;
+ int x = 0;
+ r.width -= 16;
+
+ for(i = 0; i < arrlen(lb->list[0].name); i++) {
+ r.x = x;
+ r.y = 0;
+ r.width = get_col_width(lb, i);
+ r.height = MwDefaultBorderWidth * 2 + MwTextHeight(handle, "M");
+ MwDrawFrame(handle, &r, base, 0);
+
+ x += MwDefaultBorderWidth;
+
+ p.x = x;
+ p.y = r.y + r.height / 2;
+ MwDrawText(handle, &p, lb->list[0].name[i], 0, MwALIGNMENT_BEGINNING, text);
+
+ x += r.width + MwDefaultBorderWidth;
+ }
+ }
+
+ MwLLFreeColor(text);
MwLLFreeColor(base);
}
static void prop_change(MwWidget handle, const char* prop) {
- if(strcmp(prop, MwNwidth) == 0 || strcmp(prop, MwNheight) == 0) resize(handle);
+ if(strcmp(prop, MwNwidth) == 0 || strcmp(prop, MwNheight) == 0 || strcmp(prop, MwNhasHeading) == 0) resize(handle);
if(strcmp(prop, MwNleftPadding) == 0) {
MwListBox lb = handle->internal;
MwForceRender(lb->frame);
}
+ if(strcmp(prop, MwNhasHeading) == 0) {
+ MwForceRender(handle);
+ }
}
MwClassRec MwListBoxClassRec = {
@@ -244,11 +327,16 @@ MwClassRec MwListBoxClassRec = {
NULL};
MwClass MwListBoxClass = &MwListBoxClassRec;
-void MwListBoxInsert(MwWidget handle, int index, const char* text, MwLLPixmap pixmap) {
+void MwListBoxVaInsert(MwWidget handle, int index, MwLLPixmap pixmap, va_list va) {
MwListBox lb = handle->internal;
MwListBoxEntry entry;
+ char* name;
- entry.name = MwStringDupliacte(text);
+ entry.name = NULL;
+ while((name = va_arg(va, char*)) != NULL) {
+ name = MwStringDupliacte(name);
+ arrput(entry.name, name);
+ }
entry.pixmap = pixmap;
@@ -261,17 +349,30 @@ void MwListBoxInsert(MwWidget handle, int index, const char* text, MwLLPixmap pi
}
}
-void MwListBoxInsertMultiple(MwWidget handle, int index, char** text, MwLLPixmap* pixmap, int count) {
+void MwListBoxVaInsertMultiple(MwWidget handle, int index, int count, MwLLPixmap* pixmap, va_list va) {
int i;
MwListBox lb = handle->internal;
int old;
+ char*** vlist = NULL;
+ char** list;
if(index == -1) index = arrlen(lb->list);
old = index;
+ while((list = va_arg(va, char**)) != NULL) {
+ arrput(vlist, list);
+ }
+
for(i = 0; i < count; i++) {
MwListBoxEntry entry;
+ char* name;
+ int j;
- entry.name = MwStringDupliacte(text[i]);
+ entry.name = NULL;
+ for(j = 0; j < arrlen(vlist); j++) {
+ if(vlist[j][i] == NULL) continue;
+ name = MwStringDupliacte(vlist[j][i]);
+ arrput(entry.name, name);
+ }
entry.pixmap = NULL;
if(pixmap != NULL) entry.pixmap = pixmap[i];
@@ -280,6 +381,8 @@ void MwListBoxInsertMultiple(MwWidget handle, int index, char** text, MwLLPixmap
index++;
}
+ arrfree(vlist);
+
resize(handle);
if(old < (MwGetInteger(lb->vscroll, MwNvalue) + MwGetInteger(lb->vscroll, MwNareaShown))) {
MwForceRender(lb->frame);
@@ -288,9 +391,13 @@ void MwListBoxInsertMultiple(MwWidget handle, int index, char** text, MwLLPixmap
void MwListBoxDelete(MwWidget handle, int index) {
MwListBox lb = handle->internal;
+ int i;
if(index == -1) index = arrlen(lb->list) - 1;
- free(lb->list[index].name);
+ for(i = 0; i < arrlen(lb->list[index].name); i++) {
+ free(lb->list[index].name[i]);
+ }
+ arrfree(lb->list[index].name);
arrdel(lb->list, index);
if(lb->selected >= arrlen(lb->list)) {
@@ -306,11 +413,36 @@ void MwListBoxDelete(MwWidget handle, int index) {
}
}
+void MwListBoxInsertMultiple(MwWidget handle, int index, int count, MwLLPixmap* pixmap, ...) {
+ va_list va;
+ va_start(va, pixmap);
+ MwListBoxVaInsertMultiple(handle, index, count, pixmap, va);
+ va_end(va);
+}
+
+void MwListBoxInsert(MwWidget handle, int index, MwLLPixmap pixmap, ...) {
+ va_list va;
+ va_start(va, pixmap);
+ MwListBoxVaInsert(handle, index, pixmap, va);
+ va_end(va);
+}
+
const char* MwListBoxGet(MwWidget handle, int index) {
MwListBox lb = handle->internal;
if(index < 0) return NULL;
if(index >= arrlen(lb->list)) return NULL;
- return lb->list[index].name;
+ return lb->list[index].name[0];
+}
+
+void MwListBoxSetWidth(MwWidget handle, int index, int width) {
+ MwListBox lb = handle->internal;
+
+ while(((index + 1) - arrlen(lb->width)) > 0) arrput(lb->width, 0);
+
+ lb->width[index] = width;
+
+ MwForceRender(handle);
+ MwForceRender(lb->frame);
}
diff --git a/tools/doc.pl b/tools/doc.pl
index ceef837..c8fb7a1 100755
--- a/tools/doc.pl
+++ b/tools/doc.pl
@@ -143,7 +143,7 @@ sub scan_dir {
$l =~ s/[ \t]+/ /g;
$l =~ s/[ ]*(?:\\|,[ ]*)$//g;
- $l =~ s/[ ]*(?:;|\{.*)[ ]*$/;/g;
+ $l =~ s/[ ]*(?:;( \/\*.+)?|\{.*)[ ]*$/;/g;
if (!($l =~ /^#/)) {
$l =~ s/\(([^\)]+)\)/arguments($1)/ge;
}
@@ -153,7 +153,7 @@ sub scan_dir {
$sl =~ s/=.+$//g;
$sl =~ s/^#[^ ]+(?:[ \t]+([^ \(]+)(?:.+$))?/\1/;
$sl =~ s/^.+[ \t]+([^ ]+)[ \t]*\(.+\);?$/\1/g;
- $sl =~ s/^.+[ \t]+([^ ]+);$/\1/g;
+ $sl =~ s/^.+[ \t]+([^ ]+);( \/\*.+)?$/\1/g;
$id = replace_special($current . "__" . $sl);
$attr = " id=\"$id\"";
diff --git a/tools/genoo.pl b/tools/genoo.pl
index 2f5c9b8..8e54426 100755
--- a/tools/genoo.pl
+++ b/tools/genoo.pl
@@ -44,6 +44,7 @@ foreach my $f (@files) {
my @props = ();
my @methods = ();
my @omethods = ();
+ my @comments = ();
my @names = ();
my @args = ();
@@ -55,12 +56,13 @@ foreach my $f (@files) {
@props = split(/[ \t]+/, $1);
}
elsif ($l =~
-/^MWDECL[ \t]+(.+)[ \t]+Mw${name}([^ \t]+)[ \t]*\([^,\)]+(?:,(.*))?\);$/
+/^MWDECL[ \t]+(.+)[ \t]+Mw${name}([^ \t]+)[ \t]*\([^,\)]+(?:,(.*))?\);(?: \/\*(.+))?$/
)
{
my $arg = $3;
my $ret = $1;
my $nam = $2;
+ my $com = $4;
$arg =~ s/^[ \t]+//;
$arg =~ s/[ \t]+$//;
@@ -72,6 +74,7 @@ foreach my $f (@files) {
push(@methods, "$ret $nam($arg)");
push(@omethods, "$ret MwOO::${name}::$nam($arg)");
push(@names, $nam);
+ push(@comments, $com);
my @al = split(/[ \t]*,[ \t]*/, $arg);
my $i = 0;
@@ -152,7 +155,8 @@ foreach my $f (@files) {
my $i = 0;
foreach my $m (@omethods) {
- my $end = "";
+ my $end = "";
+ my $suffix = "";
if ($m =~ /^MwWidget[ \t]+/) {
my $l = $m;
$l =~ s/^MwWidget([ \t]+)/MwOO::Base\1/;
@@ -161,23 +165,46 @@ foreach my $f (@files) {
else {
print(OUT "$m\{\n");
}
+ if ($args[$i] =~ /\.\.\./) {
+ print(OUT " va_list va;\n");
+ }
+ if (!($m =~ /^void[ \t]+/)) {
+ my $rettype = $m;
+ $rettype =~ s/^MwWidget([ \t]+)/MwOO::Base\1/;
+ $rettype =~ s/ MwOO::.+\)$//;
+ print(OUT " $rettype ret;\n");
+ }
+ if ($args[$i] =~ /\.\.\./) {
+ my $p = $comments[$i];
+ $p =~ /VA_HINT:([^ ]+)/;
+ print(OUT " va_start(va, $1);\n");
+ $suffix = "Va";
+ }
if ($m =~ /^void[ \t]+/) {
- print(OUT " Mw${name}" . $names[$i]);
+ print(OUT " Mw${name}$suffix" . $names[$i]);
}
elsif ($m =~ /^MwWidget[ \t]+/) {
- print(OUT " return MwOO::Base(Mw${name}" . $names[$i]);
+ print(OUT " ret = MwOO::Base(Mw${name}$suffix" . $names[$i]);
$end = ")";
}
else {
- print(OUT " return Mw${name}" . $names[$i]);
+ print(OUT " ret = Mw${name}$suffix" . $names[$i]);
}
if ($args[$i] eq "void") {
print(OUT "(this->widget)$end;\n");
}
else {
- print(OUT "(this->widget, " . $args[$i] . ")$end;\n");
+ my $p = $args[$i];
+ $p =~ s/\.\.\./va/;
+ print(OUT "(this->widget, " . $p . ")$end;\n");
}
- print(OUT "}\n");
+ if ($args[$i] =~ /\.\.\./) {
+ print(OUT " va_end(va);\n");
+ }
+ if (!($m =~ /^void[ \t]+/)) {
+ print(OUT " return ret;\n");
+ }
+ print(OUT "}\n\n");
$i++;
}
foreach my $prop (@props) {