From 3cddacbcd33017ba5060d6a30a2f965e071c50c1 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Sun, 1 Mar 2026 10:37:14 +0100 Subject: [PATCH] update toolkit --- ui/common/args.c | 112 ++++++++++++++++++++++++++++++++++++++++- ui/common/args.h | 16 ++++++ ui/common/context.c | 10 ++++ ui/common/context.h | 6 +++ ui/common/object.c | 6 +++ ui/common/objs.mk | 1 + ui/common/properties.c | 32 +++++++++--- ui/common/threadpool.c | 78 ++++++++++++++++++++++++++++ ui/common/threadpool.h | 4 ++ ui/common/types.c | 50 +++++++++++++++--- ui/gtk/button.c | 6 +++ ui/gtk/container.c | 15 ++++++ ui/gtk/display.c | 6 +++ ui/gtk/list.c | 14 +++++- ui/gtk/text.c | 88 +++++++++++++++++++++++++++++++- ui/gtk/text.h | 5 +- ui/gtk/toolkit.c | 47 ++++++++++++++--- ui/gtk/toolkit.h | 10 ++++ ui/gtk/window.c | 36 ++++++++++++- ui/ui/button.h | 3 ++ ui/ui/container.h | 8 +++ ui/ui/display.h | 6 +++ ui/ui/entry.h | 1 + ui/ui/list.h | 4 ++ ui/ui/menu.h | 29 +++++++---- ui/ui/text.h | 15 ++++++ ui/ui/toolbar.h | 8 ++- ui/ui/toolkit.h | 26 ++++++++-- ui/ui/webview.h | 1 + 29 files changed, 598 insertions(+), 45 deletions(-) diff --git a/ui/common/args.c b/ui/common/args.c index 0ec8a4e..821b221 100644 --- a/ui/common/args.c +++ b/ui/common/args.c @@ -519,10 +519,17 @@ void ui_container_args_set_rowspacing(UiContainerArgs *args, int value) { args->rowspacing = value; } +void ui_container_args_set_visibility_states(UiContainerArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_container_args_free(UiContainerArgs *args) { free((void*)args->name); free((void*)args->style_class); + free((void*)args->visibility_states); free(args); } @@ -637,10 +644,17 @@ void ui_frame_args_set_label(UiFrameArgs *args, const char *label) { args->label = strdup(label); } +void ui_frame_args_set_visibility_states(UiFrameArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_frame_args_free(UiFrameArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->label); + free((void*)args->visibility_states); free(args); } @@ -797,11 +811,18 @@ void ui_splitpane_args_set_max_panes(UiSplitPaneArgs *args, int max) { args->max_panes = max; } +void ui_splitpane_args_set_visibility_states(UiSplitPaneArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_splitpane_args_free(UiSplitPaneArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->varname); free((void*)args->position_property); + free((void*)args->visibility_states); free(args); } @@ -915,10 +936,17 @@ void ui_tabview_args_set_subcontainer(UiTabViewArgs *args, UiSubContainerType su args->subcontainer = subcontainer; } +void ui_tabview_args_set_visibility_states(UiTabViewArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_tabview_args_free(UiTabViewArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->varname); + free((void*)args->visibility_states); free(args); } @@ -1097,11 +1125,18 @@ void ui_label_args_set_value(UiLabelArgs *args, UiString *value) { args->value = value; } +void ui_label_args_set_visibility_states(UiLabelArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_label_args_free(UiLabelArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->label); free((void*)args->varname); + free((void*)args->visibility_states); free(args); } @@ -1200,10 +1235,17 @@ void ui_progressbar_args_set_value(UiProgressbarArgs *args, UiDouble *value) { args->value = value; } +void ui_progressbar_args_set_visibility_states(UiProgressbarArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_progressbar_args_free(UiProgressbarArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->varname); + free((void*)args->visibility_states); free(args); } @@ -1284,10 +1326,17 @@ void ui_progress_spinner_args_set_value(UiProgressbarSpinnerArgs *args, UiIntege args->value = value; } +void ui_progress_spinner_args_set_visibility_states(UiProgressbarSpinnerArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_progress_spinner_args_free(UiProgressbarSpinnerArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->varname); + free((void*)args->visibility_states); free(args); } @@ -1397,6 +1446,12 @@ void ui_button_args_set_states(UiButtonArgs *args, int *states, int numstates) { ((int*)args->states)[numstates] = -1; } +void ui_button_args_set_visibility_states(UiButtonArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_button_args_free(UiButtonArgs *args) { free((void*)args->name); free((void*)args->style_class); @@ -1404,6 +1459,7 @@ void ui_button_args_free(UiButtonArgs *args) { free((void*)args->icon); free((void*)args->tooltip); free((void*)args->states); + free((void*)args->visibility_states); free(args); } @@ -1520,6 +1576,12 @@ void ui_toggle_args_set_states(UiToggleArgs *args, int *states, int numstates) { ((int*)args->states)[numstates] = -1; } +void ui_toggle_args_set_visibility_states(UiToggleArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_toggle_args_free(UiToggleArgs *args) { free((void*)args->name); free((void*)args->style_class); @@ -1528,6 +1590,7 @@ void ui_toggle_args_free(UiToggleArgs *args) { free((void*)args->tooltip); free((void*)args->varname); free((void*)args->states); + free((void*)args->visibility_states); free(args); } @@ -1647,6 +1710,12 @@ void ui_linkbutton_args_set_states(UiLinkButtonArgs *args, int *states, int nums ((int*)args->states)[numstates] = -1; } +void ui_linkbutton_args_set_visibility_states(UiLinkButtonArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_linkbutton_args_free(UiLinkButtonArgs *args) { free((void*)args->name); free((void*)args->style_class); @@ -1829,6 +1898,12 @@ void ui_list_args_set_states(UiListArgs *args, int *states, int numstates) { ((int*)args->states)[numstates] = -1; } +void ui_list_args_set_visibility_states(UiListArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_list_args_free(UiListArgs *args) { free((void*)args->name); free((void*)args->style_class); @@ -1840,6 +1915,7 @@ void ui_list_args_free(UiListArgs *args) { free(args->static_elements); } free((void*)args->states); + free((void*)args->visibility_states); free(args); } @@ -1961,7 +2037,6 @@ void ui_sourcelist_args_set_onbuttonclick(UiSourceListArgs *args, ui_callback ca } - void ui_sourcelist_args_set_onbuttonclickdata(UiSourceListArgs *args, void *userdata) { args->onbuttonclickdata = userdata; } @@ -1974,12 +2049,19 @@ void ui_sourcelist_args_set_header_is_item(UiSourceListArgs *args, UiBool value) args->header_is_item = value; } +void ui_sourcelist_args_set_visibility_states(UiSourceListArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_sourcelist_args_free(UiSourceListArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->varname); free((void*)args->sublists); free((void*)args->states); + free((void*)args->visibility_states); free(args); } @@ -2085,11 +2167,18 @@ void ui_textarea_args_set_states(UiTextAreaArgs *args, int *states, int numstate ((int*)args->states)[numstates] = -1; } +void ui_textarea_args_set_visibility_states(UiTextAreaArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_textarea_args_free(UiTextAreaArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->varname); free((void*)args->states); + free((void*)args->visibility_states); free(args); } @@ -2205,11 +2294,18 @@ void ui_textfield_args_set_states(UiTextFieldArgs *args, int *states, int numsta ((int*)args->states)[numstates] = -1; } +void ui_textfield_args_set_visibility_states(UiTextFieldArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_textfield_args_free(UiTextFieldArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->varname); free((void*)args->states); + free((void*)args->visibility_states); free(args); } @@ -2328,11 +2424,18 @@ void ui_spinbox_args_set_states(UiSpinBoxArgs *args, int *states, int numstates) ((int*)args->states)[numstates] = -1; } +void ui_spinbox_args_set_visibility_states(UiSpinBoxArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_spinbox_args_free(UiSpinBoxArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->varname); free((void*)args->states); + free((void*)args->visibility_states); free(args); } @@ -2428,11 +2531,18 @@ void ui_webview_args_set_states(UiWebviewArgs *args, int *states, int numstates) ((int*)args->states)[numstates] = -1; } +void ui_webview_args_set_visibility_states(UiWebviewArgs *args, int *states, int numstates) { + args->visibility_states = calloc(numstates+1, sizeof(int)); + memcpy((void*)args->visibility_states, states, numstates * sizeof(int)); + ((int*)args->visibility_states)[numstates] = -1; +} + void ui_webview_args_free(UiWebviewArgs *args) { free((void*)args->name); free((void*)args->style_class); free((void*)args->varname); free((void*)args->states); + free((void*)args->visibility_states); free(args); } diff --git a/ui/common/args.h b/ui/common/args.h index 12c0160..2c5abeb 100644 --- a/ui/common/args.h +++ b/ui/common/args.h @@ -149,6 +149,7 @@ UIEXPORT void ui_container_args_set_style_class(UiContainerArgs *args, const cha 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_set_visibility_states(UiContainerArgs *args, int *states, int numstates); UIEXPORT void ui_container_args_free(UiContainerArgs *args); UIEXPORT UiFrameArgs* ui_frame_args_new(void); @@ -174,6 +175,7 @@ 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_set_visibility_states(UiFrameArgs *args, int *states, int numstates); UIEXPORT void ui_frame_args_free(UiFrameArgs *args); UIEXPORT UiSidebarArgs* ui_sidebar_args_new(void); @@ -211,6 +213,7 @@ UIEXPORT void ui_splitpane_args_set_position_property(UiSplitPaneArgs *args, con UIEXPORT void ui_splitpane_args_set_varname(UiSplitPaneArgs *args, const char *varname); UIEXPORT void ui_splitpane_args_set_value(UiSplitPaneArgs *args, UiInteger *value); UIEXPORT void ui_splitpane_args_set_max_panes(UiSplitPaneArgs *args, int max); +UIEXPORT void ui_splitpane_args_set_visibility_states(UiSplitPaneArgs *args, int *states, int numstates); UIEXPORT void ui_splitpane_args_free(UiSplitPaneArgs *args); UIEXPORT UiTabViewArgs* ui_tabview_args_new(void); @@ -239,6 +242,7 @@ UIEXPORT void ui_tabview_args_set_onchangedata(UiTabViewArgs *args, void *userda UIEXPORT void ui_tabview_args_set_varname(UiTabViewArgs *args, const char *varname); UIEXPORT void ui_tabview_args_set_value(UiTabViewArgs *args, UiInteger *value); UIEXPORT void ui_tabview_args_set_subcontainer(UiTabViewArgs *args, UiSubContainerType subcontainer); +UIEXPORT void ui_tabview_args_set_visibility_states(UiTabViewArgs *args, int *states, int numstates); UIEXPORT void ui_tabview_args_free(UiTabViewArgs *args); UIEXPORT UiWidgetArgs* ui_widget_args_new(void); @@ -280,6 +284,7 @@ UIEXPORT void ui_label_args_set_align(UiLabelArgs *args, UiAlignment align); UIEXPORT void ui_label_args_set_style(UiLabelArgs *args, UiLabelStyle style); UIEXPORT void ui_label_args_set_value(UiLabelArgs *args, UiString *value); UIEXPORT void ui_label_args_set_varname(UiLabelArgs *args, const char *varname); +UIEXPORT void ui_label_args_set_visibility_states(UiLabelArgs *args, int *states, int numstates); UIEXPORT void ui_label_args_free(UiLabelArgs *args); UIEXPORT UiProgressbarArgs* ui_progressbar_args_new(void); @@ -302,6 +307,7 @@ UIEXPORT void ui_progressbar_args_set_min(UiProgressbarArgs *args, double min); UIEXPORT void ui_progressbar_args_set_max(UiProgressbarArgs *args, double max); UIEXPORT void ui_progressbar_args_set_value(UiProgressbarArgs *args, UiDouble *value); UIEXPORT void ui_progressbar_args_set_varname(UiProgressbarArgs *args, const char *varname); +UIEXPORT void ui_progressbar_args_set_visibility_states(UiProgressbarArgs *args, int *states, int numstates); UIEXPORT void ui_progressbar_args_free(UiProgressbarArgs *args); UIEXPORT UiProgressbarSpinnerArgs* ui_progress_spinner_args_new(void); @@ -322,6 +328,7 @@ UIEXPORT void ui_progress_spinner_args_set_name(UiProgressbarSpinnerArgs *args, UIEXPORT void ui_progress_spinner_args_set_style_class(UiProgressbarSpinnerArgs *args, const char *classname); UIEXPORT void ui_progress_spinner_args_set_value(UiProgressbarSpinnerArgs *args, UiInteger *value); UIEXPORT void ui_progress_spinner_args_set_varname(UiProgressbarSpinnerArgs *args, const char *varname); +UIEXPORT void ui_progress_spinner_args_set_visibility_states(UiProgressbarSpinnerArgs *args, int *states, int numstates); UIEXPORT void ui_progress_spinner_args_free(UiProgressbarSpinnerArgs *args); UIEXPORT UiButtonArgs* ui_button_args_new(void); @@ -347,6 +354,7 @@ 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_states(UiButtonArgs *args, int *states, int numstates); +UIEXPORT void ui_button_args_set_visibility_states(UiButtonArgs *args, int *states, int numstates); UIEXPORT void ui_button_args_free(UiButtonArgs *args); UIEXPORT UiToggleArgs* ui_toggle_args_new(void); @@ -375,6 +383,7 @@ 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_enablestate(UiToggleArgs *args, int state); UIEXPORT void ui_toggle_args_set_states(UiToggleArgs *args, int *states, int numstates); +UIEXPORT void ui_toggle_args_set_visibility_states(UiToggleArgs *args, int *states, int numstates); UIEXPORT void ui_toggle_args_free(UiToggleArgs *args); UIEXPORT UiLinkButtonArgs* ui_linkbutton_args_new(void); @@ -402,6 +411,7 @@ UIEXPORT void ui_linkbutton_args_set_onclickdata(UiLinkButtonArgs *args, void *u UIEXPORT void ui_linkbutton_args_set_nofollow(UiLinkButtonArgs *args, UiBool value); UIEXPORT void ui_linkbutton_args_set_type(UiLinkButtonArgs *args, UiLinkType type); UIEXPORT void ui_linkbutton_args_set_states(UiLinkButtonArgs *args, int *states, int numstates); +UIEXPORT void ui_linkbutton_args_set_visibility_states(UiLinkButtonArgs *args, int *states, int numstates); UIEXPORT void ui_linkbutton_args_free(UiLinkButtonArgs *args); UIEXPORT UiListArgs* ui_list_args_new(void); @@ -444,6 +454,7 @@ UIEXPORT void ui_list_args_set_onsavedata(UiListArgs *args, void *userdata); UIEXPORT void ui_list_args_set_multiselection(UiListArgs *args, UiBool multiselection); UIEXPORT void ui_list_args_set_contextmenu(UiListArgs *args, UiMenuBuilder *menubuilder); UIEXPORT void ui_list_args_set_states(UiListArgs *args, int *states, int numstates); +UIEXPORT void ui_list_args_set_visibility_states(UiListArgs *args, int *states, int numstates); UIEXPORT void ui_list_args_free(UiListArgs *args); UIEXPORT UiSourceListArgs* ui_sourcelist_args_new(void); @@ -473,6 +484,7 @@ UIEXPORT void ui_sourcelist_args_set_onbuttonclick(UiSourceListArgs *args, ui_ca UIEXPORT void ui_sourcelist_args_set_onbuttonclickdata(UiSourceListArgs *args, void *userdata); UIEXPORT void ui_sourcelist_args_set_contextmenu(UiSourceListArgs *args, UiMenuBuilder *menubuilder); UIEXPORT void ui_sourcelist_args_set_header_is_item(UiSourceListArgs *args, UiBool value); +UIEXPORT void ui_sourcelist_args_set_visibility_states(UiSourceListArgs *args, int *states, int numstates); UIEXPORT void ui_sourcelist_args_free(UiSourceListArgs *args); UIEXPORT UiTextAreaArgs* ui_textarea_args_new(void); @@ -496,6 +508,7 @@ UIEXPORT void ui_textarea_args_set_onchangedata(UiTextAreaArgs *args, void *onch UIEXPORT void ui_textarea_args_set_varname(UiTextAreaArgs *args, const char *varname); UIEXPORT void ui_textarea_args_set_value(UiTextAreaArgs *args, UiText *value); UIEXPORT void ui_textarea_args_set_states(UiTextAreaArgs *args, int *states, int numstates); +UIEXPORT void ui_textarea_args_set_visibility_states(UiTextAreaArgs *args, int *states, int numstates); UIEXPORT void ui_textarea_args_free(UiTextAreaArgs *args); UIEXPORT UiTextFieldArgs* ui_textfield_args_new(void); @@ -521,6 +534,7 @@ UIEXPORT void ui_textfield_args_set_onactivatedata(UiTextFieldArgs *args, void * UIEXPORT void ui_textfield_args_set_varname(UiTextFieldArgs *args, const char *varname); UIEXPORT void ui_textfield_args_set_value(UiTextFieldArgs *args, UiString *value); UIEXPORT void ui_textfield_args_set_states(UiTextFieldArgs *args, int *states, int numstates); +UIEXPORT void ui_textfield_args_set_visibility_states(UiTextFieldArgs *args, int *states, int numstates); UIEXPORT void ui_textfield_args_free(UiTextFieldArgs *args); UIEXPORT UiSpinBoxArgs* ui_spinbox_args_new(void); @@ -550,6 +564,7 @@ UIEXPORT void ui_spinbox_args_set_intvalue(UiSpinBoxArgs *args, UiInteger *value UIEXPORT void ui_spinbox_args_set_doublevalue(UiSpinBoxArgs *args, UiDouble *value); UIEXPORT void ui_spinbox_args_set_rangevalue(UiSpinBoxArgs *args, UiRange *value); UIEXPORT void ui_spinbox_args_set_states(UiSpinBoxArgs *args, int *states, int numstates); +UIEXPORT void ui_spinbox_args_set_visibility_states(UiSpinBoxArgs *args, int *states, int numstates); UIEXPORT void ui_spinbox_args_free(UiSpinBoxArgs *args); UIEXPORT UiWebviewArgs* ui_webview_args_new(void); @@ -571,6 +586,7 @@ UIEXPORT void ui_webview_args_set_style_class(UiWebviewArgs *args, const char *c UIEXPORT void ui_webview_args_set_varname(UiWebviewArgs *args, const char *varname); UIEXPORT void ui_webview_args_set_value(UiWebviewArgs *args, UiGeneric *value); UIEXPORT void ui_webview_args_set_states(UiWebviewArgs *args, int *states, int numstates); +UIEXPORT void ui_webview_args_set_visibility_states(UiWebviewArgs *args, int *states, int numstates); UIEXPORT void ui_webview_args_free(UiWebviewArgs *args); #ifdef __cplusplus diff --git a/ui/common/context.c b/ui/common/context.c index 9ddfdb7..3e7abfc 100644 --- a/ui/common/context.c +++ b/ui/common/context.c @@ -68,6 +68,9 @@ UiContext* uic_context(UiObject *toplevel, CxMempool *mp) { ctx->states = cxArrayListCreate(mp->allocator, sizeof(int), 32); cxSetCompareFunc(ctx->states, cx_cmp_int); + ctx->actions = cxHashMapCreate(ctx->allocator, sizeof(UiAction), 8); + ctx->action_bindings = cxArrayListCreate(ctx->allocator, sizeof(UiActionBinding), 0); + ctx->attach_document = uic_context_attach_document; ctx->detach_document2 = uic_context_detach_document; @@ -621,6 +624,13 @@ void ui_widget_set_visibility_states(UiContext *ctx, UIWIDGET widget, const int ui_widget_set_states2(ctx, widget, (ui_enablefunc)ui_set_visible, states, nstates); } +void uic_widget_set_visibility_states(UiContext *ctx, UIWIDGET widget, const int *states) { + if(states) { + size_t nstates = uic_state_array_size(states); + ui_widget_set_visibility_states(ctx, widget, states, (int)nstates); + } +} + size_t uic_state_array_size(const int *states) { int i; for(i=0;states[i] >= 0;i++) { } diff --git a/ui/common/context.h b/ui/common/context.h index 407c051..de80481 100644 --- a/ui/common/context.h +++ b/ui/common/context.h @@ -36,6 +36,8 @@ #include #include +#include "action.h" + #ifdef __cplusplus extern "C" { #endif @@ -72,6 +74,9 @@ struct UiContext { CxList *states; // int list CxList *state_widgets; // UiGroupWidget list + CxMap *actions; // key: action name (string), value: UiAction + CxList *action_bindings; // UiActionBinding list + void (*attach_document)(UiContext *ctx, void *document); void (*detach_document2)(UiContext *ctx, void *document); @@ -150,6 +155,7 @@ const char *uic_type2str(UiVarType type); void uic_reg_var(UiContext *ctx, const char *name, UiVarType type, void *value); +void uic_widget_set_visibility_states(UiContext *ctx, UIWIDGET widget, const int *states); size_t uic_state_array_size(const int *states); void uic_check_state_widgets(UiContext *ctx); void uic_add_state_widget(UiContext *ctx, void *widget, ui_enablefunc enable, CxList *states); diff --git a/ui/common/object.c b/ui/common/object.c index f158230..9b197d7 100644 --- a/ui/common/object.c +++ b/ui/common/object.c @@ -60,6 +60,12 @@ void ui_register_object_destruction_callback(ui_object_callback func, void *user cxListAdd(destruction_callbacks, &cb); } +UiObject* ui_dummy_object(void) { + UiObject *obj = uic_object_new_toplevel(); + obj->ref = 1; + return obj; +} + void uic_object_created(UiObject *obj) { CxIterator i = cxListIterator(creation_callbacks); cx_foreach(objcallback *, cb, i) { diff --git a/ui/common/objs.mk b/ui/common/objs.mk index e69125c..2ce73a5 100644 --- a/ui/common/objs.mk +++ b/ui/common/objs.mk @@ -32,6 +32,7 @@ COMMON_OBJPRE = $(OBJ_DIR)$(COMMON_SRC_DIR) COMMON_OBJ = context$(OBJ_EXT) COMMON_OBJ += document$(OBJ_EXT) COMMON_OBJ += object$(OBJ_EXT) +COMMON_OBJ += action$(OBJ_EXT) COMMON_OBJ += container$(OBJ_EXT) COMMON_OBJ += types$(OBJ_EXT) COMMON_OBJ += app$(OBJ_EXT) diff --git a/ui/common/properties.c b/ui/common/properties.c index 642603d..29c8ce6 100644 --- a/ui/common/properties.c +++ b/ui/common/properties.c @@ -62,6 +62,8 @@ static UiBool load_on_startup = TRUE; static void *properties_data = NULL; static size_t properties_data_length = 0; +static char *config_root = NULL; + void ui_load_properties_file_on_startup(UiBool enable) { load_on_startup = enable; } @@ -77,13 +79,26 @@ void ui_set_properties_data(const char *str, size_t len) { } char* ui_getappdir(void) { - if(ui_appname() == NULL) { + if(ui_appname() == NULL && config_root == NULL) { return NULL; } return ui_configfile(NULL); } +void ui_setappdir(const char *path) { + free(config_root); + if(path) { + cxmutstr cfgpath = cx_strdup(path); + config_root = cfgpath.ptr; + if(cfgpath.length > 0 && cfgpath.ptr[cfgpath.length-1] == '/') { + config_root[cfgpath.length-1] = 0; + } + } else { + config_root = NULL; + } +} + #ifndef _WIN32 #define UI_PATH_SEPARATOR '/' #define UI_ENV_HOME "HOME" @@ -95,6 +110,16 @@ char* ui_getappdir(void) { #define UI_XDG_CONFIG_HOME_VAR "XDG_CONFIG_HOME" char* ui_configfile(const char *name) { + if(config_root) { + if(!name) { + return strdup(config_root); + } else if(name[0] == '/') { + return cx_strdup(cx_strcat(CX_NULLSTR, 2, cx_str(config_root), cx_str(name))).ptr; + } else { + return cx_strdup(cx_strcat(CX_NULLSTR, 3, cx_str(config_root), cx_str("/"), cx_str(name))).ptr; + } + } + const char *appname = ui_appname(); if(!appname) { return NULL; @@ -209,11 +234,6 @@ void uic_load_app_properties() { return; } - if(!ui_appname()) { - // applications without name cannot load app properties - return; - } - char *dir = ui_configfile(NULL); if(!dir) { return; diff --git a/ui/common/threadpool.c b/ui/common/threadpool.c index 3b4c096..0710dcd 100644 --- a/ui/common/threadpool.c +++ b/ui/common/threadpool.c @@ -30,6 +30,7 @@ #include "threadpool.h" #include "context.h" +#include #include #include @@ -38,6 +39,83 @@ static threadpool_job kill_job; + + +static pthread_mutex_t mc_buffer_mutex; +static pthread_cond_t mc_buffer_available; +static CxList *mainthread_call_buffer; +static volatile int mainthread_call_buffered = 0; + +typedef struct UiMainCall { + ui_threadfunc func; + void *data; +} UiMainCall; + +void uic_init_threads(void) { + pthread_mutex_init(&mc_buffer_mutex, NULL); + pthread_cond_init(&mc_buffer_available, NULL); + mainthread_call_buffer = cxLinkedListCreate(NULL, sizeof(UiMainCall)); +} + +int uic_mainthread_calls_is_buffered(void) { + return mainthread_call_buffered; +} + +void uic_add_buffered_mainthread_call(ui_threadfunc func, void *data) { + pthread_mutex_lock(&mc_buffer_mutex); + UiMainCall call; + call.func = func; + call.data = data; + cxListAdd(mainthread_call_buffer, &call); + pthread_cond_signal(&mc_buffer_available); + pthread_mutex_unlock(&mc_buffer_mutex); +} + + +void ui_buffer_mainthread_calls(UiBool enable_buffering) { + mainthread_call_buffered = enable_buffering; + if(!enable_buffering) { + ui_exec_buffered_mainthread_calls(); + } +} + +static void exec_buffered_calls(void) { + CxIterator i = cxListIterator(mainthread_call_buffer); + cx_foreach(UiMainCall *, call, i) { + if(call->func) { + call->func(call->data); + } + } + cxListClear(mainthread_call_buffer); +} + +void ui_exec_buffered_mainthread_calls(void) { + pthread_mutex_lock(&mc_buffer_mutex); + exec_buffered_calls(); + pthread_mutex_unlock(&mc_buffer_mutex); +} + +UIEXPORT void ui_exec_buffered_mainthread_calls_wait(int timeout) { + struct timespec ts; + if(timeout > 0) { + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += timeout; + } + + pthread_mutex_lock(&mc_buffer_mutex); + while(cxListSize(mainthread_call_buffer) == 0) { + if(timeout > 0) { + if(pthread_cond_timedwait(&mc_buffer_available, &mc_buffer_mutex, &ts)) { + break; + } + } else { + pthread_cond_wait(&mc_buffer_available, &mc_buffer_mutex); + } + } + exec_buffered_calls(); + pthread_mutex_unlock(&mc_buffer_mutex); +} + UiThreadpool* threadpool_new(int min, int max) { UiThreadpool *pool = malloc(sizeof(UiThreadpool)); pool->queue = ui_queue_create(); diff --git a/ui/common/threadpool.h b/ui/common/threadpool.h index 4a997f6..8413b24 100644 --- a/ui/common/threadpool.h +++ b/ui/common/threadpool.h @@ -39,6 +39,10 @@ extern "C" { #endif +void uic_init_threads(void); +int uic_mainthread_calls_is_buffered(void); +void uic_add_buffered_mainthread_call(ui_threadfunc func, void *data); + typedef struct UiQueueElm UiQueueElm; typedef struct UiQueue UiQueue; diff --git a/ui/common/types.c b/ui/common/types.c index 2f65c16..e0ecf51 100644 --- a/ui/common/types.c +++ b/ui/common/types.c @@ -153,7 +153,7 @@ void* ui_list_next(UiList *list) { } void* ui_list_get(UiList *list, int i) { - return cxListAt(list->data, i); + return i >= 0 ? cxListAt(list->data, i) : NULL; } int ui_list_count(UiList *list) { @@ -169,7 +169,9 @@ void ui_list_prepend(UiList *list, void *data) { } void ui_list_remove(UiList *list, int i) { - cxListRemove(list->data, i); + if(i >= 0) { + cxListRemove(list->data, i); + } } void ui_list_clear(UiList *list) { @@ -196,6 +198,12 @@ UiListSelection ui_list_get_selection(UiList *list) { } } +UIEXPORT void ui_list_set_selection(UiList *list, UiListSelection sel) { + if(list->setselection) { + list->setselection(list, sel); + } +} + void ui_list_addobsv(UiList *list, ui_callback f, void *data) { list->observers = ui_add_observer(list->observers, f, data); } @@ -500,7 +508,7 @@ void ui_string_set(UiString* s, const char* value) { if (s) { if (s->set) { ui_setop_enable(TRUE); - s->set(s, value); + s->set(s, value ? value : ""); ui_setop_enable(FALSE); } else { if(s->value.free) { @@ -530,7 +538,7 @@ void ui_text_set(UiText* s, const char* value) { if (s) { if (s->set) { ui_setop_enable(TRUE); - s->set(s, value); + s->set(s, value ? value : ""); ui_setop_enable(FALSE); } else { if(s->value.free) { @@ -668,8 +676,11 @@ void uic_text_copy(UiText *from, UiText *to) { to->set = from->set; to->getsubstr = from->getsubstr; to->insert = from->insert; + to->replace = from->replace; to->setposition = from->setposition; to->position = from->position; + to->showposition = from->showposition; + to->setselection = from->setselection; to->selection = from->selection; to->length = from->length; to->remove = from->remove; @@ -758,9 +769,11 @@ void uic_text_unbind(UiText *t) { t->get = NULL; t->getsubstr = NULL; t->insert = NULL; + t->replace = NULL; t->setposition = NULL; t->position = NULL; t->selection = NULL; + t->setselection = NULL; t->length = NULL; t->remove = NULL; t->obj = NULL; @@ -789,21 +802,35 @@ void uic_generic_unbind(UiGeneric *g) { } -UIEXPORT UiListSelection ui_list_getselection(UiList *list) { +UIEXPORT int ui_list_getselection(UiList *list) { + int selection = -1; if (list->getselection) { - return list->getselection(list); + UiListSelection sel = list->getselection(list); + if(sel.count > 0) { + selection = sel.rows[0]; + } + ui_listselection_free(sel); } - return (UiListSelection){ 0, NULL }; + return selection; } UIEXPORT void ui_list_setselection(UiList *list, int index) { + ui_list_setselection2(list, index, TRUE); +} + +UIEXPORT void ui_list_setselection2(UiList *list, int index, UiBool selection_event) { if (list->setselection) { UiListSelection sel = { 0, NULL }; if(index >= 0) { sel.count = 1; sel.rows = &index; } + UiBool events = ui_selection_events_is_enabled(); + if(!selection_event) { + ui_selection_events_enable(FALSE); + } list->setselection(list, sel); + ui_selection_events_enable(events); } } @@ -870,6 +897,7 @@ void uic_list_register_observer_destructor(UiContext *ctx, UiList *list, UiObser static int ui_set_op = 0; static int ui_onchange_events_enabled = TRUE; +static int ui_selection_events_enabled = TRUE; void ui_setop_enable(int set) { ui_set_op = set; @@ -887,6 +915,14 @@ UiBool ui_onchange_events_is_enabled(void) { return ui_onchange_events_enabled; } +void ui_selection_events_enable(UiBool enable) { + ui_selection_events_enabled = enable; +} + +UiBool ui_selection_events_is_enabled(void) { + return ui_selection_events_enabled; +} + /* ---------------- List initializers and wrapper functions ---------------- */ void ui_global_list_initializer(ui_list_init_func func, void *userdata) { diff --git a/ui/gtk/button.c b/ui/gtk/button.c index d9acdbf..9ce23bf 100644 --- a/ui/gtk/button.c +++ b/ui/gtk/button.c @@ -110,6 +110,7 @@ UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, button, &layout); + uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); return button; } @@ -317,6 +318,7 @@ static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleAr UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, widget, &layout); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); return widget; } @@ -380,6 +382,7 @@ UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, widget, &layout); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); return widget; } @@ -469,6 +472,7 @@ UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, widget, &layout); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); return widget; } @@ -621,6 +625,7 @@ UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, rbutton, &layout); + uic_widget_set_visibility_states(obj->ctx, rbutton, args->visibility_states); return rbutton; } @@ -913,6 +918,7 @@ UIWIDGET ui_linkbutton_create(UiObject *obj, UiLinkButtonArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, button, &layout); + uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); return button; } diff --git a/ui/gtk/container.c b/ui/gtk/container.c index 7da333d..5489ecb 100644 --- a/ui/gtk/container.c +++ b/ui/gtk/container.c @@ -393,6 +393,8 @@ UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, UiSubContainerType UiContainerX *container = ui_box_container(obj, box, type); uic_object_push_container(obj, container); + uic_widget_set_visibility_states(obj->ctx, box, args->visibility_states); + return box; } @@ -429,6 +431,8 @@ UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { 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); + uic_widget_set_visibility_states(obj->ctx, grid, args->visibility_states); + return grid; } @@ -476,6 +480,8 @@ UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) { uic_object_push_container(obj, container); } + uic_widget_set_visibility_states(obj->ctx, frame, args->visibility_states); + return frame; } @@ -500,6 +506,8 @@ UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs *args) { uic_object_push_container(obj, container); } + uic_widget_set_visibility_states(obj->ctx, expander, args->visibility_states); + return expander; } @@ -525,6 +533,8 @@ UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) { uic_object_push_container(obj, container); } + uic_widget_set_visibility_states(obj->ctx, sw, args->visibility_states); + return sw; } @@ -733,10 +743,13 @@ typedef void (*ui_tabview_set_func)(UiInteger*, int64_t); UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs *args) { UiGtkTabView *data = malloc(sizeof(UiGtkTabView)); memset(data, 0, sizeof(UiGtkTabView)); + data->obj = obj; data->padding = args->padding; data->spacing = args->spacing; data->columnspacing = args->columnspacing; data->rowspacing = args->rowspacing; + data->onchange = args->onchange; + data->onchangedata = args->onchangedata; ui_tabview_get_func getfunc = NULL; ui_tabview_set_func setfunc = NULL; @@ -811,6 +824,8 @@ UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs *args) { UiContainerX *container = ui_tabview_container(obj, widget); uic_object_push_container(obj, container); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); + return widget; } diff --git a/ui/gtk/display.c b/ui/gtk/display.c index 1f8c39e..1a4073c 100644 --- a/ui/gtk/display.c +++ b/ui/gtk/display.c @@ -115,6 +115,8 @@ UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs *args) { UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, widget, &layout); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); + return widget; } @@ -205,6 +207,8 @@ UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args) { UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, progressbar, &layout); + uic_widget_set_visibility_states(obj->ctx, progressbar, args->visibility_states); + return progressbar; } @@ -246,6 +250,8 @@ UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, spinner, &layout); + uic_widget_set_visibility_states(obj->ctx, spinner, args->visibility_states); + return spinner; } diff --git a/ui/gtk/list.c b/ui/gtk/list.c index e8b649c..f3a3895 100644 --- a/ui/gtk/list.c +++ b/ui/gtk/list.c @@ -661,6 +661,9 @@ UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) { GtkSelectionModel *selection_model = create_selection_model(tableview, ls, args->multiselection); GtkWidget *view = gtk_column_view_new(GTK_SELECTION_MODEL(selection_model)); + if(args->hide_header) { + gtk_widget_set_visible(gtk_widget_get_first_child(view), FALSE); + } UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); @@ -871,7 +874,9 @@ void ui_columnview_activate(void *ignore, guint position, gpointer userdata) { void ui_listview_selection_changed(GtkSelectionModel* self, guint position, guint n_items, gpointer userdata) { UiListView *view = userdata; listview_update_selection(view); - listview_event(view->onselection, view->onselectiondata, view); + if(ui_selection_events_is_enabled()) { + listview_event(view->onselection, view->onselectiondata, view); + } } void ui_dropdown_activate(GtkDropDown* self, gpointer userdata) { @@ -1385,6 +1390,9 @@ static void table_cell_edited( UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) { // create treeview GtkWidget *view = gtk_tree_view_new(); + if(args->hide_header) { + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); + } UiModel *model = args->model; int columns = model ? model->columns : 0; @@ -1789,6 +1797,10 @@ void ui_listview_selection_event( GtkTreeSelection *treeselection, UiTreeEventData *event) { + if(!ui_selection_events_is_enabled()) { + return; + } + UiListSelection selection = ui_listview_get_selection(treeselection, event); UiEvent e; diff --git a/ui/gtk/text.c b/ui/gtk/text.c index 0bcd54d..e9dc703 100644 --- a/ui/gtk/text.c +++ b/ui/gtk/text.c @@ -131,6 +131,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { uitext->onchangedata = args->onchangedata; g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext); + g_object_set_data(G_OBJECT(text_area), "ui_textarea_widget", text_area); g_signal_connect( text_area, @@ -144,6 +145,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, text_area); + g_object_set_data(G_OBJECT(scroll_area), "ui_textarea_widget", text_area); ui_widget_size_request(scroll_area, args->width, args->height); @@ -160,6 +162,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, scroll_area, &layout); + uic_widget_set_visibility_states(obj->ctx, scroll_area, args->visibility_states); // bind value if(var) { @@ -183,8 +186,11 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { value->set = ui_textarea_set; value->getsubstr = ui_textarea_getsubstr; value->insert = ui_textarea_insert; + value->replace = ui_textarea_replace; value->setposition = ui_textarea_setposition; value->position = ui_textarea_position; + value->showposition = ui_textarea_showposition; + value->setselection = ui_textarea_setselection; value->selection = ui_textarea_selection; value->length = ui_textarea_length; value->remove = ui_textarea_remove; @@ -209,8 +215,21 @@ void ui_textarea_destroy(GtkWidget *object, UiTextArea *textarea) { free(textarea); } +void ui_textarea_scroll_to(UIWIDGET textarea, int pos) { + GtkWidget *widget = ui_textarea_gettextwidget(textarea); + if(!widget) { + fprintf(stderr, "Error: ui_textarea_scroll_to: widget is not a textarea\n"); + } + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); + + GtkTextIter offset; + gtk_text_buffer_get_iter_at_offset(buf, &offset, pos); + + gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(widget), &offset, 0.2, FALSE, 0, 0); +} + UIWIDGET ui_textarea_gettextwidget(UIWIDGET textarea) { - return SCROLLEDWINDOW_GET_CHILD(textarea); + return g_object_get_data(G_OBJECT(textarea), "ui_textarea_widget"); } void ui_textarea_save(UiText *text) { @@ -269,7 +288,7 @@ char* ui_textarea_getsubstr(UiText *text, int begin, int end) { return str; } -void ui_textarea_insert(UiText *text, int pos, char *str) { +void ui_textarea_insert(UiText *text, int pos, const char *str) { GtkTextIter offset; gtk_text_buffer_get_iter_at_offset(text->data1, &offset, pos); gtk_text_buffer_insert(text->data1, &offset, str, -1); @@ -280,6 +299,20 @@ void ui_textarea_insert(UiText *text, int pos, char *str) { text->value.free = NULL; } +void ui_textarea_replace(UiText *text, int begin, int end, const char *replacement) { + GtkTextBuffer *buffer = text->data1; + GtkTextIter begin_offset; + GtkTextIter end_offset; + gtk_text_buffer_get_iter_at_offset(buffer, &begin_offset, begin); + gtk_text_buffer_get_iter_at_offset(buffer, &end_offset, end); + gtk_text_buffer_begin_user_action(buffer); + gtk_text_buffer_delete(buffer, &begin_offset, &end_offset); + if(replacement) { + gtk_text_buffer_insert(buffer, &begin_offset, replacement, -1); + } + gtk_text_buffer_end_user_action(buffer); +} + void ui_textarea_setposition(UiText *text, int pos) { GtkTextIter iter; gtk_text_buffer_get_iter_at_offset(text->data1, &iter, pos); @@ -294,6 +327,19 @@ int ui_textarea_position(UiText *text) { return text->pos; } +void ui_textarea_showposition(UiText *text, int pos) { + ui_textarea_scroll_to(text->obj, pos); +} + +void ui_textarea_setselection(UiText *text, int begin, int end) { + GtkTextBuffer *buf = text->data1; + GtkTextIter ib; + GtkTextIter ie; + gtk_text_buffer_get_iter_at_offset(text->data1, &ib, begin); + gtk_text_buffer_get_iter_at_offset(text->data1, &ie, end); + gtk_text_buffer_select_range(buf, &ib, &ie); +} + void ui_textarea_selection(UiText *text, int *begin, int *end) { GtkTextIter b; GtkTextIter e; @@ -639,6 +685,7 @@ static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool passwor UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, textfield, &layout); + uic_widget_set_visibility_states(obj->ctx, textfield, args->visibility_states); if(var) { UiString *value = var->value; @@ -687,6 +734,41 @@ UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { return create_textfield(obj, FALSE, TRUE, args); } +void ui_textfield_focus(UIWIDGET textfield) { + gtk_widget_grab_focus(textfield); +} + +void ui_textfield_focus_without_selecting(UIWIDGET textfield) { +#if GTK_CHECK_VERSION(3, 16, 0) + gtk_entry_grab_focus_without_selecting(GTK_ENTRY(textfield)); +#else + gtk_widget_grab_focus(textfield); +#endif +} + +void ui_textfield_set_selection(UIWIDGET textfield, int begin, int end) { + ENTRY_SET_SELECTION(textfield, begin, end); +} + +void ui_textfield_select_all(UIWIDGET textfield) { + ENTRY_SET_SELECTION(textfield, 0, -1); +} + +void ui_textfield_set_editable(UIWIDGET textfield, UiBool editable) { + ENTRY_SET_EDITABLE(textfield, editable); +} + +UiBool ui_textfield_is_editable(UIWIDGET textfield) { + ENTRY_IS_EDITABLE(textfield); +} + +void ui_textfield_set_position(UIWIDGET textfield, int pos) { + ENTRY_SET_POSITION(textfield, pos); +} + +int ui_textfield_get_position(UIWIDGET textfield) { + return ENTRY_GET_POSITION(textfield); +} void ui_textfield_destroy(GtkWidget *object, UiTextField *textfield) { free(textfield); @@ -964,6 +1046,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, pathtf->stack, &layout); + uic_widget_set_visibility_states(obj->ctx, pathtf->stack, args->visibility_states); pathtf->entry_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pathtf->entry = gtk_entry_new(); @@ -1139,6 +1222,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, eventbox, &layout); + uic_widget_set_visibility_states(obj->ctx, eventbox, args->visibility_states); // hbox as parent for the GtkEntry and GtkButtonBox GtkWidget *hbox = ui_gtk_hbox_new(0); diff --git a/ui/gtk/text.h b/ui/gtk/text.h index b7fbda4..4d306aa 100644 --- a/ui/gtk/text.h +++ b/ui/gtk/text.h @@ -117,9 +117,12 @@ void ui_textarea_text_destroy(UiText *text); char* ui_textarea_get(UiText *text); void ui_textarea_set(UiText *text, const char *str); char* ui_textarea_getsubstr(UiText *text, int begin, int end); -void ui_textarea_insert(UiText *text, int pos, char *str); +void ui_textarea_insert(UiText *text, int pos, const char *str); +void ui_textarea_replace(UiText *text, int begin, int end, const char *replacement); void ui_textarea_setposition(UiText *text, int pos); int ui_textarea_position(UiText *text); +void ui_textarea_showposition(UiText *text, int pos); +void ui_textarea_setselection(UiText *text, int begin, int end); void ui_textarea_selection(UiText *text, int *begin, int *end); int ui_textarea_length(UiText *text); void ui_textarea_remove(UiText *text, int begin, int end); diff --git a/ui/gtk/toolkit.c b/ui/gtk/toolkit.c index 10cba07..f974bae 100644 --- a/ui/gtk/toolkit.c +++ b/ui/gtk/toolkit.c @@ -33,6 +33,7 @@ #include "toolkit.h" #include "toolbar.h" +#include "window.h" #include "icon.h" #include "../common/document.h" #include "../common/properties.h" @@ -76,6 +77,7 @@ UIEXPORT void ui_init(const char *appname, int argc, char **argv) { uic_toolbar_init(); ui_image_init(); uic_load_app_properties(); + uic_init_threads(); #if GTK_MAJOR_VERSION >= 4 scale_factor = 1; // TODO @@ -133,6 +135,24 @@ void ui_main() { } } + +void ui_app_ref(void) { +#ifdef UI_APPLICATION + g_application_hold(G_APPLICATION(app)); +#else + // TODO +#endif +} + +void ui_app_unref(void) { +#ifdef UI_APPLICATION + g_application_release(G_APPLICATION(app)); +#else + // TODO +#endif +} + + #ifndef UI_GTK2 void ui_app_quit() { g_application_quit(G_APPLICATION(app)); // TODO: fix, does not work @@ -144,27 +164,33 @@ GtkApplication* ui_get_application() { #endif void ui_show(UiObject *obj) { - gboolean visible = gtk_widget_is_visible(obj->widget); - + gboolean visible = FALSE; uic_check_state_widgets(obj->ctx); + if(obj->widget) { + visible = gtk_widget_is_visible(obj->widget); #if GTK_MAJOR_VERSION >= 4 - gtk_window_present(GTK_WINDOW(obj->widget)); + gtk_window_present(GTK_WINDOW(obj->widget)); #elif GTK_MAJOR_VERSION <= 3 - gtk_widget_show_all(obj->widget); + gtk_widget_show_all(obj->widget); #endif - + } + if(!visible) { obj->ref++; } } void ui_close(UiObject *obj) { - uic_context_prepare_close(obj->ctx); + uic_context_prepare_close(obj->ctx); // TODO: should this be moved to the close event handler? + if(obj->widget) { #if GTK_CHECK_VERSION(4, 0, 0) - gtk_window_close(GTK_WINDOW(obj->widget)); + gtk_window_close(GTK_WINDOW(obj->widget)); #else - gtk_widget_destroy(obj->widget); + gtk_widget_destroy(obj->widget); #endif + } else { + ui_window_close_request(obj); + } } @@ -203,6 +229,11 @@ static gboolean ui_idle_func(void *data) { } void ui_call_mainthread(ui_threadfunc tf, void* td) { + if(uic_mainthread_calls_is_buffered()) { + uic_add_buffered_mainthread_call(tf, td); + return; + } + UiJob *job = malloc(sizeof(UiJob)); job->job_func = tf; job->job_data = td; diff --git a/ui/gtk/toolkit.h b/ui/gtk/toolkit.h index 0e421b9..e16f361 100644 --- a/ui/gtk/toolkit.h +++ b/ui/gtk/toolkit.h @@ -65,6 +65,11 @@ extern "C" { #define BOX_REMOVE(box, child) gtk_box_remove(GTK_BOX(box), child) #define ENTRY_SET_TEXT(entry, text) gtk_editable_set_text(GTK_EDITABLE(entry), text) #define ENTRY_GET_TEXT(entry) gtk_editable_get_text(GTK_EDITABLE(entry)) +#define ENTRY_SET_SELECTION(entry, begin, end) gtk_editable_select_region(GTK_EDITABLE(entry), begin, end) +#define ENTRY_SET_EDITABLE(entry, editable) gtk_editable_set_editable(GTK_EDITABLE(entry), editable) +#define ENTRY_IS_EDITABLE(entry) gtk_editable_get_editable(GTK_EDITABLE(entry)) +#define ENTRY_SET_POSITION(entry, pos) gtk_editable_set_position(GTK_EDITABLE(entry), pos) +#define ENTRY_GET_POSITION(entry) gtk_editable_get_position(GTK_EDITABLE(entry)) #define SCROLLEDWINDOW_NEW() gtk_scrolled_window_new() #define SCROLLEDWINDOW_SET_CHILD(sw, child) gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), child) #define SCROLLEDWINDOW_GET_CHILD(sw) gtk_scrolled_window_get_child(GTK_SCROLLED_WINDOW(sw)) @@ -90,6 +95,11 @@ extern "C" { #define BOX_REMOVE(box, child) gtk_container_remove(GTK_CONTAINER(box), child) #define ENTRY_SET_TEXT(entry, text) gtk_entry_set_text(GTK_ENTRY(entry), text) #define ENTRY_GET_TEXT(entry) gtk_entry_get_text(GTK_ENTRY(entry)) +#define ENTRY_SET_SELECTION(entry, begin, end) gtk_editable_select_region(GTK_EDITABLE(entry), begin, end) +#define ENTRY_SET_EDITABLE(entry, editable) gtk_editable_set_editable(GTK_EDITABLE(entry), editable) +#define ENTRY_IS_EDITABLE(entry) gtk_editable_get_editable(GTK_EDITABLE(entry)) +#define ENTRY_SET_POSITION(entry, pos) gtk_editable_set_position(GTK_EDITABLE(entry), pos) +#define ENTRY_GET_POSITION(entry) gtk_editable_get_position(GTK_EDITABLE(entry)) #define SCROLLEDWINDOW_NEW() gtk_scrolled_window_new(NULL, NULL) #define SCROLLEDWINDOW_SET_CHILD(sw, child) gtk_container_add(GTK_CONTAINER(sw), child) #define SCROLLEDWINDOW_GET_CHILD(sw) gtk_bin_get_child(GTK_BIN(sw)) diff --git a/ui/gtk/window.c b/ui/gtk/window.c index 1046391..58af741 100644 --- a/ui/gtk/window.c +++ b/ui/gtk/window.c @@ -44,6 +44,7 @@ #include "container.h" #include "headerbar.h" #include "button.h" +#include "window.h" static int nwindows = 0; @@ -80,7 +81,7 @@ void ui_exit_event(GtkWidget *widget, gpointer data) { g_idle_add(ui_window_destroy, data); } -static gboolean ui_window_close_request(UiObject *obj) { +gboolean ui_window_close_request(UiObject *obj) { if(obj->widget) { void *appwindow = g_object_get_data(G_OBJECT(obj->widget), "ui.appwindow"); if(appwindow) { @@ -111,7 +112,6 @@ static gboolean ui_window_close_request(UiObject *obj) { } } - uic_context_prepare_close(obj->ctx); obj->ref--; if(obj->ref > 0) { #if GTK_CHECK_VERSION(2, 18, 0) @@ -121,6 +121,19 @@ static gboolean ui_window_close_request(UiObject *obj) { #endif return TRUE; } else { + if(obj->ctx->close_callback) { + UiEvent ev; + ev.window = obj->window; + ev.document = obj->ctx->document; + ev.obj = obj; + ev.eventdata = NULL; + ev.eventdatatype = 0; + ev.intval = 0; + obj->ctx->close_callback(&ev, obj->ctx->close_data); + obj->ctx->close_callback = NULL; + } + + uic_context_prepare_close(obj->ctx); return FALSE; } } @@ -153,6 +166,25 @@ static UiObject* create_window(const char *title, UiBool sidebar, UiBool splitvi obj->widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); #endif +#if GTK_MAJOR_VERSION < 4 + const char *window_pos = ui_get_property("ui.gtk.window.position"); + GtkWindowPosition wpos = GTK_WIN_POS_CENTER; + if(window_pos) { + if(!strcmp(window_pos, "none")) { + wpos = GTK_WIN_POS_NONE; + } else if(!strcmp(window_pos, "center")) { + //wpos = GTK_WIN_POS_CENTER; + } else if(!strcmp(window_pos, "mouse")) { + wpos = GTK_WIN_POS_MOUSE; + } else if(!strcmp(window_pos, "center_always")) { + wpos = GTK_WIN_POS_CENTER_ALWAYS; + } else { + fprintf(stderr, "Error: unknown value '%s' for property ui.gtk.window.positionhint", window_pos); + } + } + gtk_window_set_position(GTK_WINDOW(obj->widget), wpos); +#endif + #if GTK_CHECK_VERSION(4, 0, 0) obj->ctx->action_map = G_ACTION_MAP(obj->widget); #endif diff --git a/ui/ui/button.h b/ui/ui/button.h index 55367f1..c7db396 100644 --- a/ui/ui/button.h +++ b/ui/ui/button.h @@ -66,6 +66,7 @@ typedef struct UiButtonArgs { void *onclickdata; const int *states; + const int *visibility_states; } UiButtonArgs; typedef struct UiToggleArgs { @@ -96,6 +97,7 @@ typedef struct UiToggleArgs { int enable_state; const int *states; + const int *visibility_states; } UiToggleArgs; typedef struct UiLinkButtonArgs { @@ -125,6 +127,7 @@ typedef struct UiLinkButtonArgs { UiLinkType type; const int *states; + const int *visibility_states; } UiLinkButtonArgs; #define ui_button(obj, ...) ui_button_create(obj, &(UiButtonArgs){ __VA_ARGS__ } ) diff --git a/ui/ui/container.h b/ui/ui/container.h index dc2aa29..49bc631 100644 --- a/ui/ui/container.h +++ b/ui/ui/container.h @@ -82,6 +82,8 @@ typedef struct UiContainerArgs { UiBool def_vfill; UiBool def_hexpand; UiBool def_vexpand; + + const int *visibility_states; } UiContainerArgs; typedef struct UiFrameArgs { @@ -112,6 +114,8 @@ typedef struct UiFrameArgs { const char* label; UiBool isexpanded; + + const int *visibility_states; } UiFrameArgs; typedef struct UiTabViewArgs { @@ -144,6 +148,8 @@ typedef struct UiTabViewArgs { int spacing; int columnspacing; int rowspacing; + + const int *visibility_states; } UiTabViewArgs; typedef struct UiHeaderbarArgs { @@ -207,6 +213,8 @@ typedef struct UiSplitPaneArgs { UiInteger *value; const char* varname; int max_panes; + + const int *visibility_states; } UiSplitPaneArgs; typedef struct UiItemListContainerArgs { diff --git a/ui/ui/display.h b/ui/ui/display.h index 1ed1235..a9c585a 100644 --- a/ui/ui/display.h +++ b/ui/ui/display.h @@ -71,6 +71,8 @@ typedef struct UiLabelArgs { UiLabelStyle style; UiString* value; const char* varname; + + const int *visibility_states; } UiLabelArgs; typedef struct UiProgressbarArgs { @@ -95,6 +97,8 @@ typedef struct UiProgressbarArgs { double max; UiDouble* value; const char* varname; + + const int *visibility_states; } UiProgressbarArgs; typedef struct UiProgressbarSpinnerArgs { @@ -116,6 +120,8 @@ typedef struct UiProgressbarSpinnerArgs { UiInteger* value; const char* varname; + + const int *visibility_states; } UiProgressbarSpinnerArgs; /* label widgets */ diff --git a/ui/ui/entry.h b/ui/ui/entry.h index 9ee26d3..2b89876 100644 --- a/ui/ui/entry.h +++ b/ui/ui/entry.h @@ -66,6 +66,7 @@ typedef struct UiSpinBoxArgs { void* onchangedata; const int *states; + const int *visibility_states;; } UiSpinBoxArgs; diff --git a/ui/ui/list.h b/ui/ui/list.h index 7cfbfbb..06fe345 100644 --- a/ui/ui/list.h +++ b/ui/ui/list.h @@ -175,11 +175,13 @@ struct UiListArgs { ui_callback ondrop; void *ondropdata; UiBool multiselection; + UiBool hide_header; UiMenuBuilder *contextmenu; ui_list_savefunc onsave; void *onsavedata; const int *states; + const int *visibility_states; }; typedef void (*ui_sublist_getvalue_func)(UiList *list, void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata); @@ -295,6 +297,8 @@ struct UiSourceListArgs { void *onbuttonclickdata; UiMenuBuilder *contextmenu; + + const int *visibility_states;; }; #define UI_SUBLIST(...) (UiSubList){ __VA_ARGS__ } diff --git a/ui/ui/menu.h b/ui/ui/menu.h index 43cca7e..bd5b96b 100644 --- a/ui/ui/menu.h +++ b/ui/ui/menu.h @@ -37,31 +37,38 @@ extern "C" { typedef struct UiMenuItemArgs { - const char* label; - const char* icon; + const char *label; + const char *icon; ui_callback onclick; - void* onclickdata; + void *onclickdata; + const char *action; + const char *accelerator; + const char *accelerator_text; - const int* states; + const int *states; } UiMenuItemArgs; typedef struct UiMenuToggleItemArgs { - const char* label; - const char* icon; + const char *label; + const char *icon; - const char* varname; + const char *varname; ui_callback onchange; - void* onchangedata; + void *onchangedata; + const char *action; + const char *accelerator; + const char *accelerator_text; - const int* nstates; + const int *nstates; } UiMenuToggleItemArgs; typedef struct UiMenuItemListArgs { - const char* varname; + const char *varname; ui_getvaluefunc getvalue; ui_callback onselect; - void* onselectdata; + void *onselectdata; + const char *action; UiBool addseparator; } UiMenuItemListArgs; diff --git a/ui/ui/text.h b/ui/ui/text.h index c102f0b..ebea880 100644 --- a/ui/ui/text.h +++ b/ui/ui/text.h @@ -60,6 +60,7 @@ typedef struct UiTextAreaArgs { void *onchangedata; const int *states; + const int *visibility_states; } UiTextAreaArgs; typedef struct UiTextFieldArgs { @@ -88,6 +89,7 @@ typedef struct UiTextFieldArgs { void *onactivatedata; const int *states; + const int *visibility_states; } UiTextFieldArgs; typedef struct UiPathElmRet { @@ -134,6 +136,8 @@ typedef struct UiPathTextFieldArgs { void *ondragcompletedata; ui_callback ondrop; void *ondropsdata; + + const int *visibility_states; } UiPathTextFieldArgs; #define ui_textarea(obj, ...) ui_textarea_create(obj, &(UiTextAreaArgs) { __VA_ARGS__ }) @@ -145,6 +149,8 @@ UIEXPORT UIWIDGET ui_textarea_gettextwidget(UIWIDGET textarea); UIEXPORT void ui_text_undo(UiText *value); UIEXPORT void ui_text_redo(UiText *value); +UIEXPORT void ui_textarea_scroll_to(UIWIDGET textarea, int pos); + #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__ }) @@ -155,6 +161,15 @@ UIEXPORT UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs * UIEXPORT UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args); UIEXPORT UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args); + +UIEXPORT void ui_textfield_focus(UIWIDGET textfield); +UIEXPORT void ui_textfield_focus_without_selecting(UIWIDGET textfield); +UIEXPORT void ui_textfield_set_selection(UIWIDGET textfield, int begin, int end); +UIEXPORT void ui_textfield_select_all(UIWIDGET textfield); +UIEXPORT void ui_textfield_set_editable(UIWIDGET textfield, UiBool editable); +UIEXPORT UiBool ui_textfield_is_editable(UIWIDGET textfield); +UIEXPORT void ui_textfield_set_position(UIWIDGET textfield, int pos); +UIEXPORT int ui_textfield_get_position(UIWIDGET textfield); #ifdef __cplusplus } diff --git a/ui/ui/toolbar.h b/ui/ui/toolbar.h index 2e230df..29319ec 100644 --- a/ui/ui/toolbar.h +++ b/ui/ui/toolbar.h @@ -42,7 +42,10 @@ typedef struct UiToolbarItemArgs { const char *tooltip; ui_callback onclick; - void* onclickdata; + void *onclickdata; + const char *action; + const char *accelerator; + const char *accelerator_text; const int *states; const int *visibility_states; @@ -56,6 +59,9 @@ typedef struct UiToolbarToggleItemArgs { const char *varname; ui_callback onchange; void *onchangedata; + const char *action; + const char *accelerator; + const char *accelerator_text; const int *states; const int *visibility_states; diff --git a/ui/ui/toolkit.h b/ui/ui/toolkit.h index 94c77f0..b798e66 100644 --- a/ui/ui/toolkit.h +++ b/ui/ui/toolkit.h @@ -392,9 +392,11 @@ struct UiText { void (*set)(UiText*, const char*); char* (*get)(UiText*); char* (*getsubstr)(UiText*, int, int); /* text, begin, end */ - void (*insert)(UiText*, int, char*); + void (*insert)(UiText*, int, const char*); + void (*replace)(UiText*, int, int, const char*); void (*setposition)(UiText*,int); int (*position)(UiText*); + void (*showposition)(UiText*, int); void (*setselection)(UiText*, int, int); /* text, begin, end */ void (*selection)(UiText*, int*, int*); /* text, begin, end */ int (*length)(UiText*); @@ -554,8 +556,15 @@ UIEXPORT void ui_app_quit(void); UIEXPORT void ui_show(UiObject *obj); UIEXPORT void ui_close(UiObject *obj); +UIEXPORT UiObject* ui_dummy_object(void); + UIEXPORT void ui_job(UiObject *obj, ui_threadfunc tf, void *td, ui_callback f, void *fd); UIEXPORT void ui_call_mainthread(ui_threadfunc tf, void* td); + +UIEXPORT void ui_buffer_mainthread_calls(UiBool enable_buffering); +UIEXPORT void ui_exec_buffered_mainthread_calls(void); +UIEXPORT void ui_exec_buffered_mainthread_calls_wait(int timeout); + UIEXPORT UiThreadpool* ui_threadpool_create(int nthreads); UIEXPORT void ui_threadpool_destroy(UiThreadpool* pool); UIEXPORT void ui_threadpool_job(UiThreadpool* pool, UiObject* obj, ui_threadfunc tf, void* td, ui_callback f, void* fd); @@ -676,11 +685,15 @@ UIEXPORT void ui_list_clear(UiList *list); UIEXPORT void ui_list_update(UiList *list); UIEXPORT void ui_list_update_row(UiList *list, int row); UIEXPORT UiListSelection ui_list_get_selection(UiList *list); +UIEXPORT void ui_list_set_selection(UiList *list, UiListSelection sel); UIEXPORT void ui_list_addobsv(UiList *list, ui_callback f, void *data); UIEXPORT void ui_list_notify(UiList *list); -UIEXPORT UiListSelection ui_list_getselection(UiList *list); +UIEXPORT int ui_list_getselection(UiList *list); UIEXPORT void ui_list_setselection(UiList *list, int index); +UIEXPORT void ui_list_setselection2(UiList *list, int index, UiBool selection_event); + +UIEXPORT void ui_listselection_free(UiListSelection selection); UIEXPORT UiFileList ui_filelist_copy(UiFileList list); UIEXPORT void ui_filelist_free(UiFileList list); @@ -692,14 +705,12 @@ UIEXPORT void ui_add_image(char *imgname, char *filename); // TODO: remove? -UIEXPORT void ui_listselection_free(UiListSelection selection); - - UIEXPORT UiStr ui_str(char *cstr); UIEXPORT UiStr ui_str_free(char *str, void (*free)(void *v)); UIEXPORT char* ui_getappdir(void); +UIEXPORT void ui_setappdir(const char *path); UIEXPORT char* ui_configfile(const char *name); UIEXPORT UiCondVar* ui_condvar_create(void); @@ -711,6 +722,8 @@ UIEXPORT void ui_setop_enable(int set); UIEXPORT int ui_get_setop(void); UIEXPORT void ui_onchange_events_enable(UiBool enable); UIEXPORT UiBool ui_onchange_events_is_enabled(void); +UIEXPORT void ui_selection_events_enable(UiBool enable); +UIEXPORT UiBool ui_selection_events_is_enabled(void); UIEXPORT void ui_global_list_initializer(ui_list_init_func func, void *userdata); @@ -725,6 +738,9 @@ UIEXPORT void ui_list_class_set_iter(UiList *list, void *iter); UIEXPORT void ui_object_set(UiObject *obj, const char *key, void *data); UIEXPORT void* ui_object_get(UiObject *obj, const char *key); +UIEXPORT void ui_app_ref(void); +UIEXPORT void ui_app_unref(void); + #ifdef __cplusplus } #endif diff --git a/ui/ui/webview.h b/ui/ui/webview.h index d5a243d..65ca139 100644 --- a/ui/ui/webview.h +++ b/ui/ui/webview.h @@ -69,6 +69,7 @@ typedef struct UiWebviewArgs { const char *varname; const int* states; + const int *visibility_states; } UiWebviewArgs; #define ui_webview(obj, ...) ui_webview_create(obj, &(UiWebviewArgs){ __VA_ARGS__ } ) -- 2.47.3