From 023ad0c068b1be5637357cf34fe33ff52c200f52 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Mon, 9 Jun 2025 08:49:20 +0200 Subject: [PATCH] simplify attachment_set_image --- application/attachment.c | 10 +- ui/cocoa/Makefile | 4 +- ui/cocoa/button.m | 46 ++-- ui/cocoa/container.h | 14 +- ui/cocoa/container.m | 10 +- ui/cocoa/text.m | 14 +- ui/common/args.c | 561 +++++++++++++++++++++++++++++++++++++++ ui/common/args.h | 156 +++++++++++ ui/common/menu.c | 74 +++--- ui/common/objs.mk | 2 +- ui/common/toolbar.c | 44 +-- ui/common/types.c | 25 ++ ui/gtk/Makefile | 6 +- ui/gtk/button.c | 76 +++--- ui/gtk/container.c | 193 +++++++++----- ui/gtk/container.h | 4 +- ui/gtk/display.c | 46 ++-- ui/gtk/entry.c | 36 +-- ui/gtk/image.c | 48 ++-- ui/gtk/list.c | 200 +++++++------- ui/gtk/text.c | 98 +++---- ui/gtk/webview.c | 17 +- ui/gtk/widget.c | 4 +- ui/motif/Makefile | 5 +- ui/motif/button.c | 60 ++--- ui/motif/container.c | 38 +-- ui/motif/container.h | 16 +- ui/motif/label.c | 30 +-- ui/motif/list.c | 34 +-- ui/motif/text.c | 36 +-- ui/motif/widget.c | 7 +- ui/qt/button.cpp | 36 +-- ui/qt/container.cpp | 22 +- ui/qt/container.h | 16 +- ui/qt/entry.cpp | 32 +-- ui/qt/label.cpp | 16 +- ui/qt/list.cpp | 22 +- ui/qt/qt5.pro | 2 + ui/qt/text.cpp | 14 +- ui/qt/widget.cpp | 4 +- ui/ui/button.h | 20 +- ui/ui/container.h | 107 ++++---- ui/ui/display.h | 20 +- ui/ui/entry.h | 4 +- ui/ui/image.h | 4 +- ui/ui/menu.h | 24 +- ui/ui/text.h | 20 +- ui/ui/toolbar.h | 14 +- ui/ui/toolkit.h | 2 + ui/ui/tree.h | 20 +- ui/ui/webview.h | 4 +- ui/ui/widget.h | 16 +- 52 files changed, 1577 insertions(+), 756 deletions(-) create mode 100644 ui/common/args.c create mode 100644 ui/common/args.h diff --git a/application/attachment.c b/application/attachment.c index f222c21..c94dfe3 100644 --- a/application/attachment.c +++ b/application/attachment.c @@ -72,14 +72,8 @@ void attachment_create_ui_model(UiContext *ctx, Attachment *attachment, Note *no * img: toolkit image object (for example for gtk this would be GdkPixbuf*) */ void attachment_set_image(Attachment *attachment, void *img) { - ui_image_ref(img); - // TODO: replace this with new toolkit function for setting UiGeneric values - if(attachment->ui->img->set) { - attachment->ui->img->set(attachment->ui->img, img, UI_IMAGE_OBJECT_TYPE); - } else { - attachment->ui->img->value = img; - attachment->ui->img->type = UI_IMAGE_OBJECT_TYPE; - } + ui_image_ref(img); // TODO: is this needed? + ui_generic_set_image(attachment->ui->img, img); } int attachment_set_image_from_data(Attachment *attachment, cxmutstr data) { diff --git a/ui/cocoa/Makefile b/ui/cocoa/Makefile index 08304f4..a772b55 100644 --- a/ui/cocoa/Makefile +++ b/ui/cocoa/Makefile @@ -27,8 +27,10 @@ # $(COCOA_OBJPRE)%.o: cocoa/%.m - $(CC) -o $@ -c -I../ucx -fobjc-arc $(CFLAGS) $(TK_CFLAGS) $< + $(CC) -o $@ -c -I../ucx -fobjc-arc $(CFLAGS) $(SHLIB_CFLAGS) $(TK_CFLAGS) $< $(UI_LIB): $(OBJ) $(AR) $(ARFLAGS) $(UI_LIB) $(OBJ) +$(UI_SHLIB): $(OBJ) + $(CC) -o $(UI_SHLIB) $(LDFLAGS) $(SHLIB_LDFLAGS) $(TK_LDFLAGS) $(OBJ) -L../build/lib -lucx diff --git a/ui/cocoa/button.m b/ui/cocoa/button.m index e819fb0..06793f3 100644 --- a/ui/cocoa/button.m +++ b/ui/cocoa/button.m @@ -31,15 +31,15 @@ #import "Container.h" #import -UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) { +UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) { NSButton *button = [[NSButton alloc] init]; - if(args.label) { - NSString *label = [[NSString alloc] initWithUTF8String:args.label]; + if(args->label) { + NSString *label = [[NSString alloc] initWithUTF8String:args->label]; button.title = label; } - if(args.onclick) { - EventData *event = [[EventData alloc] init:args.onclick userdata:args.onclickdata]; + if(args->onclick) { + EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata]; event.obj = obj; button.target = event; button.action = @selector(handleEvent:); @@ -59,17 +59,17 @@ static void togglebutton_eventdata(id button, UiVar *var, void **eventdata, int *value = (int)state; } -UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs args, enum NSButtonType type) { +UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs *args, enum NSButtonType type) { NSButton *button = [[NSButton alloc] init]; [button setButtonType:type]; //[button setAllowsMixedState:YES]; - if(args.label) { - NSString *label = [[NSString alloc] initWithUTF8String:args.label]; + if(args->label) { + NSString *label = [[NSString alloc] initWithUTF8String:args->label]; button.title = label; } - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); if(var) { UiInteger *i = var->value; i->obj = (__bridge void*)button; @@ -77,8 +77,8 @@ UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs args, enum NSButtonType i->set = ui_togglebutton_set; } - if(args.onchange) { - EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; + if(args->onchange) { + EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; event.get_eventdata = togglebutton_eventdata; event.obj = obj; event.var = var; @@ -113,11 +113,11 @@ void ui_togglebutton_set(UiInteger *i, int64_t value) { button.state = state; } -UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { return togglebutton_create(obj, args, NSButtonTypePushOnPushOff); } -UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { return togglebutton_create(obj, args, NSButtonTypeSwitch); } @@ -127,10 +127,10 @@ static void switch_eventdata(id button, UiVar *var, void **eventdata, int *value *value = (int)state; } -UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { NSSwitch *button = [[NSSwitch alloc] init]; - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); if(var) { UiInteger *i = var->value; i->obj = (__bridge void*)button; @@ -138,8 +138,8 @@ UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { i->set = ui_switch_set; } - if(args.onchange) { - EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; + if(args->onchange) { + EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; event.get_eventdata = switch_eventdata; event.obj = obj; event.var = var; @@ -204,14 +204,14 @@ static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, int * } } -UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) { UiRadioButton *button = [[UiRadioButton alloc] init]; - if(args.label) { - button.title = [[NSString alloc] initWithUTF8String:args.label]; + if(args->label) { + button.title = [[NSString alloc] initWithUTF8String:args->label]; } - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); button.var = var; NSMutableArray *buttons = nil; if(var) { @@ -227,8 +227,8 @@ UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { objc_setAssociatedObject(button, "radiogroup", buttons, OBJC_ASSOCIATION_RETAIN); } - if(args.onchange || var) { - EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; + if(args->onchange || var) { + EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; event.get_eventdata = radiobutton_eventdata; event.obj = obj; event.var = var; diff --git a/ui/cocoa/container.h b/ui/cocoa/container.h index a024a18..b1796b5 100644 --- a/ui/cocoa/container.h +++ b/ui/cocoa/container.h @@ -56,13 +56,13 @@ struct UiLayout { }; #define UI_INIT_LAYOUT(args) (UiLayout) {\ - .fill = args.fill, \ - .hexpand = args.hexpand, \ - .vexpand = args.vexpand, \ - .hfill = args.hfill, \ - .vfill = args.vfill, \ - .colspan = args.colspan, \ - .rowspan = args.rowspan } + .fill = args->fill, \ + .hexpand = args->hexpand, \ + .vexpand = args->vexpand, \ + .hfill = args->hfill, \ + .vfill = args->vfill, \ + .colspan = args->colspan, \ + .rowspan = args->rowspan } @protocol Container diff --git a/ui/cocoa/container.m b/ui/cocoa/container.m index 99b18c9..6e9b466 100644 --- a/ui/cocoa/container.m +++ b/ui/cocoa/container.m @@ -95,8 +95,8 @@ /* -------------------- public container functions --------------------- */ -static UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs args, NSUserInterfaceLayoutOrientation orientation) { - BoxContainer *box = [[BoxContainer alloc] init:orientation spacing:args.spacing]; +static UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, NSUserInterfaceLayoutOrientation orientation) { + BoxContainer *box = [[BoxContainer alloc] init:orientation spacing:args->spacing]; box.translatesAutoresizingMaskIntoConstraints = false; // add box to the parent @@ -109,15 +109,15 @@ static UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs args, NSUserInterfa return (__bridge void*)box; } -UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) { +UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) { return ui_box_create(obj, args, NSUserInterfaceLayoutOrientationVertical); } -UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) { +UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) { return ui_box_create(obj, args, NSUserInterfaceLayoutOrientationHorizontal); } -UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) { +UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { GridLayout *grid = [[GridLayout alloc] init]; grid.translatesAutoresizingMaskIntoConstraints = false; diff --git a/ui/cocoa/text.m b/ui/cocoa/text.m index 7b9ba6e..1fe0ce3 100644 --- a/ui/cocoa/text.m +++ b/ui/cocoa/text.m @@ -31,7 +31,7 @@ #import "Container.h" #import -UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { +UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { NSTextView *textview = [[NSTextView alloc] init]; textview.autoresizingMask = NSViewWidthSizable; textview.minSize = NSMakeSize(0, 0); @@ -45,7 +45,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { ui_container_add(obj, scrollview, &layout, TRUE); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_TEXT); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_TEXT); if(var) { UiText *text = var->value; text->obj = (__bridge void*)textview; @@ -137,7 +137,7 @@ void ui_textarea_remove(UiText *text, int begin, int end) { /* -------------------------- TextField -------------------------- */ -static UIWIDGET textfield_create(UiObject *obj, UiTextFieldArgs args, BOOL password, BOOL frameless) { +static UIWIDGET textfield_create(UiObject *obj, UiTextFieldArgs *args, BOOL password, BOOL frameless) { NSTextField *textfield; if(password) { textfield = [[NSSecureTextField alloc] init]; @@ -152,7 +152,7 @@ static UIWIDGET textfield_create(UiObject *obj, UiTextFieldArgs args, BOOL passw UiLayout layout = UI_INIT_LAYOUT(args); ui_container_add(obj, textfield, &layout, FALSE); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); if(var) { UiString *s = var->value; if(s->value.ptr) { @@ -169,15 +169,15 @@ static UIWIDGET textfield_create(UiObject *obj, UiTextFieldArgs args, BOOL passw return (__bridge void*)textfield; } -UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args) { +UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) { return textfield_create(obj, args, FALSE, FALSE); } -UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) { return textfield_create(obj, args, FALSE, TRUE); } -UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { return textfield_create(obj, args, TRUE, FALSE); } diff --git a/ui/common/args.c b/ui/common/args.c new file mode 100644 index 0000000..f80692a --- /dev/null +++ b/ui/common/args.c @@ -0,0 +1,561 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2025 Olaf Wintermann. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "args.h" + +#include +#include + +#include "../ui/container.h" + +/* ---------------------------- UiMenuItemArgs ---------------------------- */ + +UiMenuItemArgs* ui_menuitem_args_new(void) { + UiMenuItemArgs *args = malloc(sizeof(UiMenuItemArgs)); + memset(args, 0, sizeof(UiMenuItemArgs)); + return args; +} + +void ui_menuitem_args_set_label(UiMenuItemArgs *args, const char *label) { + args->label = strdup(label); +} + +void ui_menuitem_args_set_stockid(UiMenuItemArgs *args, const char *stockid) { + args->stockid = strdup(stockid); +} + +void ui_menuitem_args_set_icon(UiMenuItemArgs *args, const char *icon) { + args->icon = strdup(icon); +} + +void ui_menuitem_args_set_onclick(UiMenuItemArgs *args, ui_callback callback) { + args->onclick = callback; +} + +void ui_menuitem_args_set_onclickdata(UiMenuItemArgs *args, void *onclickdata) { + args->onclickdata = onclickdata; +} + +void ui_menuitem_args_free(UiMenuItemArgs *args) { + free((void*)args->label); + free((void*)args->stockid); + free((void*)args->icon); + free(args); +} + + +/* ---------------------------- UiMenuToggleItemArgs ---------------------------- */ + +UiMenuToggleItemArgs* ui_menutoggleitem_args_new(void) { + UiMenuToggleItemArgs *args = malloc(sizeof(UiMenuToggleItemArgs)); + memset(args, 0, sizeof(UiMenuToggleItemArgs)); + return args; +} + +void ui_menutoggleitem_args_set_label(UiMenuToggleItemArgs *args, const char *label) { + args->label = strdup(label); +} + +void ui_menutoggleitem_args_set_stockid(UiMenuToggleItemArgs *args, const char *stockid) { + args->stockid = strdup(stockid); +} + +void ui_menutoggleitem_args_set_icon(UiMenuToggleItemArgs *args, const char *icon) { + args->icon = strdup(icon); +} + +void ui_menutoggleitem_args_set_varname(UiMenuToggleItemArgs *args, const char *varname) { + args->varname = strdup(varname); +} + +void ui_menutoggleitem_args_set_onchange(UiMenuToggleItemArgs *args, ui_callback callback) { + args->onchange = callback; +} + +void ui_menutoggleitem_args_set_onchangedata(UiMenuToggleItemArgs *args, void *onclickdata) { + args->onchangedata = onclickdata; +} + +void ui_menutoggleitem_args_free(UiMenuToggleItemArgs *args) { + free((void*)args->label); + free((void*)args->stockid); + free((void*)args->icon); + free((void*)args->varname); + free(args); +} + +/* --------------------------- UiMenuItemListArgs --------------------------- */ + +UiMenuItemListArgs* ui_menuitemlist_args_new(void) { + UiMenuItemListArgs *args = malloc(sizeof(UiMenuItemListArgs)); + memset(args, 0, sizeof(UiMenuItemListArgs)); + return args; +} + +void ui_menuitemlist_args_set_varname(UiMenuItemListArgs *args, const char *varname) { + args->varname = strdup(varname); +} + +void ui_menuitemlist_args_set_getvalue(UiMenuItemListArgs *args, ui_getvaluefunc func) { + args->getvalue = func; +} + +void ui_menuitemlist_args_set_onselect(UiMenuItemListArgs *args, ui_callback callback) { + args->onselect = callback; +} + +void ui_menuitemlist_args_set_onselectdata(UiMenuItemListArgs *args, void *data){ + args->onselectdata = data; +} + +void ui_menuitemlist_args_set_addseparator(UiMenuItemListArgs *args, UiBool value) { + args->addseparator = value; +} + +void ui_menuitemlist_args_free(UiMenuItemListArgs *args){ + free((void*)args->varname); + free(args); +} + + +/* ---------------------------- UiContainerArgs ---------------------------- */ + +UiContainerArgs* ui_container_args_new(void) { + UiContainerArgs *args = malloc(sizeof(UiContainerArgs)); + memset(args, 0, sizeof(UiContainerArgs)); + return args; +} + +void ui_container_args_set_fill(UiContainerArgs *args, UiBool fill) { + args->fill = fill ? UI_ON : UI_OFF; +} + +void ui_container_args_set_hexpand(UiContainerArgs *args, UiBool value) { + args->hexpand = value; +} + + +void ui_container_args_set_vexpand(UiContainerArgs *args, UiBool value) { + args->vexpand = value; +} + + +void ui_container_args_set_hfill(UiContainerArgs *args, UiBool value) { + args->hfill = value; +} + + +void ui_container_args_set_vfill(UiContainerArgs *args, UiBool value) { + args->vfill = value; +} + + +void ui_container_args_set_override_defaults(UiContainerArgs *args, UiBool value) { + args->override_defaults = value; +} + + +void ui_container_args_set_colspan(UiContainerArgs *args, int colspan) { + args->colspan = colspan; +} + + +void ui_container_args_set_rolspan(UiContainerArgs *args, int rowspan) { + args->rowspan = rowspan; +} + + +void ui_container_args_set_def_hexpand(UiContainerArgs *args, UiBool value) { + args->def_hexpand = value; +} + + +void ui_container_args_set_def_vexpand(UiContainerArgs *args, UiBool value) { + args->def_vexpand = value; +} + + +void ui_container_args_set_def_hfill(UiContainerArgs *args, UiBool value) { + args->def_hfill = value; +} + + +void ui_container_args_set_def_vfill(UiContainerArgs *args, UiBool value) { + args->def_vfill = value; +} + + +void ui_container_args_set_name(UiContainerArgs *args, const char *name) { + args->name = strdup(name); +} + + +void ui_container_args_set_style_class(UiContainerArgs *args, const char *classname) { + args->style_class = strdup(classname); +} + + +void ui_container_args_set_margin(UiContainerArgs *args, int value) { + args->margin = value; +} + + +void ui_container_args_set_spacing(UiContainerArgs *args, int value) { + args->spacing = value; +} + + +void ui_container_args_set_columnspacing(UiContainerArgs *args, int value) { + args->columnspacing = value; +} + + +void ui_container_args_set_rowspacing(UiContainerArgs *args, int value) { + args->rowspacing = value; +} + + +void ui_container_args_free(UiContainerArgs *args) { + free((void*)args->name); + free((void*)args->style_class); + free(args); +} + + +/* ------------------------------- UiFrameArgs ------------------------------*/ + +UiFrameArgs* ui_frame_args_new(void) { + UiFrameArgs *args = malloc(sizeof(UiFrameArgs)); + memset(args, 0, sizeof(UiContainerArgs)); + return args; +} + + +void ui_frame_args_set_fill(UiFrameArgs *args, UiBool fill) { + args->fill = fill ? UI_ON : UI_OFF; +} + + +void ui_frame_args_set_hexpand(UiFrameArgs *args, UiBool value) { + args->hexpand = value; +} + + +void ui_frame_args_set_vexpand(UiFrameArgs *args, UiBool value) { + args->vexpand = value; +} + + +void ui_frame_args_set_hfill(UiFrameArgs *args, UiBool value) { + args->hfill = value; +} + + +void ui_frame_args_set_vfill(UiFrameArgs *args, UiBool value) { + args->vfill = value; +} + + +void ui_frame_args_set_override_defaults(UiFrameArgs *args, UiBool value) { + args->override_defaults = value; +} + + +void ui_frame_args_set_colspan(UiFrameArgs *args, int colspan) { + args->colspan = colspan; +} + + +void ui_frame_args_set_rolspan(UiFrameArgs *args, int rowspan) { + args->rowspan = rowspan; +} + + +void ui_frame_args_set_name(UiFrameArgs *args, const char *name) { + args->name = strdup(name); +} + + +void ui_frame_args_set_style_class(UiFrameArgs *args, const char *classname) { + args->style_class = strdup(classname); +} + + +void ui_frame_args_set_margin(UiFrameArgs *args, int value) { + args->margin = value; +} + + +void ui_frame_args_set_spacing(UiFrameArgs *args, int value) { + args->spacing = value; +} + + +void ui_frame_args_set_columnspacing(UiFrameArgs *args, int value) { + args->columnspacing = value; +} + + +void ui_frame_args_set_rowspacing(UiFrameArgs *args, int value) { + args->rowspacing = value; +} + + +void ui_frame_args_set_expanded(UiFrameArgs *args, UiBool value) { + args->isexpanded = value; +} + + +void ui_frame_args_set_label(UiFrameArgs *args, const char *label) { + args->label = strdup(label); +} + + +void ui_frame_args_free(UiFrameArgs *args) { + free((void*)args->name); + free((void*)args->style_class); + free((void*)args->label); + free(args); +} + + +/* ---------------------------- UiButtonArgs -------------------------------*/ + +UiButtonArgs* ui_button_args_new(void) { + UiButtonArgs *args = malloc(sizeof(UiButtonArgs)); + memset(args, 0, sizeof(UiContainerArgs)); + return args; +} + + +void ui_button_args_set_fill(UiButtonArgs *args, UiBool fill) { + args->fill = fill ? UI_ON : UI_OFF; +} + + +void ui_button_args_set_hexpand(UiButtonArgs *args, UiBool value) { + args->hexpand = value; +} + + +void ui_button_args_set_vexpand(UiButtonArgs *args, UiBool value) { + args->vexpand = value; +} + + +void ui_button_args_set_hfill(UiButtonArgs *args, UiBool value) { + args->hfill = value; +} + + +void ui_button_args_set_vfill(UiButtonArgs *args, UiBool value) { + args->vfill = value; +} + + +void ui_button_args_set_override_defaults(UiButtonArgs *args, UiBool value) { + args->override_defaults = value; +} + + +void ui_button_args_set_colspan(UiButtonArgs *args, int colspan) { + args->colspan = colspan; +} + + +void ui_button_args_set_rolspan(UiButtonArgs *args, int rowspan) { + args->rowspan = rowspan; +} + + +void ui_button_args_set_name(UiButtonArgs *args, const char *name) { + args->name = strdup(name); +} + + +void ui_button_args_set_style_class(UiButtonArgs *args, const char *classname) { + args->style_class = strdup(classname); +} + +void ui_button_args_set_label(UiButtonArgs *args, const char *label){ + args->label = strdup(label); +} + + +void ui_button_args_set_stockid(UiButtonArgs *args, const char *stockid){ + args->stockid = strdup(stockid); +} + + +void ui_button_args_set_icon(UiButtonArgs *args, const char *icon){ + args->icon = strdup(icon); +} + + +void ui_button_args_set_labeltype(UiButtonArgs *args, int labeltype){ + args->labeltype = labeltype; +} + +void ui_button_args_set_onclick(UiButtonArgs *args, ui_callback callback){ + args->onclick = callback; +} + + +void ui_button_args_set_onclickdata(UiButtonArgs *args, void *onclickdata){ + args->onclickdata = onclickdata; +} + +void ui_button_args_set_groups(UiButtonArgs *args, int *groups){ + // TODO +} + +void ui_button_args_free(UiButtonArgs *args) { + free((void*)args->name); + free((void*)args->style_class); + free((void*)args->label); + free((void*)args->stockid); + free((void*)args->icon); + free((void*)args->groups); + free(args); +} + + +/* ------------------------- UiToggleArgs ----------------------------*/ + + +UiToggleArgs* ui_toggle_args_new(void) { + UiToggleArgs *args = malloc(sizeof(UiToggleArgs)); + memset(args, 0, sizeof(UiContainerArgs)); + return args; +} + + +void ui_toggle_args_set_fill(UiToggleArgs *args, UiBool fill) { + args->fill = fill ? UI_ON : UI_OFF; +} + + +void ui_toggle_args_set_hexpand(UiToggleArgs *args, UiBool value) { + args->hexpand = value; +} + + +void ui_toggle_args_set_vexpand(UiToggleArgs *args, UiBool value) { + args->vexpand = value; +} + + +void ui_toggle_args_set_hfill(UiToggleArgs *args, UiBool value) { + args->hfill = value; +} + + +void ui_toggle_args_set_vfill(UiToggleArgs *args, UiBool value) { + args->vfill = value; +} + + +void ui_toggle_args_set_override_defaults(UiToggleArgs *args, UiBool value) { + args->override_defaults = value; +} + + +void ui_toggle_args_set_colspan(UiToggleArgs *args, int colspan) { + args->colspan = colspan; +} + + +void ui_toggle_args_set_rolspan(UiToggleArgs *args, int rowspan) { + args->rowspan = rowspan; +} + + +void ui_toggle_args_set_name(UiToggleArgs *args, const char *name) { + args->name = strdup(name); +} + + +void ui_toggle_args_set_style_class(UiToggleArgs *args, const char *classname) { + args->style_class = strdup(classname); +} + +void ui_toggle_args_set_label(UiToggleArgs *args, const char *label){ + args->label = strdup(label); +} + + +void ui_toggle_args_set_stockid(UiToggleArgs *args, const char *stockid){ + args->stockid = strdup(stockid); +} + + +void ui_toggle_args_set_icon(UiToggleArgs *args, const char *icon){ + args->icon = strdup(icon); +} + + +void ui_toggle_args_set_labeltype(UiToggleArgs *args, int labeltype){ + args->labeltype = labeltype; +} + +void ui_toggle_args_set_onchange(UiToggleArgs *args, ui_callback callback){ + args->onchange = callback; +} + + +void ui_toggle_args_set_onchangedata(UiToggleArgs *args, void *onchangedata){ + args->onchangedata = onchangedata; +} + +void ui_toggle_args_set_varname(UiToggleArgs *args, const char *varname) { + args->varname = strdup(varname); +} + +void ui_toggle_args_set_value(UiToggleArgs *args, UiInteger *value) { + args->value = value; +} + +void ui_toggle_args_set_enablegroup(UiToggleArgs *args, int group) { + args->enable_group = group; +} + +void ui_toggle_args_set_groups(UiToggleArgs *args, int *groups){ + // TODO +} + +void ui_toggle_args_free(UiToggleArgs *args) { + free((void*)args->name); + free((void*)args->style_class); + free((void*)args->label); + free((void*)args->stockid); + free((void*)args->icon); + free((void*)args->varname); + free((void*)args->groups); + free(args); +} + diff --git a/ui/common/args.h b/ui/common/args.h new file mode 100644 index 0000000..ae74837 --- /dev/null +++ b/ui/common/args.h @@ -0,0 +1,156 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2025 Olaf Wintermann. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef UIC_ARGS_H +#define UIC_ARGS_H + +#include "../ui/container.h" +#include "../ui/button.h" +#include "../ui/menu.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +UIEXPORT UiMenuItemArgs* ui_menuitem_args_new(void); +UIEXPORT void ui_menuitem_args_set_label(UiMenuItemArgs *args, const char *label); +UIEXPORT void ui_menuitem_args_set_stockid(UiMenuItemArgs *args, const char *stockid); +UIEXPORT void ui_menuitem_args_set_icon(UiMenuItemArgs *args, const char *icon); +UIEXPORT void ui_menuitem_args_set_onclick(UiMenuItemArgs *args, ui_callback callback); +UIEXPORT void ui_menuitem_args_set_onclickdata(UiMenuItemArgs *args, void *onclickdata); +UIEXPORT void ui_menuitem_args_free(UiMenuItemArgs *args); + +UIEXPORT UiMenuToggleItemArgs* ui_menutoggleitem_args_new(void); +UIEXPORT void ui_menutoggleitem_args_set_label(UiMenuToggleItemArgs *args, const char *label); +UIEXPORT void ui_menutoggleitem_args_set_stockid(UiMenuToggleItemArgs *args, const char *stockid); +UIEXPORT void ui_menutoggleitem_args_set_icon(UiMenuToggleItemArgs *args, const char *icon); +UIEXPORT void ui_menutoggleitem_args_set_varname(UiMenuToggleItemArgs *args, const char *varname); +UIEXPORT void ui_menutoggleitem_args_set_onchange(UiMenuToggleItemArgs *args, ui_callback callback); +UIEXPORT void ui_menutoggleitem_args_set_onchangedata(UiMenuToggleItemArgs *args, void *onclickdata); +UIEXPORT void ui_menutoggleitem_args_free(UiMenuToggleItemArgs *args); + +UIEXPORT UiMenuItemListArgs* ui_menuitemlist_args_new(void); +UIEXPORT void ui_menuitemlist_args_set_varname(UiMenuItemListArgs *args, const char *varname); +UIEXPORT void ui_menuitemlist_args_set_getvalue(UiMenuItemListArgs *args, ui_getvaluefunc func); +UIEXPORT void ui_menuitemlist_args_set_onselect(UiMenuItemListArgs *args, ui_callback callback); +UIEXPORT void ui_menuitemlist_args_set_onselectdata(UiMenuItemListArgs *args, void *data); +UIEXPORT void ui_menuitemlist_args_set_addseparator(UiMenuItemListArgs *args, UiBool value); +UIEXPORT void ui_menuitemlist_args_free(UiMenuItemListArgs *args); + +UIEXPORT UiContainerArgs* ui_container_args_new(void); +UIEXPORT void ui_container_args_set_fill(UiContainerArgs *args, UiBool fill); +UIEXPORT void ui_container_args_set_hexpand(UiContainerArgs *args, UiBool value); +UIEXPORT void ui_container_args_set_vexpand(UiContainerArgs *args, UiBool value); +UIEXPORT void ui_container_args_set_hfill(UiContainerArgs *args, UiBool value); +UIEXPORT void ui_container_args_set_vfill(UiContainerArgs *args, UiBool value); +UIEXPORT void ui_container_args_set_override_defaults(UiContainerArgs *args, UiBool value); +UIEXPORT void ui_container_args_set_colspan(UiContainerArgs *args, int colspan); +UIEXPORT void ui_container_args_set_rolspan(UiContainerArgs *args, int rowspan); +UIEXPORT void ui_container_args_set_def_hexpand(UiContainerArgs *args, UiBool value); +UIEXPORT void ui_container_args_set_def_vexpand(UiContainerArgs *args, UiBool value); +UIEXPORT void ui_container_args_set_def_hfill(UiContainerArgs *args, UiBool value); +UIEXPORT void ui_container_args_set_def_vfill(UiContainerArgs *args, UiBool value); +UIEXPORT void ui_container_args_set_name(UiContainerArgs *args, const char *name); +UIEXPORT void ui_container_args_set_style_class(UiContainerArgs *args, const char *classname); +UIEXPORT void ui_container_args_set_margin(UiContainerArgs *args, int value); +UIEXPORT void ui_container_args_set_spacing(UiContainerArgs *args, int value); +UIEXPORT void ui_container_args_set_columnspacing(UiContainerArgs *args, int value); +UIEXPORT void ui_container_args_set_rowspacing(UiContainerArgs *args, int value); +UIEXPORT void ui_container_args_free(UiContainerArgs *args); + + +UIEXPORT UiFrameArgs* ui_frame_args_new(void); +UIEXPORT void ui_frame_args_set_fill(UiFrameArgs *args, UiBool fill); +UIEXPORT void ui_frame_args_set_hexpand(UiFrameArgs *args, UiBool value); +UIEXPORT void ui_frame_args_set_vexpand(UiFrameArgs *args, UiBool value); +UIEXPORT void ui_frame_args_set_hfill(UiFrameArgs *args, UiBool value); +UIEXPORT void ui_frame_args_set_vfill(UiFrameArgs *args, UiBool value); +UIEXPORT void ui_frame_args_set_override_defaults(UiFrameArgs *args, UiBool value); +UIEXPORT void ui_frame_args_set_colspan(UiFrameArgs *args, int colspan); +UIEXPORT void ui_frame_args_set_rolspan(UiFrameArgs *args, int rowspan); +UIEXPORT void ui_frame_args_set_name(UiFrameArgs *args, const char *name); +UIEXPORT void ui_frame_args_set_style_class(UiFrameArgs *args, const char *classname); +UIEXPORT void ui_frame_args_set_margin(UiFrameArgs *args, int value); +UIEXPORT void ui_frame_args_set_spacing(UiFrameArgs *args, int value); +UIEXPORT void ui_frame_args_set_columnspacing(UiFrameArgs *args, int value); +UIEXPORT void ui_frame_args_set_rowspacing(UiFrameArgs *args, int value); +UIEXPORT void ui_frame_args_set_expanded(UiFrameArgs *args, UiBool value); +UIEXPORT void ui_frame_args_set_label(UiFrameArgs *args, const char *label); +UIEXPORT void ui_frame_args_free(UiFrameArgs *args); + + +UIEXPORT UiButtonArgs* ui_button_args_new(void); +UIEXPORT void ui_button_args_set_fill(UiButtonArgs *args, UiBool fill); +UIEXPORT void ui_button_args_set_hexpand(UiButtonArgs *args, UiBool value); +UIEXPORT void ui_button_args_set_vexpand(UiButtonArgs *args, UiBool value); +UIEXPORT void ui_button_args_set_hfill(UiButtonArgs *args, UiBool value); +UIEXPORT void ui_button_args_set_vfill(UiButtonArgs *args, UiBool value); +UIEXPORT void ui_button_args_set_override_defaults(UiButtonArgs *args, UiBool value); +UIEXPORT void ui_button_args_set_colspan(UiButtonArgs *args, int colspan); +UIEXPORT void ui_button_args_set_rolspan(UiButtonArgs *args, int rowspan); +UIEXPORT void ui_button_args_set_name(UiButtonArgs *args, const char *name); +UIEXPORT void ui_button_args_set_style_class(UiButtonArgs *args, const char *classname); +UIEXPORT void ui_button_args_set_label(UiButtonArgs *args, const char *label); +UIEXPORT void ui_button_args_set_stockid(UiButtonArgs *args, const char *stockid); +UIEXPORT void ui_button_args_set_icon(UiButtonArgs *args, const char *icon); +UIEXPORT void ui_button_args_set_labeltype(UiButtonArgs *args, int labeltype); +UIEXPORT void ui_button_args_set_onclick(UiButtonArgs *args, ui_callback callback); +UIEXPORT void ui_button_args_set_onclickdata(UiButtonArgs *args, void *onclickdata); +UIEXPORT void ui_button_args_set_groups(UiButtonArgs *args, int *groups); + + +UIEXPORT UiToggleArgs* ui_toggle_args_new(void); +UIEXPORT void ui_toggle_args_set_fill(UiToggleArgs *args, UiBool fill); +UIEXPORT void ui_toggle_args_set_hexpand(UiToggleArgs *args, UiBool value); +UIEXPORT void ui_toggle_args_set_vexpand(UiToggleArgs *args, UiBool value); +UIEXPORT void ui_toggle_args_set_hfill(UiToggleArgs *args, UiBool value); +UIEXPORT void ui_toggle_args_set_vfill(UiToggleArgs *args, UiBool value); +UIEXPORT void ui_toggle_args_set_override_defaults(UiToggleArgs *args, UiBool value); +UIEXPORT void ui_toggle_args_set_colspan(UiToggleArgs *args, int colspan); +UIEXPORT void ui_toggle_args_set_rolspan(UiToggleArgs *args, int rowspan); +UIEXPORT void ui_toggle_args_set_name(UiToggleArgs *args, const char *name); +UIEXPORT void ui_toggle_args_set_style_class(UiToggleArgs *args, const char *classname); +UIEXPORT void ui_toggle_args_set_label(UiToggleArgs *args, const char *label); +UIEXPORT void ui_toggle_args_set_stockid(UiToggleArgs *args, const char *stockid); +UIEXPORT void ui_toggle_args_set_icon(UiToggleArgs *args, const char *icon); +UIEXPORT void ui_toggle_args_set_labeltype(UiToggleArgs *args, int labeltype); +UIEXPORT void ui_toggle_args_set_onchange(UiToggleArgs *args, ui_callback callback); +UIEXPORT void ui_toggle_args_set_onchangedata(UiToggleArgs *args, void *onchangedata); +UIEXPORT void ui_toggle_args_set_varname(UiToggleArgs *args, const char *varname); +UIEXPORT void ui_toggle_args_set_value(UiToggleArgs *args, UiInteger *value); +UIEXPORT void ui_toggle_args_set_enablegroup(UiToggleArgs *args, int group); +UIEXPORT void ui_toggle_args_set_groups(UiToggleArgs *args, int *groups); + + +#ifdef __cplusplus +} +#endif + +#endif /* UIC_ARGS_H */ + diff --git a/ui/common/menu.c b/ui/common/menu.c index 4b23418..31f8171 100644 --- a/ui/common/menu.c +++ b/ui/common/menu.c @@ -125,19 +125,19 @@ UIEXPORT void ui_menu_end(void) { -void ui_menuitem_create(UiMenuItemArgs args) { +void ui_menuitem_create(UiMenuItemArgs *args) { UiMenuItem* item = malloc(sizeof(UiMenuItem)); mitem_set_id(&item->item); item->item.prev = NULL; item->item.next = NULL; item->item.type = UI_MENU_ITEM; - item->label = nl_strdup(args.label); - item->stockid = nl_strdup(args.stockid); - item->icon = nl_strdup(args.icon); - item->userdata = args.onclickdata; - item->callback = args.onclick; - item->groups = uic_copy_groups(args.groups, &item->ngroups); + item->label = nl_strdup(args->label); + item->stockid = nl_strdup(args->stockid); + item->icon = nl_strdup(args->icon); + item->userdata = args->onclickdata; + item->callback = args->onclick; + item->groups = uic_copy_groups(args->groups, &item->ngroups); add_item((UiMenuItemI*)item); } @@ -152,79 +152,79 @@ void ui_menuseparator() { add_item((UiMenuItemI*)item); } -void ui_menu_toggleitem_create(UiMenuToggleItemArgs args) { +void ui_menu_toggleitem_create(UiMenuToggleItemArgs *args) { UiMenuCheckItem *item = malloc(sizeof(UiMenuCheckItem)); mitem_set_id(&item->item); item->item.prev = NULL; item->item.next = NULL; item->item.type = UI_MENU_CHECK_ITEM; - item->label = nl_strdup(args.label); - item->stockid = nl_strdup(args.stockid); - item->icon = nl_strdup(args.icon); - item->varname = nl_strdup(args.varname); - item->userdata = args.onchangedata; - item->callback = args.onchange; - item->groups = uic_copy_groups(args.groups, &item->ngroups); + item->label = nl_strdup(args->label); + item->stockid = nl_strdup(args->stockid); + item->icon = nl_strdup(args->icon); + item->varname = nl_strdup(args->varname); + item->userdata = args->onchangedata; + item->callback = args->onchange; + item->groups = uic_copy_groups(args->groups, &item->ngroups); add_item((UiMenuItemI*)item); } -void ui_menu_radioitem_create(UiMenuToggleItemArgs args) { +void ui_menu_radioitem_create(UiMenuToggleItemArgs *args) { UiMenuCheckItem* item = malloc(sizeof(UiMenuCheckItem)); mitem_set_id(&item->item); item->item.prev = NULL; item->item.next = NULL; item->item.type = UI_MENU_RADIO_ITEM; - item->label = nl_strdup(args.label); - item->stockid = nl_strdup(args.stockid); - item->icon = nl_strdup(args.icon); - item->varname = nl_strdup(args.varname); - item->userdata = args.onchangedata; - item->callback = args.onchange; - item->groups = uic_copy_groups(args.groups, &item->ngroups); + item->label = nl_strdup(args->label); + item->stockid = nl_strdup(args->stockid); + item->icon = nl_strdup(args->icon); + item->varname = nl_strdup(args->varname); + item->userdata = args->onchangedata; + item->callback = args->onchange; + item->groups = uic_copy_groups(args->groups, &item->ngroups); add_item((UiMenuItemI*)item); } -void ui_menu_itemlist_create(UiMenuItemListArgs args) { +void ui_menu_itemlist_create(UiMenuItemListArgs *args) { UiMenuItemList*item = malloc(sizeof(UiMenuItemList)); mitem_set_id(&item->item); item->item.prev = NULL; item->item.next = NULL; item->item.type = UI_MENU_ITEM_LIST; - item->getvalue = args.getvalue; - item->callback = args.onselect; - item->userdata = args.onselectdata; - item->varname = nl_strdup(args.varname); - item->addseparator = args.addseparator; + item->getvalue = args->getvalue; + item->callback = args->onselect; + item->userdata = args->onselectdata; + item->varname = nl_strdup(args->varname); + item->addseparator = args->addseparator; add_item((UiMenuItemI*)item); } -void ui_menu_checkitemlist_create(UiMenuItemListArgs args) { +void ui_menu_checkitemlist_create(UiMenuItemListArgs *args) { UiMenuItemList* item = malloc(sizeof(UiMenuItemList)); mitem_set_id(&item->item); item->item.prev = NULL; item->item.next = NULL; item->item.type = UI_MENU_CHECKITEM_LIST; - item->callback = args.onselect; - item->userdata = args.onselectdata; - item->varname = nl_strdup(args.varname); + item->callback = args->onselect; + item->userdata = args->onselectdata; + item->varname = nl_strdup(args->varname); add_item((UiMenuItemI*)item); } -void ui_menu_radioitemlist_create(UiMenuItemListArgs args) { +void ui_menu_radioitemlist_create(UiMenuItemListArgs *args) { UiMenuItemList* item = malloc(sizeof(UiMenuItemList)); mitem_set_id(&item->item); item->item.prev = NULL; item->item.next = NULL; item->item.type = UI_MENU_RADIOITEM_LIST; - item->callback = args.onselect; - item->userdata = args.onselectdata; - item->varname = nl_strdup(args.varname); + item->callback = args->onselect; + item->userdata = args->onselectdata; + item->varname = nl_strdup(args->varname); add_item((UiMenuItemI*)item); } diff --git a/ui/common/objs.mk b/ui/common/objs.mk index bc1b385..586e88d 100644 --- a/ui/common/objs.mk +++ b/ui/common/objs.mk @@ -33,13 +33,13 @@ COMMON_OBJ = context$(OBJ_EXT) COMMON_OBJ += document$(OBJ_EXT) COMMON_OBJ += object$(OBJ_EXT) COMMON_OBJ += types$(OBJ_EXT) -COMMON_OBJ += menu$(OBJ_EXT) COMMON_OBJ += properties$(OBJ_EXT) COMMON_OBJ += menu$(OBJ_EXT) COMMON_OBJ += toolbar$(OBJ_EXT) COMMON_OBJ += ucx_properties$(OBJ_EXT) COMMON_OBJ += threadpool$(OBJ_EXT) COMMON_OBJ += condvar$(OBJ_EXT) +COMMON_OBJ += args$(OBJ_EXT) TOOLKITOBJS += $(COMMON_OBJ:%=$(COMMON_OBJPRE)uic_%) TOOLKITSOURCE += $(COMMON_OBJ:%$(OBJ_EXT)=common/%.c) diff --git a/ui/common/toolbar.c b/ui/common/toolbar.c index 0d86f17..199dc41 100644 --- a/ui/common/toolbar.c +++ b/ui/common/toolbar.c @@ -49,18 +49,18 @@ static char* nl_strdup(const char* str) { return str ? strdup(str) : NULL; } -static UiToolbarItemArgs itemargs_copy(UiToolbarItemArgs args, size_t *ngroups) { +static UiToolbarItemArgs itemargs_copy(UiToolbarItemArgs *args, size_t *ngroups) { UiToolbarItemArgs newargs; - newargs.label = nl_strdup(args.label); - newargs.stockid = nl_strdup(args.stockid); - newargs.icon = nl_strdup(args.icon); - newargs.onclick = args.onclick; - newargs.onclickdata = args.onclickdata; - newargs.groups = uic_copy_groups(args.groups, ngroups); + newargs.label = nl_strdup(args->label); + newargs.stockid = nl_strdup(args->stockid); + newargs.icon = nl_strdup(args->icon); + newargs.onclick = args->onclick; + newargs.onclickdata = args->onclickdata; + newargs.groups = uic_copy_groups(args->groups, ngroups); return newargs; } -void ui_toolbar_item_create(const char* name, UiToolbarItemArgs args) { +void ui_toolbar_item_create(const char* name, UiToolbarItemArgs *args) { UiToolbarItem* item = malloc(sizeof(UiToolbarItem)); item->item.type = UI_TOOLBAR_ITEM; item->args = itemargs_copy(args, &item->ngroups); @@ -68,34 +68,34 @@ void ui_toolbar_item_create(const char* name, UiToolbarItemArgs args) { } -static UiToolbarToggleItemArgs toggleitemargs_copy(UiToolbarToggleItemArgs args, size_t *ngroups) { +static UiToolbarToggleItemArgs toggleitemargs_copy(UiToolbarToggleItemArgs *args, size_t *ngroups) { UiToolbarToggleItemArgs newargs; - newargs.label = nl_strdup(args.label); - newargs.stockid = nl_strdup(args.stockid); - newargs.icon = nl_strdup(args.icon); - newargs.varname = nl_strdup(args.varname); - newargs.onchange = args.onchange; - newargs.onchangedata = args.onchangedata; - newargs.groups = uic_copy_groups(args.groups, ngroups); + newargs.label = nl_strdup(args->label); + newargs.stockid = nl_strdup(args->stockid); + newargs.icon = nl_strdup(args->icon); + newargs.varname = nl_strdup(args->varname); + newargs.onchange = args->onchange; + newargs.onchangedata = args->onchangedata; + newargs.groups = uic_copy_groups(args->groups, ngroups); return newargs; } -void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs args) { +void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs *args) { UiToolbarToggleItem* item = malloc(sizeof(UiToolbarToggleItem)); item->item.type = UI_TOOLBAR_TOGGLEITEM; item->args = toggleitemargs_copy(args, &item->ngroups); cxMapPut(toolbar_items, name, item); } -static UiToolbarMenuArgs menuargs_copy(UiToolbarMenuArgs args) { +static UiToolbarMenuArgs menuargs_copy(UiToolbarMenuArgs *args) { UiToolbarMenuArgs newargs; - newargs.label = nl_strdup(args.label); - newargs.stockid = nl_strdup(args.stockid); - newargs.icon = nl_strdup(args.icon); + newargs.label = nl_strdup(args->label); + newargs.stockid = nl_strdup(args->stockid); + newargs.icon = nl_strdup(args->icon); return newargs; } -UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs args) { +UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs *args) { UiToolbarMenuItem* item = malloc(sizeof(UiToolbarMenuItem)); item->item.type = UI_TOOLBAR_MENU; memset(&item->menu, 0, sizeof(UiMenu)); diff --git a/ui/common/types.c b/ui/common/types.c index a704b85..b87cc3f 100644 --- a/ui/common/types.c +++ b/ui/common/types.c @@ -36,6 +36,7 @@ #include "../ui/tree.h" #include "types.h" #include "context.h" +#include "../ui/image.h" @@ -404,6 +405,30 @@ char* ui_text_get(UiText* s) { } } +void ui_generic_set_image(UiGeneric *g, void *img) { + if(g->set) { + g->set(g, img, UI_IMAGE_OBJECT_TYPE); + } else { + if(g->value) { + ui_image_unref(g->value); + } + ui_image_ref(img); + g->value = img; + g->type = UI_IMAGE_OBJECT_TYPE; + } +} + +void* ui_generic_get_image(UiGeneric *g) { + if(g->type) { + if(!strcmp(g->type, UI_IMAGE_OBJECT_TYPE)) { + return g->value; + } else { + return NULL; + } + } + return g->value; +} + // private functions void uic_int_copy(UiInteger *from, UiInteger *to) { diff --git a/ui/gtk/Makefile b/ui/gtk/Makefile index aba263f..d1979fb 100644 --- a/ui/gtk/Makefile +++ b/ui/gtk/Makefile @@ -27,8 +27,10 @@ # $(GTK_OBJPRE)%.o: gtk/%.c - $(CC) -o $@ -c -I../ucx $(CFLAGS) $(TK_CFLAGS) $< + $(CC) -o $@ -c -I../ucx $(CFLAGS) $(SHLIB_CFLAGS) $(TK_CFLAGS) $< $(UI_LIB): $(OBJ) $(AR) $(ARFLAGS) $(UI_LIB) $(OBJ) - + +$(UI_SHLIB): $(OBJ) + $(CC) -o $(UI_SHLIB) $(LDFLAGS) $(SHLIB_LDFLAGS) $(TK_LDFLAGS) $(OBJ) -L../build/lib -lucx diff --git a/ui/gtk/button.c b/ui/gtk/button.c index b26a130..6a95150 100644 --- a/ui/gtk/button.c +++ b/ui/gtk/button.c @@ -96,12 +96,12 @@ GtkWidget* ui_create_button( return button; } -UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs args) { +UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) { UiObject* current = uic_current_obj(obj); - GtkWidget *button = ui_create_button(obj, args.label, args.icon, args.onclick, args.onclickdata, 0, FALSE); - ui_set_name_and_style(button, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, button, args.groups); - UI_APPLY_LAYOUT1(current, args); + GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->onclick, args->onclickdata, 0, FALSE); + ui_set_name_and_style(button, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, button, args->groups); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, button, FALSE); return button; } @@ -274,29 +274,29 @@ void ui_bind_togglebutton( } } -static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleArgs args) { +static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleArgs *args) { UiObject* current = uic_current_obj(obj); ui_setup_togglebutton( obj, widget, - args.label, - args.icon, - args.varname, - args.value, - args.onchange, - args.onchangedata, - args.enable_group); - ui_set_name_and_style(widget, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, widget, args.groups); + args->label, + args->icon, + args->varname, + args->value, + args->onchange, + args->onchangedata, + args->enable_group); + ui_set_name_and_style(widget, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, widget, args->groups); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, widget, FALSE); return widget; } -UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { return togglebutton_create(obj, gtk_toggle_button_new(), args); } @@ -333,39 +333,39 @@ static void ui_checkbox_enable_state(GtkCheckButton *widget, UiEventData *event) } } -UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { UiObject* current = uic_current_obj(obj); - GtkWidget *widget = gtk_check_button_new_with_label(args.label); + GtkWidget *widget = gtk_check_button_new_with_label(args->label); ui_bind_togglebutton( obj, widget, ui_check_button_get, ui_check_button_set, - args.varname, - args.value, + args->varname, + args->value, (ui_toggled_func)ui_checkbox_callback, - args.onchange, - args.onchangedata, + args->onchange, + args->onchangedata, (ui_toggled_func)ui_checkbox_enable_state, - args.enable_group); + args->enable_group); - ui_set_name_and_style(widget, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, widget, args.groups); + ui_set_name_and_style(widget, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, widget, args->groups); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, widget, FALSE); return widget; } #else -UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { return togglebutton_create(obj, gtk_check_button_new(), args); } #endif -UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { #ifdef UI_GTK3 return NULL; // TODO #else @@ -415,13 +415,13 @@ static void destroy_radiobutton(GtkWidget *w, UiRadioButtonData *data) { free(data); } -UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs args) { +UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) { UiObject* current = uic_current_obj(obj); GSList *rg = NULL; UiInteger *rgroup; - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER); UiBool first = FALSE; if(var) { @@ -432,9 +432,9 @@ UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs args) { } } - GtkWidget *rbutton = RADIOBUTTON_NEW(rg, args.label); - ui_set_name_and_style(rbutton, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, rbutton, args.groups); + GtkWidget *rbutton = RADIOBUTTON_NEW(rg, args->label); + ui_set_name_and_style(rbutton, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, rbutton, args->groups); if(rgroup) { #if GTK_MAJOR_VERSION >= 4 if(rg) { @@ -476,11 +476,11 @@ UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs args) { rbdata); } - if(args.onchange) { + if(args->onchange) { UiEventData *event = malloc(sizeof(UiEventData)); event->obj = obj; - event->userdata = args.onchangedata; - event->callback = args.onchange; + event->userdata = args->onchangedata; + event->callback = args->onchange; event->value = 0; event->customdata = NULL; @@ -496,7 +496,7 @@ UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs args) { event); } - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, rbutton, FALSE); return rbutton; diff --git a/ui/gtk/container.c b/ui/gtk/container.c index 41c7924..8ee7ee5 100644 --- a/ui/gtk/container.c +++ b/ui/gtk/container.c @@ -420,14 +420,14 @@ GtkWidget* ui_box_set_margin(GtkWidget *box, int margin) { return ret; } -UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs args, UiSubContainerType type) { +UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, UiSubContainerType type) { UiObject *current = uic_current_obj(obj); UiContainer *ct = current->container; - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); - GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args.spacing) : ui_gtk_hbox_new(args.spacing); - ui_set_name_and_style(box, args.name, args.style_class); - GtkWidget *widget = args.margin > 0 ? ui_box_set_margin(box, args.margin) : box; + GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing); + ui_set_name_and_style(box, args->name, args->style_class); + GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box; ct->add(ct, widget, TRUE); UiObject *newobj = uic_object_new(obj, box); @@ -437,11 +437,11 @@ UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs args, UiSubContainerType t return widget; } -UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) { +UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) { return ui_box_create(obj, args, UI_CONTAINER_VBOX); } -UIEXPORT UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) { +UIEXPORT UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) { return ui_box_create(obj, args, UI_CONTAINER_HBOX); } @@ -458,30 +458,30 @@ GtkWidget* ui_create_grid_widget(int colspacing, int rowspacing) { return grid; } -UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) { +UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { UiObject* current = uic_current_obj(obj); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); GtkWidget *widget; - GtkWidget *grid = ui_create_grid_widget(args.columnspacing, args.rowspacing); - ui_set_name_and_style(grid, args.name, args.style_class); - widget = ui_box_set_margin(grid, args.margin); + GtkWidget *grid = ui_create_grid_widget(args->columnspacing, args->rowspacing); + ui_set_name_and_style(grid, args->name, args->style_class); + widget = ui_box_set_margin(grid, args->margin); current->container->add(current->container, widget, TRUE); UiObject *newobj = uic_object_new(obj, grid); - newobj->container = ui_grid_container(obj, grid, args.def_hexpand, args.def_vexpand, args.def_hfill, args.def_vfill); + newobj->container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill); uic_obj_add(obj, newobj); return widget; } -UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs args) { +UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) { UiObject* current = uic_current_obj(obj); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); - GtkWidget *frame = gtk_frame_new(args.label); + GtkWidget *frame = gtk_frame_new(args->label); UiObject *newobj = uic_object_new(obj, frame); - GtkWidget *sub = ui_subcontainer_create(args.subcontainer, newobj, args.spacing, args.columnspacing, args.rowspacing, args.margin); + GtkWidget *sub = ui_subcontainer_create(args->subcontainer, newobj, args->spacing, args->columnspacing, args->rowspacing, args->margin); if(sub) { FRAME_SET_CHILD(frame, sub); } else { @@ -494,14 +494,14 @@ UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs args) { return frame; } -UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs args) { +UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs *args) { UiObject* current = uic_current_obj(obj); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); - GtkWidget *expander = gtk_expander_new(args.label); - gtk_expander_set_expanded(GTK_EXPANDER(expander), args.isexpanded); + GtkWidget *expander = gtk_expander_new(args->label); + gtk_expander_set_expanded(GTK_EXPANDER(expander), args->isexpanded); UiObject *newobj = uic_object_new(obj, expander); - GtkWidget *sub = ui_subcontainer_create(args.subcontainer, newobj, args.spacing, args.columnspacing, args.rowspacing, args.margin); + GtkWidget *sub = ui_subcontainer_create(args->subcontainer, newobj, args->spacing, args->columnspacing, args->rowspacing, args->margin); if(sub) { EXPANDER_SET_CHILD(expander, sub); } else { @@ -515,17 +515,17 @@ UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs args) { } -UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs args) { +UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) { UiObject* current = uic_current_obj(obj); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); GtkWidget *sw = SCROLLEDWINDOW_NEW(); - ui_set_name_and_style(sw, args.name, args.style_class); - GtkWidget *widget = ui_box_set_margin(sw, args.margin); + ui_set_name_and_style(sw, args->name, args->style_class); + GtkWidget *widget = ui_box_set_margin(sw, args->margin); current->container->add(current->container, widget, TRUE); UiObject *newobj = uic_object_new(obj, sw); - GtkWidget *sub = ui_subcontainer_create(args.subcontainer, newobj, args.spacing, args.columnspacing, args.rowspacing, args.margin); + GtkWidget *sub = ui_subcontainer_create(args->subcontainer, newobj, args->spacing, args->columnspacing, args->rowspacing, args->margin); if(sub) { SCROLLEDWINDOW_SET_CHILD(sw, sub); } else { @@ -689,22 +689,69 @@ UiGtkTabView* ui_widget_get_tabview_data(UIWIDGET tabview) { return g_object_get_data(G_OBJECT(tabview), "ui_tabview"); } +static void tabview_switch_page( + GtkNotebook *self, + GtkWidget *page, + guint page_num, + gpointer userdata) +{ + UiGtkTabView *tabview = userdata; + if(!tabview->onchange) { + return; + } + + UiEvent event; + event.obj = tabview->obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.set = ui_get_setop(); + event.eventdata = NULL; + event.intval = page_num; + + tabview->onchange(&event, tabview->onchange); +} + +#if GTK_CHECK_VERSION(3, 10, 0) + +static void tabview_stack_changed( + GObject *object, + GParamSpec *pspec, + UiGtkTabView *tabview) +{ + if(!tabview->onchange) { + return; + } + + UiEvent event; + event.obj = tabview->obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.set = ui_get_setop(); + event.eventdata = NULL; + event.intval = 0; + + tabview->onchange(&event, tabview->onchange); +} + +#endif + typedef int64_t(*ui_tabview_get_func)(UiInteger*); typedef void (*ui_tabview_set_func)(UiInteger*, int64_t); -UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs args) { +UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs *args) { UiGtkTabView *data = malloc(sizeof(UiGtkTabView)); - data->margin = args.margin; - data->spacing = args.spacing; - data->columnspacing = args.columnspacing; - data->rowspacing = args.rowspacing; + memset(data, 0, sizeof(UiGtkTabView)); + data->margin = args->margin; + data->spacing = args->spacing; + data->columnspacing = args->columnspacing; + data->rowspacing = args->rowspacing; ui_tabview_get_func getfunc = NULL; ui_tabview_set_func setfunc = NULL; GtkWidget *widget = NULL; GtkWidget *data_widget = NULL; - switch(args.tabview) { + switch(args->tabview) { case UI_TABVIEW_DOC: { // TODO break; @@ -715,6 +762,7 @@ UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs args) { GtkWidget *sidebar = gtk_stack_sidebar_new(); BOX_ADD(widget, sidebar); GtkWidget *stack = gtk_stack_new(); + g_signal_connect(stack, "notify::visible-child", G_CALLBACK(tabview_stack_changed), data); gtk_stack_set_transition_type (GTK_STACK(stack), GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN); gtk_stack_sidebar_set_stack(GTK_STACK_SIDEBAR(sidebar), GTK_STACK(stack)); BOX_ADD_EXPAND(widget, stack); @@ -734,13 +782,18 @@ UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs args) { case UI_TABVIEW_INVISIBLE: /* fall through */ case UI_TABVIEW_NAVIGATION_TOP2: { widget = gtk_notebook_new(); + g_signal_connect( + widget, + "switch-page", + G_CALLBACK(tabview_switch_page), + data); data_widget = widget; data->select_tab = ui_notebook_tab_select; data->remove_tab = ui_notebook_tab_remove; data->add_tab = ui_notebook_tab_add; getfunc = ui_notebook_get; setfunc = ui_notebook_set; - if(args.tabview == UI_TABVIEW_INVISIBLE) { + if(args->tabview == UI_TABVIEW_INVISIBLE) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widget), FALSE); gtk_notebook_set_show_border(GTK_NOTEBOOK(widget), FALSE); } @@ -749,8 +802,8 @@ UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs args) { } UiObject* current = uic_current_obj(obj); - if(args.value || args.varname) { - UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_INTEGER); + if(args->value || args->varname) { + UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER); UiInteger *i = var->value; i->get = getfunc; i->set = setfunc; @@ -759,9 +812,9 @@ UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs args) { g_object_set_data(G_OBJECT(widget), "ui_tabview", data); data->widget = data_widget; - data->subcontainer = args.subcontainer; + data->subcontainer = args->subcontainer; - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, widget, TRUE); UiObject *newobj = uic_object_new(obj, widget); @@ -872,13 +925,13 @@ void ui_headerbar_end_create(UiObject *obj) { hb_set_part(obj, 1); } -UIWIDGET ui_headerbar_fallback_create(UiObject *obj, UiHeaderbarArgs args) { +UIWIDGET ui_headerbar_fallback_create(UiObject *obj, UiHeaderbarArgs *args) { UiObject *current = uic_current_obj(obj); UiContainer *ct = current->container; - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); - GtkWidget *box = ui_gtk_hbox_new(args.alt_spacing); - ui_set_name_and_style(box, args.name, args.style_class); + GtkWidget *box = ui_gtk_hbox_new(args->alt_spacing); + ui_set_name_and_style(box, args->name, args->style_class); ct->add(ct, box, FALSE); UiObject *newobj = uic_object_new(obj, box); @@ -917,7 +970,7 @@ void ui_headerbar_fallback_container_add(UiContainer *ct, GtkWidget *widget, UiB #if GTK_CHECK_VERSION(3, 10, 0) -UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs args) { +UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs *args) { GtkWidget *headerbar = g_object_get_data(G_OBJECT(obj->widget), "ui_headerbar"); if(!headerbar) { return ui_headerbar_fallback_create(obj, args); @@ -958,7 +1011,7 @@ void ui_headerbar_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) #else -UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs args) { +UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs *args) { return ui_headerbar_fallback_create(obj, args); } @@ -967,15 +1020,15 @@ UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs args) { /* -------------------- Sidebar -------------------- */ #ifdef UI_LIBADWAITA -UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs args) { +UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs *args) { GtkWidget *sidebar_toolbar_view = g_object_get_data(G_OBJECT(obj->widget), "ui_sidebar"); if(!sidebar_toolbar_view) { fprintf(stderr, "Error: window is not configured for sidebar\n"); return NULL; } - GtkWidget *box = ui_gtk_vbox_new(args.spacing); - ui_box_set_margin(box, args.margin); + GtkWidget *box = ui_gtk_vbox_new(args->spacing); + ui_box_set_margin(box, args->margin); adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(sidebar_toolbar_view), box); UiObject *newobj = uic_object_new(obj, box); @@ -985,11 +1038,11 @@ UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs args) { return box; } #else -UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs args) { +UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs *args) { GtkWidget *sidebar_vbox = g_object_get_data(G_OBJECT(obj->widget), "ui_sidebar"); - GtkWidget *box = ui_gtk_vbox_new(args.spacing); - ui_box_set_margin(box, args.margin); + GtkWidget *box = ui_gtk_vbox_new(args->spacing); + ui_box_set_margin(box, args->margin); BOX_ADD_EXPAND(sidebar_vbox, box); UiObject *newobj = uic_object_new(obj, box); @@ -1019,18 +1072,18 @@ static GtkWidget* create_paned(UiOrientation orientation) { -static UIWIDGET splitpane_create(UiObject *obj, UiOrientation orientation, UiSplitPaneArgs args) { +static UIWIDGET splitpane_create(UiObject *obj, UiOrientation orientation, UiSplitPaneArgs *args) { UiObject* current = uic_current_obj(obj); GtkWidget *pane0 = create_paned(orientation); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, pane0, TRUE); - int max = args.max_panes == 0 ? 2 : args.max_panes; + int max = args->max_panes == 0 ? 2 : args->max_panes; UiObject *newobj = uic_object_new(obj, pane0); - newobj->container = ui_splitpane_container(obj, pane0, orientation, max, args.initial_position); + newobj->container = ui_splitpane_container(obj, pane0, orientation, max, args->initial_position); uic_obj_add(obj, newobj); g_object_set_data(G_OBJECT(pane0), "ui_splitpane", newobj->container); @@ -1038,11 +1091,11 @@ static UIWIDGET splitpane_create(UiObject *obj, UiOrientation orientation, UiSpl return pane0; } -UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs args) { +UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) { return splitpane_create(obj, UI_HORIZONTAL, args); } -UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs args) { +UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) { return splitpane_create(obj, UI_VERTICAL, args); } @@ -1187,33 +1240,33 @@ static void destroy_itemlist_container(GtkWidget *w, UiGtkItemListContainer *con free(container); } -UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs args) { +UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs *args) { UiObject *current = uic_current_obj(obj); UiContainer *ct = current->container; - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); - GtkWidget *box = args.container == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args.spacing) : ui_gtk_hbox_new(args.spacing); - ui_set_name_and_style(box, args.name, args.style_class); - GtkWidget *widget = args.margin > 0 ? ui_box_set_margin(box, args.margin) : box; + GtkWidget *box = args->container == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing); + ui_set_name_and_style(box, args->name, args->style_class); + GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box; ct->add(ct, widget, TRUE); UiGtkItemListContainer *container = malloc(sizeof(UiGtkItemListContainer)); container->parent = obj; container->widget = box; - container->container = ui_box_container(current, box, args.container); - container->create_ui = args.create_ui; - container->userdata = args.userdata; - container->subcontainer = args.subcontainer; + container->container = ui_box_container(current, box, args->container); + container->create_ui = args->create_ui; + container->userdata = args->userdata; + container->subcontainer = args->subcontainer; container->current_items = cxHashMapCreateSimple(CX_STORE_POINTERS); container->current_items->collection.advanced_destructor = remove_item; container->current_items->collection.destructor_data = container; - container->margin = args.sub_margin; - container->spacing = args.sub_spacing; - container->columnspacing = args.sub_columnspacing; - container->rowspacing = args.sub_rowspacing; + container->margin = args->sub_margin; + container->spacing = args->sub_spacing; + container->columnspacing = args->sub_columnspacing; + container->rowspacing = args->sub_rowspacing; container->remove_items = TRUE; - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_LIST); if(var) { UiList *list = var->value; list->obj = container; diff --git a/ui/gtk/container.h b/ui/gtk/container.h index b39a3e4..6c254a4 100644 --- a/ui/gtk/container.h +++ b/ui/gtk/container.h @@ -122,6 +122,8 @@ typedef struct UiGtkTabView { int spacing; int columnspacing; int rowspacing; + ui_callback onchange; + void *onchangedata; } UiGtkTabView; @@ -173,7 +175,7 @@ UiContainer* ui_frame_container(UiObject *obj, GtkWidget *frame); void ui_frame_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill); GtkWidget* ui_box_set_margin(GtkWidget *box, int margin); -UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs args, UiSubContainerType type); +UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, UiSubContainerType type); UiContainer* ui_box_container(UiObject *obj, GtkWidget *box, UiSubContainerType type); void ui_box_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill); diff --git a/ui/gtk/display.c b/ui/gtk/display.c index 78ff754..617273a 100644 --- a/ui/gtk/display.c +++ b/ui/gtk/display.c @@ -46,19 +46,19 @@ static void set_alignment(GtkWidget *widget, float xalign, float yalign) { #endif } -UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs args) { +UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs *args) { UiObject* current = uic_current_obj(obj); const char *css_class = NULL; char *markup = NULL; - if(args.label) { + if(args->label) { #if GTK_MAJOR_VERSION < 3 - switch(args.style) { + switch(args->style) { case UI_LABEL_STYLE_DEFAULT: break; case UI_LABEL_STYLE_TITLE: { - cxmutstr m = cx_asprintf("%s", args.label); + cxmutstr m = cx_asprintf("%s", args->label); markup = m.ptr; - args.label = NULL; + args->label = NULL; } case UI_LABEL_STYLE_SUBTITLE: { break; @@ -68,7 +68,7 @@ UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs args) { } } # else - switch(args.style) { + switch(args->style) { case UI_LABEL_STYLE_DEFAULT: break; case UI_LABEL_STYLE_TITLE: { css_class = "ui_label_title"; @@ -87,7 +87,7 @@ UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs args) { } - GtkWidget *widget = gtk_label_new(args.label); + GtkWidget *widget = gtk_label_new(args->label); if(markup) { gtk_label_set_markup(GTK_LABEL(widget), markup); free(markup); @@ -97,7 +97,7 @@ UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs args) { WIDGET_ADD_CSS_CLASS(widget, css_class); } - switch(args.align) { + switch(args->align) { case UI_ALIGN_DEFAULT: break; case UI_ALIGN_LEFT: set_alignment(widget, 0, .5); break; case UI_ALIGN_RIGHT: set_alignment(widget, 1, .5); break; @@ -105,7 +105,7 @@ UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs args) { } - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); if(var) { UiString* value = (UiString*)var->value; value->obj = widget; @@ -113,19 +113,19 @@ UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs args) { value->set = ui_label_set; } - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, widget, FALSE); return widget; } -UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs args) { - args.align = UI_ALIGN_LEFT; +UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs *args) { + args->align = UI_ALIGN_LEFT; return ui_label_create(obj, args); } -UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs args) { - args.align = UI_ALIGN_RIGHT; +UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs *args) { + args->align = UI_ALIGN_RIGHT; return ui_label_create(obj, args); } @@ -174,14 +174,14 @@ typedef struct UiProgressBarRange { double max; } UiProgressBarRange; -UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) { +UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args) { UiObject* current = uic_current_obj(obj); GtkWidget *progressbar = gtk_progress_bar_new(); - if(args.max > args.min) { + if(args->max > args->min) { UiProgressBarRange *range = malloc(sizeof(UiProgressBarRange)); - range->min = args.min; - range->max = args.max; + range->min = args->min; + range->max = args->max; g_signal_connect( progressbar, "destroy", @@ -191,7 +191,7 @@ UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) { } - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_DOUBLE); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_DOUBLE); if(var && var->value) { UiDouble *value = var->value; value->get = ui_progressbar_get; @@ -200,7 +200,7 @@ UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) { ui_progressbar_set(value, value->value); } - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, progressbar, FALSE); return progressbar; @@ -228,12 +228,12 @@ void ui_progressbar_set(UiDouble *d, double value) { /* ------------------------- progress spinner ------------------------- */ -UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs args) { +UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args) { UiObject* current = uic_current_obj(obj); GtkWidget *spinner = gtk_spinner_new(); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER); if(var && var->value) { UiInteger *value = var->value; value->get = ui_spinner_get; @@ -242,7 +242,7 @@ UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs args) ui_spinner_set(value, value->value); } - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, spinner, FALSE); return spinner; diff --git a/ui/gtk/entry.c b/ui/gtk/entry.c index 38ebe17..ea02755 100644 --- a/ui/gtk/entry.c +++ b/ui/gtk/entry.c @@ -35,24 +35,24 @@ #include "entry.h" -UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs args) { +UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs *args) { double min = 0; double max = 1000; UiObject* current = uic_current_obj(obj); UiVar *var = NULL; - if(args.varname) { - var = uic_get_var(obj->ctx, args.varname); + if(args->varname) { + var = uic_get_var(obj->ctx, args->varname); } if(!var) { - if(args.intvalue) { - var = uic_widget_var(obj->ctx, current->ctx, args.intvalue, NULL, UI_VAR_INTEGER); - } else if(args.doublevalue) { - var = uic_widget_var(obj->ctx, current->ctx, args.doublevalue, NULL, UI_VAR_DOUBLE); - } else if(args.rangevalue) { - var = uic_widget_var(obj->ctx, current->ctx, args.rangevalue, NULL, UI_VAR_RANGE); + if(args->intvalue) { + var = uic_widget_var(obj->ctx, current->ctx, args->intvalue, NULL, UI_VAR_INTEGER); + } else if(args->doublevalue) { + var = uic_widget_var(obj->ctx, current->ctx, args->doublevalue, NULL, UI_VAR_DOUBLE); + } else if(args->rangevalue) { + var = uic_widget_var(obj->ctx, current->ctx, args->rangevalue, NULL, UI_VAR_RANGE); } } @@ -61,18 +61,18 @@ UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs args) { min = r->min; max = r->max; } - if(args.step == 0) { - args.step = 1; + if(args->step == 0) { + args->step = 1; } #ifdef UI_GTK2LEGACY if(min == max) { max = min + 1; } #endif - GtkWidget *spin = gtk_spin_button_new_with_range(min, max, args.step); - ui_set_name_and_style(spin, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, spin, args.groups); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), args.digits); + GtkWidget *spin = gtk_spin_button_new_with_range(min, max, args->step); + ui_set_name_and_style(spin, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, spin, args->groups); + gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), args->digits); UiObserver **obs = NULL; if(var) { double value = 0; @@ -115,8 +115,8 @@ UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs args) { event->obj = obj; event->var = var; event->observers = obs; - event->callback = args.onchange; - event->userdata = args.onchangedata; + event->callback = args->onchange; + event->userdata = args->onchangedata; g_signal_connect( spin, @@ -129,7 +129,7 @@ UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs args) { G_CALLBACK(ui_destroy_vardata), event); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, spin, FALSE); return spin; diff --git a/ui/gtk/image.c b/ui/gtk/image.c index ea2f6bb..3a2550d 100644 --- a/ui/gtk/image.c +++ b/ui/gtk/image.c @@ -63,7 +63,7 @@ static gboolean imageviewer_draw(GtkWidget *widget, cairo_t *cr, gpointer userda #endif -UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) { +UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs *args) { UiObject *current = uic_current_obj(obj); GtkWidget *drawingarea = gtk_drawing_area_new(); @@ -78,10 +78,10 @@ UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) { widget = eventbox; #endif - if(args.scrollarea) { + if(args->scrollarea) { toplevel = SCROLLEDWINDOW_NEW(); SCROLLEDWINDOW_SET_CHILD(toplevel, widget); - args.adjustwidgetsize = TRUE; + args->adjustwidgetsize = TRUE; } else { toplevel = widget; } @@ -89,29 +89,29 @@ UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) { UiImageViewer *imgviewer = malloc(sizeof(UiImageViewer)); memset(imgviewer, 0, sizeof(UiImageViewer)); imgviewer->obj = obj; - imgviewer->onbuttonpress = args.onbuttonpress; - imgviewer->onbuttonpressdata = args.onbuttonpressdata; - imgviewer->onbuttonrelease = args.onbuttonrelease; - imgviewer->onbuttonreleasedata = args.onbuttonreleasedata; - if(args.image_padding > 0) { - imgviewer->padding_left = args.image_padding; - imgviewer->padding_right = args.image_padding; - imgviewer->padding_top = args.image_padding; - imgviewer->padding_bottom = args.image_padding; + imgviewer->onbuttonpress = args->onbuttonpress; + imgviewer->onbuttonpressdata = args->onbuttonpressdata; + imgviewer->onbuttonrelease = args->onbuttonrelease; + imgviewer->onbuttonreleasedata = args->onbuttonreleasedata; + if(args->image_padding > 0) { + imgviewer->padding_left = args->image_padding; + imgviewer->padding_right = args->image_padding; + imgviewer->padding_top = args->image_padding; + imgviewer->padding_bottom = args->image_padding; } else { - imgviewer->padding_left = args.image_padding_left; - imgviewer->padding_right = args.image_padding_right; - imgviewer->padding_top = args.image_padding_top; - imgviewer->padding_bottom = args.image_padding_bottom; + imgviewer->padding_left = args->image_padding_left; + imgviewer->padding_right = args->image_padding_right; + imgviewer->padding_top = args->image_padding_top; + imgviewer->padding_bottom = args->image_padding_bottom; } - imgviewer->adjustwidgetsize = args.adjustwidgetsize; - imgviewer->autoscale = args.autoscale; - imgviewer->useradjustable = args.useradjustable; + imgviewer->adjustwidgetsize = args->adjustwidgetsize; + imgviewer->autoscale = args->autoscale; + imgviewer->useradjustable = args->useradjustable; imgviewer->zoom_scale = 20; g_object_set_data_full(G_OBJECT(drawingarea), "uiimageviewer", imgviewer, (GDestroyNotify)imageviewer_destroy); - UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC); + UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_GENERIC); imgviewer->var = var; imgviewer->widget = drawingarea; @@ -136,7 +136,7 @@ UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) { imgviewer, NULL); - if(args.useradjustable) { + if(args->useradjustable) { gtk_widget_set_focusable(drawingarea, TRUE); } @@ -182,12 +182,12 @@ UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) { #endif - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, widget); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, widget); ui_widget_set_contextmenu(widget, menu); } - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, toplevel, TRUE); return toplevel; diff --git a/ui/gtk/list.c b/ui/gtk/list.c index 978ab53..2b2772c 100644 --- a/ui/gtk/list.c +++ b/ui/gtk/list.c @@ -189,34 +189,34 @@ static GtkSelectionModel* create_selection_model(UiListView *listview, GListStor return selection_model; } -static UiListView* create_listview(UiObject *obj, UiListArgs args) { +static UiListView* create_listview(UiObject *obj, UiListArgs *args) { UiListView *tableview = malloc(sizeof(UiListView)); memset(tableview, 0, sizeof(UiListView)); tableview->obj = obj; - tableview->model = args.model; - tableview->onactivate = args.onactivate; - tableview->onactivatedata = args.onactivatedata; - tableview->onselection = args.onselection; - tableview->onselectiondata = args.onselectiondata; - tableview->ondragstart = args.ondragstart; - tableview->ondragstartdata = args.ondragstartdata; - tableview->ondragcomplete = args.ondragcomplete; - tableview->ondragcompletedata = args.ondragcompletedata; - tableview->ondrop = args.ondrop; - tableview->ondropdata = args.ondropsdata; + tableview->model = args->model; + tableview->onactivate = args->onactivate; + tableview->onactivatedata = args->onactivatedata; + tableview->onselection = args->onselection; + tableview->onselectiondata = args->onselectiondata; + tableview->ondragstart = args->ondragstart; + tableview->ondragstartdata = args->ondragstartdata; + tableview->ondragcomplete = args->ondragcomplete; + tableview->ondragcompletedata = args->ondragcompletedata; + tableview->ondrop = args->ondrop; + tableview->ondropdata = args->ondropsdata; tableview->selection.count = 0; tableview->selection.rows = NULL; return tableview; } -UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); // to simplify things and share code with ui_table_create, we also // use a UiModel for the listview UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; - args.model = model; + model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; + args->model = model; GListStore *ls = g_list_store_new(G_TYPE_OBJECT); UiListView *listview = create_listview(obj, args); @@ -230,10 +230,10 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { g_signal_connect(factory, "setup", G_CALLBACK(column_factory_setup), listview->columns); g_signal_connect(factory, "bind", G_CALLBACK(column_factory_bind), listview->columns); - GtkSelectionModel *selection_model = create_selection_model(listview, ls, args.multiselection); + GtkSelectionModel *selection_model = create_selection_model(listview, ls, args->multiselection); GtkWidget *view = gtk_list_view_new(GTK_SELECTION_MODEL(selection_model), factory); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); // init listview listview->widget = view; @@ -256,21 +256,21 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { list->setselection = ui_listview_setselection2; ui_update_liststore(ls, list); - } else if (args.static_elements && args.static_nelm > 0) { - listview_copy_static_elements(listview, args.static_elements, args.static_nelm); + } else if (args->static_elements && args->static_nelm > 0) { + listview_copy_static_elements(listview, args->static_elements, args->static_nelm); listview->model->getvalue = ui_strmodel_getvalue; // force strmodel ui_update_liststore_static(ls, listview->elements, listview->nelm); } // event handling - if(args.onactivate) { + if(args->onactivate) { // columnview and listview can use the same callback function, because // the first parameter (which is technically a different pointer type) // is ignored g_signal_connect(view, "activate", G_CALLBACK(ui_columnview_activate), listview); } - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, view); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, view); ui_widget_set_contextmenu(view, menu); } @@ -282,7 +282,7 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, view); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, FALSE); // ct->current should point to view, not scroll_area, to make it possible @@ -292,14 +292,14 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { return scroll_area; } -UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); // to simplify things and share code with ui_tableview_create, we also // use a UiModel for the listview UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; - args.model = model; + model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; + args->model = model; GListStore *ls = g_list_store_new(G_TYPE_OBJECT); UiListView *listview = create_listview(obj, args); @@ -316,7 +316,7 @@ UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs args) { GtkWidget *view = gtk_drop_down_new(G_LIST_MODEL(ls), NULL); gtk_drop_down_set_factory(GTK_DROP_DOWN(view), factory); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); // init listview listview->widget = view; @@ -339,19 +339,19 @@ UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs args) { list->setselection = ui_combobox_setselection; ui_update_liststore(ls, list); - } else if (args.static_elements && args.static_nelm > 0) { - listview_copy_static_elements(listview, args.static_elements, args.static_nelm); + } else if (args->static_elements && args->static_nelm > 0) { + listview_copy_static_elements(listview, args->static_elements, args->static_nelm); listview->model->getvalue = ui_strmodel_getvalue; // force strmodel ui_update_liststore_static(ls, listview->elements, listview->nelm); } // event handling - if(args.onactivate) { + if(args->onactivate) { g_signal_connect(view, "notify::selected", G_CALLBACK(ui_dropdown_notify), listview); } // add widget to parent - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, view, FALSE); return view; } @@ -365,7 +365,7 @@ void ui_combobox_select(UIWIDGET dropdown, int index) { gtk_drop_down_set_selected(GTK_DROP_DOWN(dropdown), index); } -UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); GListStore *ls = g_list_store_new(G_TYPE_OBJECT); @@ -375,10 +375,10 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { // and list updates UiListView *tableview = create_listview(obj, args); - GtkSelectionModel *selection_model = create_selection_model(tableview, ls, args.multiselection); + GtkSelectionModel *selection_model = create_selection_model(tableview, ls, args->multiselection); GtkWidget *view = gtk_column_view_new(GTK_SELECTION_MODEL(selection_model)); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); // init tableview tableview->widget = view; @@ -393,7 +393,7 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { // create columns from UiModel - UiModel *model = args.model; + UiModel *model = args->model; int columns = model ? model->columns : 0; tableview->columns = calloc(columns, sizeof(UiColData)); @@ -439,11 +439,11 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { } // event handling - if(args.onactivate) { + if(args->onactivate) { g_signal_connect(view, "activate", G_CALLBACK(ui_columnview_activate), tableview); } - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, view); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, view); ui_widget_set_contextmenu(view, menu); } @@ -455,7 +455,7 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, view); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, FALSE); // ct->current should point to view, not scroll_area, to make it possible @@ -780,13 +780,13 @@ static GtkListStore* create_list_store(UiList *list, UiModel *model) { } -UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); // create treeview GtkWidget *view = gtk_tree_view_new(); - ui_set_name_and_style(view, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, view, args.groups); + ui_set_name_and_style(view, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, view, args->groups); GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); @@ -803,9 +803,9 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { #endif UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; + model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); UiList *list = var ? var->value : NULL; GtkListStore *listmodel = create_list_store(list, model); @@ -835,24 +835,24 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { // add callback UiTreeEventData *event = malloc(sizeof(UiTreeEventData)); event->obj = obj; - event->activate = args.onactivate; - event->activatedata = args.onactivatedata; - event->selection = args.onselection; - event->selectiondata = args.onselectiondata; + event->activate = args->onactivate; + event->activatedata = args->onactivatedata; + event->selection = args->onselection; + event->selectiondata = args->onselectiondata; g_signal_connect( view, "destroy", G_CALLBACK(ui_destroy_userdata), event); - if(args.onactivate) { + if(args->onactivate) { g_signal_connect( view, "row-activated", G_CALLBACK(ui_listview_activate_event), event); } - if(args.onselection) { + if(args->onselection) { GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(view)); g_signal_connect( @@ -861,8 +861,8 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { G_CALLBACK(ui_listview_selection_event), event); } - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, view); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, view); ui_widget_set_contextmenu(view, menu); } @@ -875,7 +875,7 @@ UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, view); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, FALSE); // ct->current should point to view, not scroll_area, to make it possible @@ -896,13 +896,13 @@ void ui_combobox_select(UIWIDGET dropdown, int index) { gtk_combo_box_set_active(GTK_COMBO_BOX(dropdown), index); } -UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); // create treeview GtkWidget *view = gtk_tree_view_new(); - UiModel *model = args.model; + UiModel *model = args->model; int columns = model ? model->columns : 0; int addi = 0; @@ -959,7 +959,7 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { #endif - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); UiList *list = var ? var->value : NULL; GtkListStore *listmodel = create_list_store(list, model); @@ -977,12 +977,12 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { tableview->widget = view; tableview->var = var; tableview->model = model; - tableview->ondragstart = args.ondragstart; - tableview->ondragstartdata = args.ondragstartdata; - tableview->ondragcomplete = args.ondragcomplete; - tableview->ondragcompletedata = args.ondragcompletedata; - tableview->ondrop = args.ondrop; - tableview->ondropdata = args.ondropsdata; + tableview->ondragstart = args->ondragstart; + tableview->ondragstartdata = args->ondragstartdata; + tableview->ondragcomplete = args->ondragcomplete; + tableview->ondragcompletedata = args->ondragcompletedata; + tableview->ondrop = args->ondrop; + tableview->ondropdata = args->ondropsdata; tableview->selection.count = 0; tableview->selection.rows = NULL; g_signal_connect( @@ -1000,18 +1000,18 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { // add callback UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData)); event->obj = obj; - event->activate = args.onactivate; - event->selection = args.onselection; - event->activatedata = args.onactivatedata; - event->selectiondata = args.onselectiondata; - if(args.onactivate) { + event->activate = args->onactivate; + event->selection = args->onselection; + event->activatedata = args->onactivatedata; + event->selectiondata = args->onselectiondata; + if(args->onactivate) { g_signal_connect( view, "row-activated", G_CALLBACK(ui_listview_activate_event), event); } - if(args.onselection) { + if(args->onselection) { GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(view)); g_signal_connect( @@ -1023,15 +1023,15 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { // TODO: destroy callback - if(args.ondragstart) { - ui_listview_add_dnd(tableview, &args); + if(args->ondragstart) { + ui_listview_add_dnd(tableview, args); } - if(args.ondrop) { - ui_listview_enable_drop(tableview, &args); + if(args->ondrop) { + ui_listview_enable_drop(tableview, args); } GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view)); - if(args.multiselection) { + if(args->multiselection) { gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); } @@ -1043,8 +1043,8 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, view); - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, scroll_area); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, scroll_area); #if GTK_MAJOR_VERSION >= 4 ui_widget_set_contextmenu(scroll_area, menu); #else @@ -1052,7 +1052,7 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { #endif } - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, FALSE); // ct->current should point to view, not scroll_area, to make it possible @@ -1102,18 +1102,18 @@ void ui_listview_setselection(UiList *list, UiListSelection selection) { /* --------------------------- ComboBox --------------------------- */ -UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; + model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); - GtkWidget *combobox = ui_create_combobox(obj, model, var, args.static_elements, args.static_nelm, args.onactivate, args.onactivatedata); - ui_set_name_and_style(combobox, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, combobox, args.groups); - UI_APPLY_LAYOUT1(current, args); + GtkWidget *combobox = ui_create_combobox(obj, model, var, args->static_elements, args->static_nelm, args->onactivate, args->onactivatedata); + ui_set_name_and_style(combobox, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, combobox, args->groups); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, combobox, FALSE); current->container->current = combobox; return combobox; @@ -1758,7 +1758,7 @@ static void add_sublist(UiListBox *uilistbox, CxList *sublists, UiSubList *subli cxListAdd(sublists, &uisublist); } -UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) { +UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args) { UiObject* current = uic_current_obj(obj); #ifdef UI_GTK3 @@ -1766,7 +1766,7 @@ UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) { #else GtkWidget *listbox = gtk_list_box_new(); #endif - if(!args.style_class) { + if(!args->style_class) { #if GTK_MAJOR_VERSION >= 4 WIDGET_ADD_CSS_CLASS(listbox, "navigation-sidebar"); #else @@ -1777,31 +1777,31 @@ UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) { GtkWidget *scroll_area = SCROLLEDWINDOW_NEW(); SCROLLEDWINDOW_SET_CHILD(scroll_area, listbox); - ui_set_name_and_style(listbox, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, listbox, args.groups); - UI_APPLY_LAYOUT1(current, args); + ui_set_name_and_style(listbox, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, listbox, args->groups); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, TRUE); UiListBox *uilistbox = malloc(sizeof(UiListBox)); uilistbox->obj = obj; uilistbox->listbox = GTK_LIST_BOX(listbox); - uilistbox->getvalue = args.getvalue; - uilistbox->onactivate = args.onactivate; - uilistbox->onactivatedata = args.onactivatedata; - uilistbox->onbuttonclick = args.onbuttonclick; - uilistbox->onbuttonclickdata = args.onbuttonclickdata; + uilistbox->getvalue = args->getvalue; + uilistbox->onactivate = args->onactivate; + uilistbox->onactivatedata = args->onactivatedata; + uilistbox->onbuttonclick = args->onbuttonclick; + uilistbox->onbuttonclickdata = args->onbuttonclickdata; uilistbox->sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), 4); uilistbox->sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_destroy; uilistbox->sublists->collection.destructor_data = obj; uilistbox->first_row = NULL; - if(args.sublists) { + if(args->sublists) { // static sublist initalization - if(args.numsublists == 0 && args.sublists) { - args.numsublists = INT_MAX; + if(args->numsublists == 0 && args->sublists) { + args->numsublists = INT_MAX; } - for(int i=0;inumsublists;i++) { + UiSubList sublist = args->sublists[i]; if(!sublist.varname && !sublist.value) { break; } @@ -1812,7 +1812,7 @@ UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) { // fill items ui_listbox_update(uilistbox, 0, cxListSize(uilistbox->sublists)); } else { - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.dynamic_sublist, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->dynamic_sublist, args->varname, UI_VAR_LIST); if(var) { UiList *list = var->value; list->obj = uilistbox; @@ -1834,7 +1834,7 @@ UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) { G_CALLBACK(ui_destroy_sourcelist), uilistbox); - if(args.onactivate) { + if(args->onactivate) { g_signal_connect( listbox, "row-activated", diff --git a/ui/gtk/text.c b/ui/gtk/text.c index 475543c..3e81342 100644 --- a/ui/gtk/text.c +++ b/ui/gtk/text.c @@ -107,13 +107,13 @@ static GtkTextBuffer* create_textbuffer(UiTextArea *textarea) { return buf; } -UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { +UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { UiObject* current = uic_current_obj(obj); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_TEXT); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_TEXT); GtkWidget *text_area = gtk_text_view_new(); - ui_set_name_and_style(text_area, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, text_area, args.groups); + ui_set_name_and_style(text_area, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, text_area, args->groups); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_area), GTK_WRAP_WORD_CHAR); g_signal_connect( @@ -127,8 +127,8 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { uitext->ctx = obj->ctx; uitext->var = var; uitext->last_selection_state = 0; - uitext->onchange = args.onchange; - uitext->onchangedata = args.onchangedata; + uitext->onchange = args->onchange; + uitext->onchangedata = args->onchangedata; g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext); @@ -155,7 +155,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text_area), 2); // add - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, TRUE); // bind value @@ -592,21 +592,21 @@ void ui_text_redo(UiText *value) { -static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool password, UiTextFieldArgs args) { +static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool password, UiTextFieldArgs *args) { GtkWidget *textfield = gtk_entry_new(); - ui_set_name_and_style(textfield, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, textfield, args.groups); + ui_set_name_and_style(textfield, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, textfield, args->groups); UiObject* current = uic_current_obj(obj); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); UiTextField *uitext = malloc(sizeof(UiTextField)); uitext->obj = obj; uitext->var = var; - uitext->onchange = args.onchange; - uitext->onchangedata = args.onchangedata; - uitext->onactivate = args.onactivate; - uitext->onactivatedata = args.onactivatedata; + uitext->onchange = args->onchange; + uitext->onchangedata = args->onchangedata; + uitext->onactivate = args->onactivate; + uitext->onactivatedata = args->onactivatedata; g_signal_connect( textfield, @@ -614,10 +614,10 @@ static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool passwor G_CALLBACK(ui_textfield_destroy), uitext); - if(args.width > 0) { + if(args->width > 0) { // TODO: gtk4 #if GTK_MAJOR_VERSION <= 3 - gtk_entry_set_width_chars(GTK_ENTRY(textfield), args.width); + gtk_entry_set_width_chars(GTK_ENTRY(textfield), args->width); #endif } if(frameless) { @@ -628,7 +628,7 @@ static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool passwor gtk_entry_set_visibility(GTK_ENTRY(textfield), FALSE); } - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, textfield, FALSE); if(var) { @@ -647,7 +647,7 @@ static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool passwor value->obj = GTK_ENTRY(textfield); } - if(args.onchange || var) { + if(args->onchange || var) { g_signal_connect( textfield, "changed", @@ -655,7 +655,7 @@ static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool passwor uitext); } - if(args.onactivate) { + if(args->onactivate) { g_signal_connect( textfield, "activate", @@ -666,15 +666,15 @@ static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool passwor return textfield; } -UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args) { +UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) { return create_textfield(obj, FALSE, FALSE, args); } -UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) { return create_textfield(obj, TRUE, FALSE, args); } -UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { return create_textfield(obj, FALSE, TRUE, args); } @@ -915,22 +915,22 @@ static gboolean ui_path_textfield_key_controller( return FALSE; } -UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { +UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { UiObject* current = uic_current_obj(obj); UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); memset(pathtf, 0, sizeof(UiPathTextField)); pathtf->obj = obj; - pathtf->getpathelm = args.getpathelm; - pathtf->getpathelmdata = args.getpathelmdata; - pathtf->onactivate = args.onactivate; - pathtf->onactivatedata = args.onactivatedata; - pathtf->ondragcomplete = args.ondragcomplete; - pathtf->ondragcompletedata = args.ondragcompletedata; - pathtf->ondragstart = args.ondragstart; - pathtf->ondragstartdata = args.ondragstartdata; - pathtf->ondrop = args.ondrop; - pathtf->ondropdata = args.ondropsdata; + pathtf->getpathelm = args->getpathelm; + pathtf->getpathelmdata = args->getpathelmdata; + pathtf->onactivate = args->onactivate; + pathtf->onactivatedata = args->onactivatedata; + pathtf->ondragcomplete = args->ondragcomplete; + pathtf->ondragcompletedata = args->ondragcompletedata; + pathtf->ondragstart = args->ondragstart; + pathtf->ondragstartdata = args->ondragstartdata; + pathtf->ondrop = args->ondrop; + pathtf->ondropdata = args->ondropsdata; if(!pathtf->getpathelm) { pathtf->getpathelm = default_pathelm_func; @@ -940,7 +940,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { pathtf->stack = gtk_stack_new(); gtk_widget_set_name(pathtf->stack, "path-textfield-box"); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, pathtf->stack, FALSE); pathtf->entry_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); @@ -973,7 +973,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { gtk_stack_set_visible_child(GTK_STACK(pathtf->stack), pathtf->entry_box); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); if (var) { UiString* value = (UiString*)var->value; value->obj = pathtf; @@ -1076,22 +1076,22 @@ static GtkWidget* create_path_button_box() { return bb; } -UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { +UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { UiObject* current = uic_current_obj(obj); UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); memset(pathtf, 0, sizeof(UiPathTextField)); pathtf->obj = obj; - pathtf->getpathelm = args.getpathelm; - pathtf->getpathelmdata = args.getpathelmdata; - pathtf->onactivate = args.onactivate; - pathtf->onactivatedata = args.onactivatedata; - pathtf->ondragcomplete = args.ondragcomplete; - pathtf->ondragcompletedata = args.ondragcompletedata; - pathtf->ondragstart = args.ondragstart; - pathtf->ondragstartdata = args.ondragstartdata; - pathtf->ondrop = args.ondrop; - pathtf->ondropdata = args.ondropsdata; + pathtf->getpathelm = args->getpathelm; + pathtf->getpathelmdata = args->getpathelmdata; + pathtf->onactivate = args->onactivate; + pathtf->onactivatedata = args->onactivatedata; + pathtf->ondragcomplete = args->ondragcomplete; + pathtf->ondragcompletedata = args->ondragcompletedata; + pathtf->ondragstart = args->ondragstart; + pathtf->ondragstartdata = args->ondragstartdata; + pathtf->ondrop = args->ondrop; + pathtf->ondropdata = args->ondropsdata; if(!pathtf->getpathelm) { pathtf->getpathelm = default_pathelm_func; @@ -1112,7 +1112,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { G_CALLBACK(ui_path_textfield_destroy), pathtf); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, eventbox, FALSE); // hbox as parent for the GtkEntry and GtkButtonBox @@ -1137,7 +1137,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { G_CALLBACK(ui_path_textfield_key_press), pathtf); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); if (var) { UiString* value = (UiString*)var->value; value->obj = pathtf; diff --git a/ui/gtk/webview.c b/ui/gtk/webview.c index 9f3bebb..1cd09aa 100644 --- a/ui/gtk/webview.c +++ b/ui/gtk/webview.c @@ -33,14 +33,14 @@ #ifdef UI_WEBVIEW -UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs args) { +UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs *args) { UiObject* current = uic_current_obj(obj); GtkWidget *webview = webkit_web_view_new(); - ui_set_name_and_style(webview, args.name, args.style_class); + ui_set_name_and_style(webview, args->name, args->style_class); - UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC); + UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_GENERIC); if(var) { WebViewData *data = malloc(sizeof(WebViewData)); memset(data, 0, sizeof(WebViewData)); @@ -59,8 +59,8 @@ UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs args) { } } - ui_set_widget_groups(obj->ctx, webview, args.groups); - UI_APPLY_LAYOUT1(current, args); + ui_set_widget_groups(obj->ctx, webview, args->groups); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, webview, FALSE); return webview; @@ -115,7 +115,14 @@ void ui_webview_load_content( const char *mimetype, const char *encoding) { + WebViewData *data0 = g->obj; + if(!data0) { + return; + } + WebViewData data; + memset(&data, 0, sizeof(WebViewData)); + data.webview = data0->webview; data.uri = (char*)uri; data.content = (char*)content; data.contentlength = contentlength; diff --git a/ui/gtk/widget.c b/ui/gtk/widget.c index 505bca6..633b0f9 100644 --- a/ui/gtk/widget.c +++ b/ui/gtk/widget.c @@ -31,12 +31,12 @@ #include "../common/object.h" -UIEXPORT UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs args) { +UIEXPORT UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs *args) { UiObject* current = uic_current_obj(obj); UIWIDGET widget = create_widget(obj, args, userdata); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, widget, FALSE); return widget; diff --git a/ui/motif/Makefile b/ui/motif/Makefile index 3f7c064..7f7b420 100644 --- a/ui/motif/Makefile +++ b/ui/motif/Makefile @@ -27,7 +27,10 @@ # $(MOTIF_OBJPRE)%.o: motif/%.c - $(CC) -o $@ -c -I../ucx $(CFLAGS) $(TK_CFLAGS) $< + $(CC) -o $@ -c -I../ucx $(CFLAGS) $(SHLIB_CFLAGS) $(TK_CFLAGS) $< $(UI_LIB): $(OBJ) $(AR) $(ARFLAGS) $(UI_LIB) $(OBJ) + +$(UI_SHLIB): $(OBJ) + $(CC) -o $(UI_SHLIB) $(LDFLAGS) $(SHLIB_LDFLAGS) $(TK_LDFLAGS) $(OBJ) -L../build/lib -lucx diff --git a/ui/motif/button.c b/ui/motif/button.c index 6ca74ad..b8ede8b 100644 --- a/ui/motif/button.c +++ b/ui/motif/button.c @@ -41,7 +41,7 @@ #include -UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) { +UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) { Arg xargs[16]; int n = 0; @@ -51,22 +51,22 @@ UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) { Widget parent = ctn->prepare(ctn, xargs, &n); XmString label = NULL; - if(args.label) { - label = XmStringCreateLocalized((char*)args.label); + if(args->label) { + label = XmStringCreateLocalized((char*)args->label); XtSetArg(xargs[n], XmNlabelString, label); n++; } - char *name = args.name ? (char*)args.name : "button"; + char *name = args->name ? (char*)args->name : "button"; Widget button = XmCreatePushButton(parent, name, xargs, n); XtManageChild(button); ctn->add(ctn, button); - ui_set_widget_groups(obj->ctx, button, args.groups); + ui_set_widget_groups(obj->ctx, button, args->groups); - if(args.onclick) { + if(args->onclick) { UiEventData *eventdata = malloc(sizeof(UiEventData)); - eventdata->callback = args.onclick; - eventdata->userdata = args.onclickdata; + eventdata->callback = args->onclick; + eventdata->userdata = args->onclickdata; eventdata->obj = obj; eventdata->value = 0; XtAddCallback( @@ -96,7 +96,7 @@ void ui_push_button_callback(Widget widget, UiEventData *event, XtPointer d) { event->callback(&e, event->userdata); } -UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { Arg xargs[16]; int n = 0; @@ -108,25 +108,25 @@ UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { XtSetArg(xargs[n], XmNindicatorOn, False); n++; XmString label = NULL; - if(args.label) { - label = XmStringCreateLocalized((char*)args.label); + if(args->label) { + label = XmStringCreateLocalized((char*)args->label); XtSetArg(xargs[n], XmNlabelString, label); n++; } - char *name = args.name ? (char*)args.name : "togglebutton"; + char *name = args->name ? (char*)args->name : "togglebutton"; Widget button = XmCreateToggleButton(parent, name, xargs, n); XtManageChild(button); ctn->add(ctn, button); - ui_set_widget_groups(obj->ctx, button, args.groups); + ui_set_widget_groups(obj->ctx, button, args->groups); - ui_bind_togglebutton(obj, button, args.varname, args.value, args.onchange, args.onchangedata, args.enable_group); + ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_group); XmStringFree(label); return button; } -UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { Arg xargs[16]; int n = 0; @@ -136,25 +136,25 @@ UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { Widget parent = ctn->prepare(ctn, xargs, &n); XmString label = NULL; - if(args.label) { - label = XmStringCreateLocalized((char*)args.label); + if(args->label) { + label = XmStringCreateLocalized((char*)args->label); XtSetArg(xargs[n], XmNlabelString, label); n++; } - char *name = args.name ? (char*)args.name : "button"; + char *name = args->name ? (char*)args->name : "button"; Widget button = XmCreateToggleButton(parent, name, xargs, n); XtManageChild(button); ctn->add(ctn, button); - ui_set_widget_groups(obj->ctx, button, args.groups); + ui_set_widget_groups(obj->ctx, button, args->groups); - ui_bind_togglebutton(obj, button, args.varname, args.value, args.onchange, args.onchangedata, args.enable_group); + ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_group); XmStringFree(label); return button; } -UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { return ui_checkbox_create(obj, args); } @@ -343,7 +343,7 @@ void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const event); } -UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) { Arg xargs[16]; int n = 0; @@ -353,19 +353,19 @@ UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { Widget parent = ctn->prepare(ctn, xargs, &n); XtSetArg(xargs[n], XmNindicatorType, XmONE_OF_MANY_ROUND); n++; XmString label = NULL; - if(args.label) { - label = XmStringCreateLocalized((char*)args.label); + if(args->label) { + label = XmStringCreateLocalized((char*)args->label); XtSetArg(xargs[n], XmNlabelString, label); n++; } - char *name = args.name ? (char*)args.name : "button"; + char *name = args->name ? (char*)args->name : "button"; Widget button = XmCreateToggleButton(parent, name, xargs, n); XtManageChild(button); ctn->add(ctn, button); - ui_set_widget_groups(obj->ctx, button, args.groups); + ui_set_widget_groups(obj->ctx, button, args->groups); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); if(var) { UiInteger *value = var->value; CxList *rb = value->obj; @@ -396,11 +396,11 @@ UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { // other buttons in the radio button group UiVarEventData *event = malloc(sizeof(UiVarEventData)); event->obj = obj; - event->callback = args.onchange; - event->userdata = args.onchangedata; + event->callback = args->onchange; + event->userdata = args->onchangedata; event->observers = NULL; event->var = var; - event->value = args.enable_group; + event->value = args->enable_group; XtAddCallback( button, XmNvalueChangedCallback, diff --git a/ui/motif/container.c b/ui/motif/container.c index 7658f11..13377ab 100644 --- a/ui/motif/container.c +++ b/ui/motif/container.c @@ -43,7 +43,7 @@ /* ---------------------------- Box Container ---------------------------- */ -static UIWIDGET box_create(UiObject *obj, UiContainerArgs args, UiBoxOrientation orientation) { +static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientation orientation) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); @@ -51,13 +51,13 @@ static UIWIDGET box_create(UiObject *obj, UiContainerArgs args, UiBoxOrientation int n = 0; if(orientation == UI_BOX_VERTICAL) { - //XtSetArg(xargs[n], gridRowSpacing, args.spacing); n++; + //XtSetArg(xargs[n], gridRowSpacing, args->spacing); n++; } else { - //XtSetArg(xargs[n], gridColumnSpacing, args.spacing); n++; + //XtSetArg(xargs[n], gridColumnSpacing, args->spacing); n++; } Widget parent = ctn->prepare(ctn, xargs, &n); - Widget grid = XtCreateManagedWidget(args.name ? args.name : "boxcontainer", gridClass, parent, xargs, n); + Widget grid = XtCreateManagedWidget(args->name ? args->name : "boxcontainer", gridClass, parent, xargs, n); ctn->add(ctn, grid); UiContainerX *container = ui_box_container(obj, grid, orientation); @@ -67,12 +67,12 @@ static UIWIDGET box_create(UiObject *obj, UiContainerArgs args, UiBoxOrientation } // public -UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) { +UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) { return box_create(obj, args, UI_BOX_VERTICAL); } // public -UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) { +UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) { return box_create(obj, args, UI_BOX_HORIZONTAL); } @@ -129,7 +129,7 @@ void ui_box_container_add(UiContainerPrivate *ctn, Widget widget) { /* ---------------------------- Grid Container ---------------------------- */ // public -UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) { +UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { Arg xargs[16]; int n = 0; @@ -137,13 +137,13 @@ UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) { UI_APPLY_LAYOUT(ctn->layout, args); Widget parent = ctn->prepare(ctn, xargs, &n); - XtSetArg(xargs[n], gridMargin, args.margin); n++; - XtSetArg(xargs[n], gridColumnSpacing, args.columnspacing); n++; - XtSetArg(xargs[n], gridRowSpacing, args.rowspacing); n++; - Widget grid = XtCreateManagedWidget(args.name ? args.name : "gridcontainer", gridClass, parent, xargs, n); + XtSetArg(xargs[n], gridMargin, args->margin); n++; + XtSetArg(xargs[n], gridColumnSpacing, args->columnspacing); n++; + XtSetArg(xargs[n], gridRowSpacing, args->rowspacing); n++; + Widget grid = XtCreateManagedWidget(args->name ? args->name : "gridcontainer", gridClass, parent, xargs, n); ctn->add(ctn, grid); - UiContainerX *container = ui_grid_container(obj, grid, args.def_hexpand, args.def_vexpand, args.def_hfill, args.def_vfill); + UiContainerX *container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill); uic_object_push_container(obj, container); return grid; @@ -308,7 +308,7 @@ static void ui_tabbar_expose(Widget widget, XtPointer udata, XtPointer cdata) { } } -UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs args) { +UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs *args) { Arg xargs[16]; int n = 0; @@ -321,7 +321,7 @@ UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs args) { // - content (Frame) UiMotifTabView *tabview = malloc(sizeof(UiMotifTabView)); memset(tabview, 0, sizeof(UiMotifTabView)); - char *name = args.name ? (char*)args.name : "tabview"; + char *name = args->name ? (char*)args->name : "tabview"; XtSetArg(xargs[n], XmNuserData, tabview); n++; Widget parent = ctn->prepare(ctn, xargs, &n); Widget form = XmCreateForm(parent, name, xargs, n); @@ -354,8 +354,8 @@ UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs args) { tabview->form = form; tabview->tabbar = tabbar; tabview->content = content; - tabview->tabview = args.tabview; - tabview->subcontainer = args.subcontainer; + tabview->tabview = args->tabview; + tabview->subcontainer = args->subcontainer; tabview->select = ui_motif_tabview_select; tabview->add = ui_motif_tabview_add_tab; tabview->remove = ui_motif_tabview_remove; @@ -369,7 +369,7 @@ UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs args) { ct->container.add = ui_tabview_container_add; ct->tabview = tabview; - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); if(var) { UiInteger *i = var->value; i->obj = tabview; @@ -411,7 +411,7 @@ void ui_tab_create(UiObject *obj, const char* title) { } - Widget child = ui_vbox_create(obj, (UiContainerArgs) { 0 }); + Widget child = ui_vbox_create(obj, &(UiContainerArgs) { 0 }); if(tabview->current) { XtUnmanageChild(child); } else { @@ -605,7 +605,7 @@ static UiContainerX* ui_scrolledwindow_container(UiObject *obj, Widget scrolledw return (UiContainerX*)ctn; } -UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs args) { +UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); diff --git a/ui/motif/container.h b/ui/motif/container.h index 326f3d9..596e372 100644 --- a/ui/motif/container.h +++ b/ui/motif/container.h @@ -39,14 +39,14 @@ extern "C" { #endif #define UI_APPLY_LAYOUT(layout, args) \ - layout.fill = args.fill; \ - layout.hexpand = args.hexpand; \ - layout.vexpand = args.vexpand; \ - layout.hfill = args.hfill; \ - layout.vfill = args.vfill; \ - layout.override_defaults = args.override_defaults; \ - layout.colspan = args.colspan; \ - layout.rowspan = args.rowspan + layout.fill = args->fill; \ + layout.hexpand = args->hexpand; \ + layout.vexpand = args->vexpand; \ + layout.hfill = args->hfill; \ + layout.vfill = args->vfill; \ + layout.override_defaults = args->override_defaults; \ + layout.colspan = args->colspan; \ + layout.rowspan = args->rowspan typedef enum UiBoxOrientation UiBoxOrientation; diff --git a/ui/motif/label.c b/ui/motif/label.c index 3c4856e..37d5da3 100644 --- a/ui/motif/label.c +++ b/ui/motif/label.c @@ -36,7 +36,7 @@ #include "Grid.h" -static UIWIDGET label_create(UiObject *obj, UiLabelArgs args, int align) { +static UIWIDGET label_create(UiObject *obj, UiLabelArgs *args, int align) { Arg xargs[16]; int n = 0; @@ -47,12 +47,12 @@ static UIWIDGET label_create(UiObject *obj, UiLabelArgs args, int align) { XtSetArg(xargs[n], XmNalignment, align); n++; XmString label = NULL; - if(args.label) { - label = XmStringCreateLocalized((char*)args.label); + if(args->label) { + label = XmStringCreateLocalized((char*)args->label); XtSetArg(xargs[n], XmNlabelString, label); n++; } - char *name = args.name ? (char*)args.name : "label"; + char *name = args->name ? (char*)args->name : "label"; Widget w = XmCreateLabel(parent, name, xargs, n); XtManageChild(w); ctn->add(ctn, w); @@ -61,15 +61,15 @@ static UIWIDGET label_create(UiObject *obj, UiLabelArgs args, int align) { return w; } -UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs args) { +UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs *args) { return label_create(obj, args, XmALIGNMENT_CENTER); } -UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs args) { +UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs *args) { return label_create(obj, args, XmALIGNMENT_BEGINNING); } -UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs args) { +UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs *args) { return label_create(obj, args, XmALIGNMENT_END); } @@ -103,7 +103,7 @@ static void ui_progressbar_expose(Widget widget, UiProgressBar *pb, XtPointer c) XFillRectangle(dp, w, pb->gc, 0, 0, valueW, widget->core.height); } -UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) { +UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args) { Arg xargs[16]; int n = 0; @@ -112,7 +112,7 @@ UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) { Widget parent = ctn->prepare(ctn, xargs, &n); - char *name = args.name ? (char*)args.name : "progressbar"; + char *name = args->name ? (char*)args->name : "progressbar"; Widget frame = XmCreateFrame(parent, name, xargs, n); // create a button and get some informations about the height, shadow, highlight, .... @@ -137,12 +137,12 @@ UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) { Widget drawingArea = XmCreateDrawingArea(frame, "progressbar_drawingarea", xargs, n); XtManageChild(drawingArea); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_DOUBLE); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_DOUBLE); UiProgressBar *progressbarData = malloc(sizeof(UiProgressBar)); progressbarData->widget = drawingArea; - progressbarData->min = args.min; - progressbarData->max = args.max == 0 ? 100 : args.max; + progressbarData->min = args->min; + progressbarData->max = args->max == 0 ? 100 : args->max; progressbarData->value = 50; progressbarData->var = var; progressbarData->color = highlightColor; @@ -186,7 +186,7 @@ void ui_progressbar_set(UiDouble *d, double value) { } -UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs args) { +UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args) { Arg xargs[16]; int n = 0; @@ -200,12 +200,12 @@ UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs args) XtSetArg(xargs[n], XmNalignment, XmALIGNMENT_END); n++; XtSetArg(xargs[n], gridMinWidth, 40); n++; - char *name = args.name ? (char*)args.name : "progresss_spinner"; + char *name = args->name ? (char*)args->name : "progresss_spinner"; Widget w = XmCreateLabel(parent, name, xargs, n); XtManageChild(w); ctn->add(ctn, w); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); if(var) { UiInteger *value = var->value; value->obj = w; diff --git a/ui/motif/list.c b/ui/motif/list.c index f53cbb7..4a6a143 100644 --- a/ui/motif/list.c +++ b/ui/motif/list.c @@ -34,36 +34,36 @@ #include "list.h" #include "../common/object.h" -UIWIDGET ui_listview_create(UiObject* obj, UiListArgs args) { +UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) { Arg xargs[16]; int n = 0; UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); - if(args.multiselection) { + if(args->multiselection) { XtSetArg(xargs[n], XmNselectionPolicy, XmEXTENDED_SELECT); n++; } else { XtSetArg(xargs[n], XmNselectionPolicy, XmSINGLE_SELECT); n++; } - char *name = args.name ? (char*)args.name : "listview"; + char *name = args->name ? (char*)args->name : "listview"; Widget parent = ctn->prepare(ctn, xargs, &n); Widget widget = XmCreateScrolledList(parent, name, xargs, n); XtManageChild(widget); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); UiListView *listview = malloc(sizeof(UiListView)); memset(listview, 0, sizeof(UiListView)); listview->obj = obj; listview->widget = widget; - listview->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; + listview->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; listview->var = var; - listview->onactivate = args.onactivate; - listview->onactivatedata = args.onactivatedata; - listview->onselection = args.onselection; - listview->onselectiondata = args.onselectiondata; + listview->onactivate = args->onactivate; + listview->onactivatedata = args->onactivatedata; + listview->onselection = args->onselection; + listview->onselectiondata = args->onselectiondata; if(var) { UiList *list = var->value; @@ -227,30 +227,30 @@ static void ui_dropdown_selection( } } -UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs args) { +UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs *args) { Arg xargs[16]; int n = 0; UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); - char *name = args.name ? (char*)args.name : "dropdown"; + char *name = args->name ? (char*)args->name : "dropdown"; Widget parent = ctn->prepare(ctn, xargs, &n); Widget widget = XmCreateDropDownList(parent, name, xargs, n); XtManageChild(widget); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); UiListView *listview = malloc(sizeof(UiListView)); memset(listview, 0, sizeof(UiListView)); listview->obj = obj; listview->widget = widget; - listview->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; + listview->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; listview->var = var; - listview->onactivate = args.onactivate; - listview->onactivatedata = args.onactivatedata; - listview->onselection = args.onselection; - listview->onselectiondata = args.onselectiondata; + listview->onactivate = args->onactivate; + listview->onactivatedata = args->onactivatedata; + listview->onselection = args->onselection; + listview->onselectiondata = args->onselectiondata; if(var) { UiList *list = var->value; diff --git a/ui/motif/text.c b/ui/motif/text.c index bcb9be4..08ade21 100644 --- a/ui/motif/text.c +++ b/ui/motif/text.c @@ -38,7 +38,7 @@ /* ------------------------------ Text Area ------------------------------ */ -UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { +UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { Arg xargs[16]; int n = 0; @@ -48,12 +48,12 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { UI_APPLY_LAYOUT(ctn->layout, args); Widget parent = ctn->prepare(ctn, xargs, &n); - char *name = args.name ? (char*)args.name : "textarea"; + char *name = args->name ? (char*)args->name : "textarea"; XtSetArg(xargs[n], XmNwidth, 100); n++; Widget widget = XmCreateScrolledText(parent, name, xargs, n); XtManageChild(widget); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_TEXT); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_TEXT); UiTextArea *textarea = malloc(sizeof(UiTextArea)); memset(textarea, 0, sizeof(UiTextArea)); @@ -383,7 +383,7 @@ void ui_text_redo(UiText *value) { /* ------------------------------ Text Field ------------------------------ */ -static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs args, int frameless, int password) { +static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs *args, int frameless, int password) { Arg xargs[16]; int n = 0; @@ -399,13 +399,13 @@ static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs args, int framel UI_APPLY_LAYOUT(ctn->layout, args); Widget parent = ctn->prepare(ctn, xargs, &n); - char *name = args.name ? (char*)args.name : "textfield"; + char *name = args->name ? (char*)args->name : "textfield"; Widget textfield = XmCreateTextField(parent, name, xargs, n); XtManageChild(textfield); - ui_set_widget_groups(obj->ctx, textfield, args.groups); + ui_set_widget_groups(obj->ctx, textfield, args->groups); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); if(var) { UiString *value = (UiString*)var->value; value->obj = textfield; @@ -420,15 +420,15 @@ static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs args, int framel return textfield; } -UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args) { +UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) { return create_textfield(obj, args, FALSE, FALSE); } -UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) { return create_textfield(obj, args, TRUE, FALSE); } -UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { return create_textfield(obj, args, FALSE, FALSE); } @@ -965,7 +965,7 @@ static void pathbar_activate(void *data, char *path, int index) { event->callback(&evt, event->userdata); } -UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { +UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { Arg xargs[16]; int n = 0; @@ -977,18 +977,18 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { PathBar *pathbar = CreatePathBar(parent, xargs, n); - if(!args.getpathelm) { + if(!args->getpathelm) { pathbar->getpathelm= default_pathelm_func; } else { - pathbar->getpathelm = args.getpathelm; - pathbar->getpathelmdata = args.getpathelmdata; + pathbar->getpathelm = args->getpathelm; + pathbar->getpathelmdata = args->getpathelmdata; } XtManageChild(pathbar->widget); ctn->add(ctn, pathbar->widget); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); if (var) { UiString* value = (UiString*)var->value; value->obj = pathbar; @@ -1002,10 +1002,10 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { } } - if(args.onactivate) { + if(args->onactivate) { UiEventData *eventdata = malloc(sizeof(UiEventData)); - eventdata->callback = args.onactivate; - eventdata->userdata = args.onactivatedata; + eventdata->callback = args->onactivate; + eventdata->userdata = args->onactivatedata; eventdata->obj = obj; eventdata->value = 0; diff --git a/ui/motif/widget.c b/ui/motif/widget.c index e8b566a..18e2a8e 100644 --- a/ui/motif/widget.c +++ b/ui/motif/widget.c @@ -37,7 +37,7 @@ #include "../common/object.h" -UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs args) { +UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs *args) { Arg xargs[64]; int n = 0; @@ -56,12 +56,11 @@ UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widge UIEXPORT UIWIDGET ui_separator_create(UiObject *obj, UiWidgetArgs *args) { Arg xargs[64]; int n = 0; - UiWidgetArgs a = *args; UiContainerPrivate *ctn = ui_obj_container(obj); - UI_APPLY_LAYOUT(ctn->layout, a); + UI_APPLY_LAYOUT(ctn->layout, args); - char *name = a.name ? (char*)a.name : "separator"; + char *name = args->name ? (char*)args->name : "separator"; Widget parent = ctn->prepare(ctn, xargs, &n); Widget widget = XmCreateSeparator(parent, name, xargs, n); XtManageChild(widget); diff --git a/ui/qt/button.cpp b/ui/qt/button.cpp index 827279c..f563d21 100644 --- a/ui/qt/button.cpp +++ b/ui/qt/button.cpp @@ -30,15 +30,15 @@ #include "container.h" #include "toolkit.h" -UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) { +UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); - QString str = QString::fromUtf8(args.label); + QString str = QString::fromUtf8(args->label); QPushButton *button = new QPushButton(str); - if(args.onclick) { - UiEventWrapper *event = new UiEventWrapper(obj, args.onclick, args.onclickdata); + if(args->onclick) { + UiEventWrapper *event = new UiEventWrapper(obj, args->onclick, args->onclickdata); button->connect(button, SIGNAL(clicked()), event, SLOT(slot())); button->connect(button, SIGNAL(destroyed()), event, SLOT(destroy())); } @@ -56,18 +56,18 @@ static void togglebutton_event(UiEvent *event, UiEventWrapper *wrapper) { } } -UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); - QString str = QString::fromUtf8(args.label); + QString str = QString::fromUtf8(args->label); QPushButton *button = new QPushButton(str); button->setCheckable(true); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); - if(args.onchange) { - UiEventWrapper *event = new UiEventWrapper(obj, args.onchange, args.onchangedata); + if(args->onchange) { + UiEventWrapper *event = new UiEventWrapper(obj, args->onchange, args->onchangedata); event->var = var; event->customdata1 = button; event->prepare_event = togglebutton_event; @@ -115,17 +115,17 @@ static void checkbox_event(UiEvent *event, UiEventWrapper *wrapper) { } -UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); - QString str = QString::fromUtf8(args.label); + QString str = QString::fromUtf8(args->label); QCheckBox *checkbox = new QCheckBox(str); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); - if(args.onchange) { - UiEventWrapper *event = new UiEventWrapper(obj, args.onchange, args.onchangedata); + if(args->onchange) { + UiEventWrapper *event = new UiEventWrapper(obj, args->onchange, args->onchangedata); event->var = var; event->customdata1 = checkbox; event->prepare_event = checkbox_event; @@ -173,15 +173,15 @@ static void radiobutton_event(UiEvent *event, UiEventWrapper *wrapper) { } } -UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs args) { +UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); - QString str = QString::fromUtf8(args.label); + QString str = QString::fromUtf8(args->label); QRadioButton *button = new QRadioButton(str); button->setAutoExclusive(false); - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); if(var) { UiInteger *value = (UiInteger*)var->value; QButtonGroup *buttonGroup = (QButtonGroup*)value->obj; @@ -198,7 +198,7 @@ UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs args) { value->set = ui_radiobutton_set; } - UiEventWrapper *event = new UiEventWrapper(obj, args.onchange, args.onchangedata); + UiEventWrapper *event = new UiEventWrapper(obj, args->onchange, args->onchangedata); event->var = var; event->customdata1 = button; event->prepare_event = togglebutton_event; diff --git a/ui/qt/container.cpp b/ui/qt/container.cpp index bf5bf93..b4392ff 100644 --- a/ui/qt/container.cpp +++ b/ui/qt/container.cpp @@ -86,7 +86,7 @@ void UiBoxContainer::add(QWidget* widget, bool fill) { current = widget; } -UIWIDGET ui_box(UiObject *obj, UiContainerArgs args, QBoxLayout::Direction dir) { +UIWIDGET ui_box(UiObject *obj, UiContainerArgs *args, QBoxLayout::Direction dir) { UiContainerPrivate *ctn = (UiContainerPrivate*)ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); @@ -100,11 +100,11 @@ UIWIDGET ui_box(UiObject *obj, UiContainerArgs args, QBoxLayout::Direction dir) return widget; } -UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) { +UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) { return ui_box(obj, args, QBoxLayout::TopToBottom); } -UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) { +UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) { return ui_box(obj, args, QBoxLayout::LeftToRight); } @@ -233,7 +233,7 @@ void UiGridContainer::end() { } } -UIEXPORT UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) { +UIEXPORT UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { UiContainerPrivate *ctn = (UiContainerPrivate*)ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); @@ -244,13 +244,13 @@ UIEXPORT UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) { ui_container_add(obj, new UiGridContainer( grid, - args.margin, - args.columnspacing, - args.rowspacing, - args.def_hexpand, - args.def_vexpand, - args.def_hfill, - args.def_vfill)); + args->margin, + args->columnspacing, + args->rowspacing, + args->def_hexpand, + args->def_vexpand, + args->def_hfill, + args->def_vfill)); return widget; } diff --git a/ui/qt/container.h b/ui/qt/container.h index 16ced63..bb51908 100644 --- a/ui/qt/container.h +++ b/ui/qt/container.h @@ -41,14 +41,14 @@ #include #define UI_APPLY_LAYOUT(layout, args) \ - layout.fill = args.fill; \ - layout.hexpand = args.hexpand; \ - layout.vexpand = args.vexpand; \ - layout.hfill = args.hfill; \ - layout.vfill = args.vfill; \ - layout.override_defaults = args.override_defaults; \ - layout.colspan = args.colspan; \ - layout.rowspan = args.rowspan + layout.fill = args->fill; \ + layout.hexpand = args->hexpand; \ + layout.vexpand = args->vexpand; \ + layout.hfill = args->hfill; \ + layout.vfill = args->vfill; \ + layout.override_defaults = args->override_defaults; \ + layout.colspan = args->colspan; \ + layout.rowspan = args->rowspan #define ui_reset_layout(layout) memset(&(layout), 0, sizeof(UiLayout)) #define ui_lb2bool(b) ((b) == UI_LAYOUT_TRUE ? TRUE : FALSE) diff --git a/ui/qt/entry.cpp b/ui/qt/entry.cpp index 2dee2e7..69d7552 100644 --- a/ui/qt/entry.cpp +++ b/ui/qt/entry.cpp @@ -36,35 +36,35 @@ -UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs args) { +UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); bool use_double = false; UiVar *var = NULL; - if(args.varname) { - var = uic_get_var(obj->ctx, args.varname); + if(args->varname) { + var = uic_get_var(obj->ctx, args->varname); if(var->type == UI_VAR_DOUBLE) { use_double = true; } else if(var->type == UI_VAR_RANGE) { use_double = true; } else if(var->type != UI_VAR_INTEGER) { var = NULL; - fprintf(stderr, "UI Error: var '%s' has wrong type (must be int/double/range)\n", args.varname); + fprintf(stderr, "UI Error: var '%s' has wrong type (must be int/double/range)\n", args->varname); } } if(!var) { - if(args.intvalue) { - var = uic_widget_var(obj->ctx, obj->ctx, args.intvalue, NULL, UI_VAR_INTEGER); - } else if(args.doublevalue) { - var = uic_widget_var(obj->ctx, obj->ctx, args.doublevalue, NULL, UI_VAR_DOUBLE); + if(args->intvalue) { + var = uic_widget_var(obj->ctx, obj->ctx, args->intvalue, NULL, UI_VAR_INTEGER); + } else if(args->doublevalue) { + var = uic_widget_var(obj->ctx, obj->ctx, args->doublevalue, NULL, UI_VAR_DOUBLE); use_double = true; - } else if(args.rangevalue) { - var = uic_widget_var(obj->ctx, obj->ctx, args.rangevalue, NULL, UI_VAR_RANGE); + } else if(args->rangevalue) { + var = uic_widget_var(obj->ctx, obj->ctx, args->rangevalue, NULL, UI_VAR_RANGE); use_double = true; } else { - if(args.digits > 0) { + if(args->digits > 0) { use_double = true; } } @@ -73,15 +73,15 @@ UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs args) { QAbstractSpinBox *widget = nullptr; if(use_double) { QDoubleSpinBox *spinbox = new QDoubleSpinBox(); - spinbox->setDecimals(args.digits); - if(args.step != 0) { - spinbox->setSingleStep(args.step); + spinbox->setDecimals(args->digits); + if(args->step != 0) { + spinbox->setSingleStep(args->step); } widget = spinbox; } else { QSpinBox *spinbox = new QSpinBox(); - if(args.step != 0) { - spinbox->setSingleStep(args.step); + if(args->step != 0) { + spinbox->setSingleStep(args->step); } widget = spinbox; } diff --git a/ui/qt/label.cpp b/ui/qt/label.cpp index 49917d0..b813064 100644 --- a/ui/qt/label.cpp +++ b/ui/qt/label.cpp @@ -32,17 +32,17 @@ #include "ui/display.h" -UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs args) { +UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); - QString str = QString::fromUtf8(args.label); + QString str = QString::fromUtf8(args->label); QLabel *widget = new QLabel(str); Qt::AlignmentFlag align = Qt::AlignCenter; - if(args.align == UI_ALIGN_LEFT) { + if(args->align == UI_ALIGN_LEFT) { align = Qt::AlignLeft; - } else if(args.align == UI_ALIGN_RIGHT) { + } else if(args->align == UI_ALIGN_RIGHT) { align = Qt::AlignRight; } widget->setAlignment(align); @@ -52,12 +52,12 @@ UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs args) { return widget; } -UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs args) { - args.align = UI_ALIGN_LEFT; +UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs *args) { + args->align = UI_ALIGN_LEFT; return ui_label_create(obj, args); } -UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs args) { - args.align = UI_ALIGN_RIGHT; +UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs *args) { + args->align = UI_ALIGN_RIGHT; return ui_label_create(obj, args); } diff --git a/ui/qt/list.cpp b/ui/qt/list.cpp index 6ab288a..3b404cf 100644 --- a/ui/qt/list.cpp +++ b/ui/qt/list.cpp @@ -38,14 +38,14 @@ extern "C" void* ui_strmodel_getvalue(void *elm, int column) { } -UIWIDGET ui_listview_create(UiObject* obj, UiListArgs args) { +UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); QListView *view = new QListView(); - ui_getvaluefunc getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.list, args.varname, UI_VAR_LIST); + ui_getvaluefunc getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); ListModel *model = new ListModel(obj, view, var, getvalue); view->setModel(model); @@ -58,8 +58,8 @@ UIWIDGET ui_listview_create(UiObject* obj, UiListArgs args) { list->obj = model; } - model->setActivationCallback(args.onactivate, args.onactivatedata); - model->setSelectionCallback(args.onselection, args.onselectiondata); + model->setActivationCallback(args->onactivate, args->onactivatedata); + model->setSelectionCallback(args->onselection, args->onselectiondata); QItemSelectionModel *s = view->selectionModel(); QObject::connect( @@ -74,20 +74,20 @@ UIWIDGET ui_listview_create(UiObject* obj, UiListArgs args) { return view; } -UIWIDGET ui_table_create(UiObject* obj, UiListArgs args) { +UIWIDGET ui_table_create(UiObject* obj, UiListArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); QTreeView *view = new QTreeView(); view->setItemsExpandable(false); view->setRootIsDecorated(false); - if(args.multiselection) { + if(args->multiselection) { view->setSelectionMode(QAbstractItemView::ExtendedSelection); } - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); - TableModel *model = new TableModel(obj, view, var, args.model); + TableModel *model = new TableModel(obj, view, var, args->model); view->setModel(model); if(var) { @@ -98,8 +98,8 @@ UIWIDGET ui_table_create(UiObject* obj, UiListArgs args) { list->obj = model; } - model->setActivationCallback(args.onactivate, args.onactivatedata); - model->setSelectionCallback(args.onselection, args.onselectiondata); + model->setActivationCallback(args->onactivate, args->onactivatedata); + model->setSelectionCallback(args->onselection, args->onselectiondata); QItemSelectionModel *s = view->selectionModel(); QObject::connect( diff --git a/ui/qt/qt5.pro b/ui/qt/qt5.pro index a97ef1c..a465fac 100644 --- a/ui/qt/qt5.pro +++ b/ui/qt/qt5.pro @@ -33,6 +33,8 @@ DESTDIR = ../build/lib MOC_DIR = ../build/ui/qt OBJECTS_DIR = ../build/ui/qt +QMAKE_CXXFLAGS += -I../ucx + QT += core gui widgets DEFINES += UI_QT5 diff --git a/ui/qt/text.cpp b/ui/qt/text.cpp index fb3f656..5ef157c 100644 --- a/ui/qt/text.cpp +++ b/ui/qt/text.cpp @@ -57,7 +57,7 @@ static QTextDocument* get_or_create_doc(UiText *value) { return document; } -UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { +UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); @@ -66,7 +66,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { QTextDocument *document = nullptr; - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); if(var) { UiText *value = (UiText*)var->value; @@ -210,7 +210,7 @@ void ui_textarea_remove(UiText *text, int begin, int end) { /* ------------------------------ TextField ------------------------------ */ -static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs args, bool password, bool frameless) { +static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs *args, bool password, bool frameless) { UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); @@ -221,7 +221,7 @@ static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs args, bool passw textfield->setEchoMode(QLineEdit::Password); } - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_STRING); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); if(var) { UiString *value = (UiString*)var->value; if(value->value.ptr) { @@ -241,15 +241,15 @@ static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs args, bool passw return textfield; } -UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args) { +UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) { return create_textfield(obj, args, false, false); } -UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) { return create_textfield(obj, args, false, true); } -UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args) { +UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { return create_textfield(obj, args, true, false); } diff --git a/ui/qt/widget.cpp b/ui/qt/widget.cpp index 25fb84b..f275efd 100644 --- a/ui/qt/widget.cpp +++ b/ui/qt/widget.cpp @@ -31,7 +31,7 @@ #include "container.h" #include "../common/context.h" -UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs args) { +UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs *args) { UIWIDGET widget = create_widget(obj, args, userdata); UiContainerPrivate *ctn = ui_obj_container(obj); UI_APPLY_LAYOUT(ctn->layout, args); @@ -45,7 +45,7 @@ UIWIDGET ui_separator_create(UiObject *obj, UiWidgetArgs *args) { separator->setFrameShadow(QFrame::Sunken); UiContainerPrivate *ctn = ui_obj_container(obj); - UI_APPLY_LAYOUT(ctn->layout, (*args)); + UI_APPLY_LAYOUT(ctn->layout, args); ctn->add(separator, false); diff --git a/ui/ui/button.h b/ui/ui/button.h index 7123858..57144b9 100644 --- a/ui/ui/button.h +++ b/ui/ui/button.h @@ -82,17 +82,17 @@ typedef struct UiToggleArgs { const int* groups; } UiToggleArgs; -#define ui_button(obj, ...) ui_button_create(obj, (UiButtonArgs){ __VA_ARGS__ } ) -#define ui_togglebutton(obj, ...) ui_togglebutton_create(obj, (UiToggleArgs){ __VA_ARGS__ } ) -#define ui_checkbox(obj, ...) ui_checkbox_create(obj, (UiToggleArgs){ __VA_ARGS__ } ) -#define ui_switch(obj, ...) ui_switch_create(obj, (UiToggleArgs){ __VA_ARGS__ } ) -#define ui_radiobutton(obj, ...) ui_radiobutton_create(obj, (UiToggleArgs){ __VA_ARGS__ } ) +#define ui_button(obj, ...) ui_button_create(obj, &(UiButtonArgs){ __VA_ARGS__ } ) +#define ui_togglebutton(obj, ...) ui_togglebutton_create(obj, &(UiToggleArgs){ __VA_ARGS__ } ) +#define ui_checkbox(obj, ...) ui_checkbox_create(obj, &(UiToggleArgs){ __VA_ARGS__ } ) +#define ui_switch(obj, ...) ui_switch_create(obj, &(UiToggleArgs){ __VA_ARGS__ } ) +#define ui_radiobutton(obj, ...) ui_radiobutton_create(obj, &(UiToggleArgs){ __VA_ARGS__ } ) -UIEXPORT UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args); -UIEXPORT UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args); -UIEXPORT UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args); -UIEXPORT UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args); -UIEXPORT UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args); +UIEXPORT UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args); +UIEXPORT UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args); +UIEXPORT UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args); +UIEXPORT UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args); +UIEXPORT UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args); diff --git a/ui/ui/container.h b/ui/ui/container.h index 3f828ea..51c15bd 100644 --- a/ui/ui/container.h +++ b/ui/ui/container.h @@ -116,6 +116,8 @@ typedef struct UiTabViewArgs { const char *style_class; UiTabViewType tabview; + ui_callback onchange; + void *onchangedata; UiSubContainerType subcontainer; @@ -235,39 +237,39 @@ struct UiContainerX { #define UI_CTN(obj, ctn) for(ctn;ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_vbox(obj, ...) for(ui_vbox_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_hbox(obj, ...) for(ui_hbox_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_grid(obj, ...) for(ui_grid_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_frame(obj, ...) for(ui_frame_create(obj, (UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_expander(obj, ...) for(ui_expander_create(obj, (UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_scrolledwindow(obj, ...) for(ui_scrolledwindow_create(obj, (UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_tabview(obj, ...) for(ui_tabview_create(obj, (UiTabViewArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_headerbar(obj, ...) for(ui_headerbar_create(obj, (UiHeaderbarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_sidebar(obj, ...) for(ui_sidebar_create(obj, (UiSidebarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) - -#define ui_vbox0(obj) for(ui_vbox_create(obj, (UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_hbox0(obj) for(ui_hbox_create(obj, (UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_grid0(obj) for(ui_grid_create(obj, (UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_frame0(obj) for(ui_frame_create(obj, (UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_expander0(obj) for(ui_expande_create(obj, (UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_scrolledwindow0(obj) for(ui_scrolledwindow_create(obj, (UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_tabview0(obj) for(ui_tabview_create(obj, (UiTabViewArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_headerbar0(obj) for(ui_headerbar_create(obj, (UiHeaderbarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_sidebar0(obj) for(ui_sidebar_create(obj, (UiSidebarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) - -#define ui_vbox_w(obj, w, ...) for(w = ui_vbox_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_hbox_w(obj, w, ...) for(w = ui_hbox_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_grid_w(obj, w, ...) for(w = ui_grid_create(obj, (UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_tabview_w(obj, w, ...) for(w = ui_tabview_create(obj, (UiTabViewArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_scrolledwindow_w(obj, w, ...) for(w = ui_scrolledwindow_create(obj, (UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) - -#define ui_hsplitpane(obj, ...) for(ui_hsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_vsplitpane(obj, ...) for(ui_vsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_hsplitpane0(obj) for(ui_hsplitpane_create(obj, (UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_vsplitpane0(obj) for(ui_vsplitpane_create(obj, (UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) - -#define ui_hsplitpane_w(obj, w, ...) for(w = ui_hsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_vsplitpane_w(obj, w, ...) for(w = ui_vsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_vbox(obj, ...) for(ui_vbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_hbox(obj, ...) for(ui_hbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_grid(obj, ...) for(ui_grid_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_frame(obj, ...) for(ui_frame_create(obj, &(UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_expander(obj, ...) for(ui_expander_create(obj, &(UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_scrolledwindow(obj, ...) for(ui_scrolledwindow_create(obj, &(UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_tabview(obj, ...) for(ui_tabview_create(obj, &(UiTabViewArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_headerbar(obj, ...) for(ui_headerbar_create(obj, &(UiHeaderbarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_sidebar(obj, ...) for(ui_sidebar_create(obj, &(UiSidebarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) + +#define ui_vbox0(obj) for(ui_vbox_create(obj, &(UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_hbox0(obj) for(ui_hbox_create(obj, &(UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_grid0(obj) for(ui_grid_create(obj, &(UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_frame0(obj) for(ui_frame_create(obj, &(UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_expander0(obj) for(ui_expande_create(obj, &(UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_scrolledwindow0(obj) for(ui_scrolledwindow_create(obj, &(UiFrameArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_tabview0(obj) for(ui_tabview_create(obj, &(UiTabViewArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_headerbar0(obj) for(ui_headerbar_create(obj, &(UiHeaderbarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_sidebar0(obj) for(ui_sidebar_create(obj, &(UiSidebarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) + +#define ui_vbox_w(obj, w, ...) for(w = ui_vbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_hbox_w(obj, w, ...) for(w = ui_hbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_grid_w(obj, w, ...) for(w = ui_grid_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_tabview_w(obj, w, ...) for(w = ui_tabview_create(obj, &(UiTabViewArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_scrolledwindow_w(obj, w, ...) for(w = ui_scrolledwindow_create(obj, &(UiFrameArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) + +#define ui_hsplitpane(obj, ...) for(ui_hsplitpane_create(obj, &(UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_vsplitpane(obj, ...) for(ui_vsplitpane_create(obj, &(UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_hsplitpane0(obj) for(ui_hsplitpane_create(obj, &(UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_vsplitpane0(obj) for(ui_vsplitpane_create(obj, &(UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) + +#define ui_hsplitpane_w(obj, w, ...) for(w = ui_hsplitpane_create(obj, &(UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_vsplitpane_w(obj, w, ...) for(w = ui_vsplitpane_create(obj, &(UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) #define ui_tab(obj, label) for(ui_tab_create(obj, label);ui_container_finish(obj);ui_container_begin_close(obj)) @@ -275,35 +277,35 @@ struct UiContainerX { #define ui_headerbar_center(obj) for(ui_headerbar_center_create(obj);ui_container_finish(obj);ui_container_begin_close(obj)) #define ui_headerbar_end(obj) for(ui_headerbar_end_create(obj);ui_container_finish(obj);ui_container_begin_close(obj)) -#define ui_itemlist(obj, ...) ui_itemlist_create(obj, (UiItemListContainerArgs) { __VA_ARGS__} ) +#define ui_itemlist(obj, ...) ui_itemlist_create(obj, &(UiItemListContainerArgs) { __VA_ARGS__} ) UIEXPORT void ui_end(UiObject *obj); // deprecated UIEXPORT void ui_end_new(UiObject *obj); // TODO: rename to ui_end -UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args); -UIEXPORT UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args); -UIEXPORT UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args); -UIEXPORT UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs args); -UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs args); -UIEXPORT UIWIDGET ui_scrolledwindow_create(UiObject *obj, UiFrameArgs args); - -UIEXPORT UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs args); +UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args); +UIEXPORT UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args); +UIEXPORT UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args); +UIEXPORT UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args); +UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs *args); +UIEXPORT UIWIDGET ui_scrolledwindow_create(UiObject *obj, UiFrameArgs *args); + +UIEXPORT UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs *args); UIEXPORT void ui_tab_create(UiObject *obj, const char* title); UIEXPORT void ui_tabview_select(UIWIDGET tabview, int tab); UIEXPORT void ui_tabview_remove(UIWIDGET tabview, int tab); UIEXPORT UiObject* ui_tabview_add(UIWIDGET tabview, const char *name, int tab_index); -UIEXPORT UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs args); +UIEXPORT UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs *args); UIEXPORT void ui_headerbar_start_create(UiObject *obj); UIEXPORT void ui_headerbar_center_create(UiObject *obj); UIEXPORT void ui_headerbar_end_create(UiObject *obj); -UIEXPORT UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs args); +UIEXPORT UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs *args); -UIEXPORT UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs args); +UIEXPORT UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs *args); -UIEXPORT UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs args); -UIEXPORT UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs args); +UIEXPORT UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs *args); +UIEXPORT UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs *args); UIEXPORT void ui_splitpane_set_visible(UIWIDGET splitpane, int child_index, UiBool visible); @@ -342,6 +344,17 @@ UIEXPORT int ui_container_finish(UiObject *obj); if(args.rowspan > 0) ui_layout_rowspan(obj, args.rowspan); \ /*force caller to add ';'*/(void)0 +#define UI_APPLY_LAYOUT2(obj, args) \ + if(args->fill != UI_DEFAULT) ui_layout_fill(obj, args->fill == UI_ON ? 1 : 0 ); \ + if(args->hexpand) ui_layout_hexpand(obj, 1); \ + if(args->vexpand) ui_layout_vexpand(obj, 1); \ + if(args->hfill) ui_layout_hfill(obj, 1); \ + if(args->vfill) ui_layout_vfill(obj, 1); \ + if(args->override_defaults) ui_layout_override_defaults(obj, 1); \ + if(args->colspan > 0) ui_layout_colspan(obj, args->colspan); \ + if(args->rowspan > 0) ui_layout_rowspan(obj, args->rowspan); \ + /*force caller to add ';'*/(void)0 + #ifdef __cplusplus } diff --git a/ui/ui/display.h b/ui/ui/display.h index 8ed861b..6e2b579 100644 --- a/ui/ui/display.h +++ b/ui/ui/display.h @@ -113,24 +113,24 @@ typedef struct UiProgressbarSpinnerArgs { /* label widgets */ -#define ui_label(obj, ...) ui_label_create(obj, (UiLabelArgs) { __VA_ARGS__ }) -#define ui_llabel(obj, ...) ui_llabel_create(obj, (UiLabelArgs) { __VA_ARGS__ }) -#define ui_rlabel(obj, ...) ui_rlabel_create(obj, (UiLabelArgs) { __VA_ARGS__ }) +#define ui_label(obj, ...) ui_label_create(obj, &(UiLabelArgs) { __VA_ARGS__ }) +#define ui_llabel(obj, ...) ui_llabel_create(obj, &(UiLabelArgs) { __VA_ARGS__ }) +#define ui_rlabel(obj, ...) ui_rlabel_create(obj, &(UiLabelArgs) { __VA_ARGS__ }) -UIEXPORT UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs args); -UIEXPORT UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs args); -UIEXPORT UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs args); +UIEXPORT UIWIDGET ui_label_create(UiObject* obj, UiLabelArgs *args); +UIEXPORT UIWIDGET ui_llabel_create(UiObject* obj, UiLabelArgs *args); +UIEXPORT UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs *args); UIWIDGET ui_space_deprecated(UiObject *obj); /* progress bar/spinner */ -#define ui_progressbar(obj, ...) ui_progressbar_create(obj, (UiProgressbarArgs) { __VA_ARGS__ } ) -#define ui_progressspinner(obj, ...) ui_progressspinner_create(obj, (UiProgressbarSpinnerArgs) { __VA_ARGS__ } ) +#define ui_progressbar(obj, ...) ui_progressbar_create(obj, &(UiProgressbarArgs) { __VA_ARGS__ } ) +#define ui_progressspinner(obj, ...) ui_progressspinner_create(obj, &(UiProgressbarSpinnerArgs) { __VA_ARGS__ } ) -UIEXPORT UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args); -UIEXPORT UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs args); +UIEXPORT UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args); +UIEXPORT UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args); #ifdef __cplusplus diff --git a/ui/ui/entry.h b/ui/ui/entry.h index 5c8990a..3e0a99f 100644 --- a/ui/ui/entry.h +++ b/ui/ui/entry.h @@ -62,9 +62,9 @@ typedef struct UiSpinnerArgs { -UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs args); +UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs *args); -#define ui_spinner(obj, ...) ui_spinner_create(obj, (UiSpinnerArgs){ __VA_ARGS__ } ) +#define ui_spinner(obj, ...) ui_spinner_create(obj, &(UiSpinnerArgs){ __VA_ARGS__ } ) void ui_spinner_setrange(UIWIDGET spinner, double min, double max); void ui_spinner_setdigits(UIWIDGET spinner, int digits); diff --git a/ui/ui/image.h b/ui/ui/image.h index 7217caa..49e57ab 100644 --- a/ui/ui/image.h +++ b/ui/ui/image.h @@ -75,9 +75,9 @@ typedef struct UiImageViewerArgs { void *onbuttonreleasedata; } UiImageViewerArgs; -#define ui_imageviewer(obj, ...) ui_imageviewer_create(obj, (UiImageViewerArgs){ __VA_ARGS__ } ) +#define ui_imageviewer(obj, ...) ui_imageviewer_create(obj, &(UiImageViewerArgs){ __VA_ARGS__ } ) -UIEXPORT UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args); +UIEXPORT UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs *args); UIEXPORT UIWIDGET ui_imageviewer_reset(UIWIDGET w); UIEXPORT UIWIDGET ui_imageviewer_set_autoscale(UIWIDGET w, UiBool set); diff --git a/ui/ui/menu.h b/ui/ui/menu.h index 2e7b6b1..3f805b8 100644 --- a/ui/ui/menu.h +++ b/ui/ui/menu.h @@ -69,23 +69,23 @@ typedef struct UiMenuItemListArgs { #define ui_menu(label) for(ui_menu_create(label);ui_menu_is_open();ui_menu_close()) -#define ui_menuitem(...) ui_menuitem_create((UiMenuItemArgs){ __VA_ARGS__ }) -#define ui_menu_toggleitem(...) ui_menu_toggleitem_create((UiMenuToggleItemArgs){ __VA_ARGS__ }) -#define ui_menu_radioitem(...) ui_menu_radioitem_create((UiMenuToggleItemArgs){ __VA_ARGS__ }) -#define ui_menu_itemlist(...) ui_menu_itemlist_create((UiMenuItemListArgs) { __VA_ARGS__ } ) -#define ui_menu_togglelist(...) ui_menu_itemlist_create((UiMenuItemListArgs) { __VA_ARGS} ) -#define ui_menu_radiolist(...) ui_menu_itemlist_create((UiMenuItemListArgs) { __VA_ARGS} ) +#define ui_menuitem(...) ui_menuitem_create(&(UiMenuItemArgs){ __VA_ARGS__ }) +#define ui_menu_toggleitem(...) ui_menu_toggleitem_create(&(UiMenuToggleItemArgs){ __VA_ARGS__ }) +#define ui_menu_radioitem(...) ui_menu_radioitem_create(&(UiMenuToggleItemArgs){ __VA_ARGS__ }) +#define ui_menu_itemlist(...) ui_menu_itemlist_create(&(UiMenuItemListArgs) { __VA_ARGS__ } ) +#define ui_menu_togglelist(...) ui_menu_itemlist_create(&(UiMenuItemListArgs) { __VA_ARGS} ) +#define ui_menu_radiolist(...) ui_menu_itemlist_create(&(UiMenuItemListArgs) { __VA_ARGS} ) UIEXPORT void ui_menu_create(const char* label); -UIEXPORT void ui_menuitem_create(UiMenuItemArgs args); -UIEXPORT void ui_menu_toggleitem_create(UiMenuToggleItemArgs args); -UIEXPORT void ui_menu_radioitem_create(UiMenuToggleItemArgs args); +UIEXPORT void ui_menuitem_create(UiMenuItemArgs *args); +UIEXPORT void ui_menu_toggleitem_create(UiMenuToggleItemArgs *args); +UIEXPORT void ui_menu_radioitem_create(UiMenuToggleItemArgs *args); UIEXPORT void ui_menuseparator(); -UIEXPORT void ui_menu_itemlist_create(UiMenuItemListArgs args); -UIEXPORT void ui_menu_toggleitemlist_create(UiMenuItemListArgs args); -UIEXPORT void ui_menu_radioitemlist_create(UiMenuItemListArgs args); +UIEXPORT void ui_menu_itemlist_create(UiMenuItemListArgs *args); +UIEXPORT void ui_menu_toggleitemlist_create(UiMenuItemListArgs *args); +UIEXPORT void ui_menu_radioitemlist_create(UiMenuItemListArgs *args); UIEXPORT void ui_menu_end(void); // TODO: private diff --git a/ui/ui/text.h b/ui/ui/text.h index 5c40df5..2200235 100644 --- a/ui/ui/text.h +++ b/ui/ui/text.h @@ -119,25 +119,25 @@ typedef struct UiPathTextFieldArgs { void *ondropsdata; } UiPathTextFieldArgs; -#define ui_textarea(obj, ...) ui_textarea_create(obj, (UiTextAreaArgs) { __VA_ARGS__ }) +#define ui_textarea(obj, ...) ui_textarea_create(obj, &(UiTextAreaArgs) { __VA_ARGS__ }) -UIEXPORT UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args); +UIEXPORT UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args); UIEXPORT UIWIDGET ui_textarea_gettextwidget(UIWIDGET textarea); UIEXPORT void ui_text_undo(UiText *value); UIEXPORT void ui_text_redo(UiText *value); -#define ui_textfield(obj, ...) ui_textfield_create(obj, (UiTextFieldArgs) { __VA_ARGS__ }) -#define ui_frameless_textfield(obj, ...) ui_frameless_field_create(obj, (UiTextFieldArgs) { __VA_ARGS__ }) -#define ui_passwordfield(obj, ...) ui_passwordfield_create(obj, (UiTextFieldArgs) { __VA_ARGS__ }) -#define ui_path_textfield(obj, ...) ui_path_textfield_create(obj, (UiPathTextFieldArgs) { __VA_ARGS__ } ) +#define ui_textfield(obj, ...) ui_textfield_create(obj, &(UiTextFieldArgs) { __VA_ARGS__ }) +#define ui_frameless_textfield(obj, ...) ui_frameless_field_create(obj, &(UiTextFieldArgs) { __VA_ARGS__ }) +#define ui_passwordfield(obj, ...) ui_passwordfield_create(obj, &(UiTextFieldArgs) { __VA_ARGS__ }) +#define ui_path_textfield(obj, ...) ui_path_textfield_create(obj, &(UiPathTextFieldArgs) { __VA_ARGS__ } ) -UIEXPORT UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args); -UIEXPORT UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args); -UIEXPORT UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args); +UIEXPORT UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args); +UIEXPORT UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args); +UIEXPORT UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args); -UIEXPORT UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args); +UIEXPORT UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args); #ifdef __cplusplus } diff --git a/ui/ui/toolbar.h b/ui/ui/toolbar.h index 0509321..4b42af2 100644 --- a/ui/ui/toolbar.h +++ b/ui/ui/toolbar.h @@ -71,16 +71,16 @@ enum UiToolbarPos { UI_TOOLBAR_RIGHT }; -#define ui_toolbar_item(name, ...) ui_toolbar_item_create(name, (UiToolbarItemArgs){ __VA_ARGS__ } ) -#define ui_toolbar_toggleitem(name, ...) ui_toolbar_toggleitem_create(name, (UiToolbarToggleItemArgs){ __VA_ARGS__ } ) +#define ui_toolbar_item(name, ...) ui_toolbar_item_create(name, &(UiToolbarItemArgs){ __VA_ARGS__ } ) +#define ui_toolbar_toggleitem(name, ...) ui_toolbar_toggleitem_create(name, &(UiToolbarToggleItemArgs){ __VA_ARGS__ } ) -#define ui_toolbar_menu(name, ...) for(ui_toolbar_menu_create(name, (UiToolbarMenuArgs){ __VA_ARGS__ });ui_menu_is_open();ui_menu_close()) -#define ui_toolbar_appmenu() for(ui_toolbar_menu_create(NULL, (UiToolbarMenuArgs){ 0 });ui_menu_is_open();ui_menu_close()) +#define ui_toolbar_menu(name, ...) for(ui_toolbar_menu_create(name, &(UiToolbarMenuArgs){ __VA_ARGS__ });ui_menu_is_open();ui_menu_close()) +#define ui_toolbar_appmenu() for(ui_toolbar_menu_create(NULL, &(UiToolbarMenuArgs){ 0 });ui_menu_is_open();ui_menu_close()) -UIEXPORT void ui_toolbar_item_create(const char* name, UiToolbarItemArgs args); -UIEXPORT void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs args); -UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs args); +UIEXPORT void ui_toolbar_item_create(const char* name, UiToolbarItemArgs *args); +UIEXPORT void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs *args); +UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs *args); UIEXPORT void ui_toolbar_add_default(const char *name, enum UiToolbarPos pos); diff --git a/ui/ui/toolkit.h b/ui/ui/toolkit.h index 2af07c5..39d4c73 100644 --- a/ui/ui/toolkit.h +++ b/ui/ui/toolkit.h @@ -558,6 +558,8 @@ UIEXPORT void ui_string_set(UiString *s, const char *value); UIEXPORT char* ui_string_get(UiString *s); UIEXPORT void ui_text_set(UiText *s, const char* value); UIEXPORT char* ui_text_get(UiText *s); +UIEXPORT void ui_generic_set_image(UiGeneric *g, void *img); +UIEXPORT void* ui_generic_get_image(UiGeneric *g); UIEXPORT void ui_var_set_int(UiContext *ctx, const char *name, int64_t value); UIEXPORT int64_t ui_var_get_int(UiContext *ctx, const char *name); diff --git a/ui/ui/tree.h b/ui/ui/tree.h index 8217cf6..5f4b157 100644 --- a/ui/ui/tree.h +++ b/ui/ui/tree.h @@ -240,21 +240,21 @@ UIEXPORT UiModel* ui_model(UiContext *ctx, ...); UIEXPORT UiModel* ui_model_copy(UiContext *ctx, UiModel* model); UIEXPORT void ui_model_free(UiContext *ctx, UiModel *mi); -#define ui_listview(obj, ...) ui_listview_create(obj, (UiListArgs) { __VA_ARGS__ } ) -#define ui_table(obj, ...) ui_table_create(obj, (UiListArgs) { __VA_ARGS__ } ) -#define ui_combobox(obj, ...) ui_combobox_create(obj, (UiListArgs) { __VA_ARGS__ } ) -#define ui_breadcrumbbar(obj, ...) ui_breadcrumbbar_create(obj, (UiListArgs) { __VA_ARGS__ } ) -#define ui_sourcelist(obj, ...) ui_sourcelist_create(obj, (UiSourceListArgs) { __VA_ARGS__ } ) +#define ui_listview(obj, ...) ui_listview_create(obj, &(UiListArgs) { __VA_ARGS__ } ) +#define ui_table(obj, ...) ui_table_create(obj, &(UiListArgs) { __VA_ARGS__ } ) +#define ui_combobox(obj, ...) ui_combobox_create(obj, &(UiListArgs) { __VA_ARGS__ } ) +#define ui_breadcrumbbar(obj, ...) ui_breadcrumbbar_create(obj, &(UiListArgs) { __VA_ARGS__ } ) +#define ui_sourcelist(obj, ...) ui_sourcelist_create(obj, &(UiSourceListArgs) { __VA_ARGS__ } ) -UIEXPORT UIWIDGET ui_listview_create(UiObject* obj, UiListArgs args); -UIEXPORT UIWIDGET ui_table_create(UiObject* obj, UiListArgs args); -UIEXPORT UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs args); -UIEXPORT UIWIDGET ui_breadcrumbbar_create(UiObject* obj, UiListArgs args); +UIEXPORT UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args); +UIEXPORT UIWIDGET ui_table_create(UiObject* obj, UiListArgs *args); +UIEXPORT UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs *args); +UIEXPORT UIWIDGET ui_breadcrumbbar_create(UiObject* obj, UiListArgs *args); UIEXPORT void ui_listview_select(UIWIDGET listview, int index); UIEXPORT void ui_combobox_select(UIWIDGET dropdown, int index); -UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args); +UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args); #ifdef __cplusplus diff --git a/ui/ui/webview.h b/ui/ui/webview.h index 98be28c..36f77f9 100644 --- a/ui/ui/webview.h +++ b/ui/ui/webview.h @@ -56,9 +56,9 @@ typedef struct UiWebviewArgs { const int* groups; } UiWebviewArgs; -#define ui_webview(obj, ...) ui_webview_create(obj, (UiWebviewArgs){ __VA_ARGS__ } ) +#define ui_webview(obj, ...) ui_webview_create(obj, &(UiWebviewArgs){ __VA_ARGS__ } ) -UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs args); +UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs *args); void ui_webview_load_url(UiGeneric *g, const char *url); diff --git a/ui/ui/widget.h b/ui/ui/widget.h index e08233d..7e96ab6 100644 --- a/ui/ui/widget.h +++ b/ui/ui/widget.h @@ -48,21 +48,21 @@ typedef struct UiWidgetArgs { } UiWidgetArgs; #ifdef UI_GTK -typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata); +typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata); #elif defined(UI_QT) -typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata); +typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata); #elif defined(UI_MOTIF) -typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata, Widget parent, Arg *a, int n); +typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata, Widget parent, Arg *a, int n); #elif defined(UI_COCOA) -typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata); +typedef UIWIDGET (*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata); #elif defined(UI_WINUI) -typedef UIWIDGET(*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata); +typedef UIWIDGET(*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata); #elif defined(UI_WIN32) -typedef UIWIDGET(*ui_createwidget_func)(UiObject *obj, UiWidgetArgs args, void *userdata); +typedef UIWIDGET(*ui_createwidget_func)(UiObject *obj, UiWidgetArgs *args, void *userdata); #endif -UIEXPORT UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs args); +UIEXPORT UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs *args); -#define ui_customwidget(obj, create_widget, userdata, ...) ui_customwidget_create(obj, create_widget, userdata, (UiWidgetArgs) { __VA_ARGS__ }) +#define ui_customwidget(obj, create_widget, userdata, ...) ui_customwidget_create(obj, create_widget, userdata, &(UiWidgetArgs) { __VA_ARGS__ }) UIEXPORT UIWIDGET ui_separator_create(UiObject *obj, UiWidgetArgs *args); -- 2.43.5