]> uap-core.de Git - mizunara.git/commitdiff
update toolkit
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 1 Mar 2026 09:37:14 +0000 (10:37 +0100)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 1 Mar 2026 09:37:14 +0000 (10:37 +0100)
29 files changed:
ui/common/args.c
ui/common/args.h
ui/common/context.c
ui/common/context.h
ui/common/object.c
ui/common/objs.mk
ui/common/properties.c
ui/common/threadpool.c
ui/common/threadpool.h
ui/common/types.c
ui/gtk/button.c
ui/gtk/container.c
ui/gtk/display.c
ui/gtk/list.c
ui/gtk/text.c
ui/gtk/text.h
ui/gtk/toolkit.c
ui/gtk/toolkit.h
ui/gtk/window.c
ui/ui/button.h
ui/ui/container.h
ui/ui/display.h
ui/ui/entry.h
ui/ui/list.h
ui/ui/menu.h
ui/ui/text.h
ui/ui/toolbar.h
ui/ui/toolkit.h
ui/ui/webview.h

index 0ec8a4e5c9d1d19d9245ddc2e0b3acf038756d0c..821b2215197ebce84d446da3e53e8cb181df62b2 100644 (file)
@@ -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);
 }
 
index 12c0160b0fe1a8a2d99a7a137cb783ab7a23e5f1..2c5abeb8c1e934951661f103abeb24d949e48144 100644 (file)
@@ -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
index 9ddfdb75b4c0974dfe6c4e20f17690b9b0b55f32..3e7abfc0cf47e10d78bd2b57065f5f42c3b1f508 100644 (file)
@@ -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++) { }
index 407c051d963dd7d620f3cfb0120199d31a61a528..de804818de35418ee6118d0172d5bdceafe05cfa 100644 (file)
@@ -36,6 +36,8 @@
 #include <cx/list.h>
 #include <cx/linked_list.h>
 
+#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);
index f1582307ef28081cd2889fac28f2fa6c8964720b..9b197d7edb235905c4579f07721859bed49c8dfc 100644 (file)
@@ -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) {
index e69125caa6865580629a16a70b5cf06e5ce2eea5..2ce73a5d7e14c3b2e7e5abc78d358fa80db7010e 100644 (file)
@@ -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)
index 642603da398d26f74faabc48f1ac20b945036bcb..29c8ce60f47ec64f988abdbeb0c26e31ec6787ef 100644 (file)
@@ -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;
index 3b4c096509861abc266c59e5698daf5aa16d342e..0710dcd48aa4cfd2674de020072f0207a93439a7 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "threadpool.h"
 #include "context.h"
+#include <cx/linked_list.h>
 
 #include <pthread.h>
 #include <stdio.h>
 
 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();
index 4a997f6802a0cab9f4af2a630c935749263f9720..8413b240acdece14f2bd9e7485316f7c1844b67b 100644 (file)
 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;
     
index 2f65c16083d8fe68c40c80b399593ee1f321ff8b..e0ecf515f16d06daa3c292c583c0042b248f0324 100644 (file)
@@ -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) {
index d9acdbf38284f00bb07228232705114dbee60825..9ce23bf7bf3e2faf5e07f437fe7b60f3ff1cb9fe 100644 (file)
@@ -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;
 }
index 7da333da50cdf2d75f557a1c17669d0bb3ebcf51..5489ecbdc232f26da8d95e670ded6299332c3248 100644 (file)
@@ -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;
 }
 
index 1f8c39e1a32104d73638e17975cd07d2a1a54814..1a4073c089b5c98fa64e6e5b26386d153c490290 100644 (file)
@@ -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;
 }
 
index e8b649cdc261c09361aeda5a4d40a03786c44dea..f3a3895465a342f3360858ab4a9a30ec1ae5e4ae 100644 (file)
@@ -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;
index 0bcd54df3e4c3eb071e718be050bf731c6f20512..e9dc703e529318c422f9fdec6cad82ce916e3130 100644 (file)
@@ -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);
index b7fbda499a8a2267190825bec206524eeeea1ea8..4d306aa5026cadf9ffb9c5d3675a5974f9742e61 100644 (file)
@@ -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);
index 10cba07f253f00e366c6ba1cc94c5b12b9a535de..f974baea12e5f0c8f8fac6efedaf0ca1e897f41b 100644 (file)
@@ -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;
index 0e421b9c996906306e14664b32f5c8ec396634a4..e16f3614806e243ca48f9049eb55da26f8aacce5 100644 (file)
@@ -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))
index 10463914976923d0a62a3c8d9689a74ffd2d7950..58af741ff25051a9a9ae334b9b42b2a7f1ff0a6a 100644 (file)
@@ -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
index 55367f19fc7e54e34c09738c469edf0fbaf91ce5..c7db3968f8bf049f10ab16d6f73f8c40d31cc053 100644 (file)
@@ -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__ } )
index dc2aa299ebef95b7e26fc502c1edbb28bd58bffc..49bc6316858115033d9ace3082ae7203f5b589f6 100644 (file)
@@ -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 {
index 1ed1235ba3170ed93a88e6ef88c97e1a92268789..a9c585a9a4ae5c0032c4b6c5bce5d166e878f4d0 100644 (file)
@@ -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 */
index 9ee26d3b1e5a02cab83240cb61febc84ba55b7c1..2b898767f635424e6e438729686e42676034f681 100644 (file)
@@ -66,6 +66,7 @@ typedef struct UiSpinBoxArgs {
     void* onchangedata;
     
     const int *states;
+    const int *visibility_states;;
 } UiSpinBoxArgs;
 
 
index 7cfbfbba5cd2cb14ae25ceed9ab81c3cab0e88da..06fe345396dfdc53e463982053c7c811585e60b7 100644 (file)
@@ -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__ }
index 43cca7e7f6ab80e39a945356b0c8db06fb320f9e..bd5b96b6a5d320ebe88263255808af01eaf378df 100644 (file)
@@ -37,31 +37,38 @@ extern "C" {
 
 
 typedef struct UiMenuItemArgs {
-       const charlabel;
-       const charicon;
+       const char *label;
+       const char *icon;
 
        ui_callback onclick;
-       void* onclickdata;
+       void *onclickdata;
+        const char *action;
+        const char *accelerator;
+        const char *accelerator_text;
 
-       const intstates;
+       const int *states;
 } UiMenuItemArgs;
 
 typedef struct UiMenuToggleItemArgs {
-       const charlabel;
-       const charicon;
+       const char *label;
+       const char *icon;
 
-       const charvarname;
+       const char *varname;
        ui_callback onchange;
-       void* onchangedata;
+       void *onchangedata;
+        const char *action;
+        const char *accelerator;
+        const char *accelerator_text;
 
-       const intnstates;
+       const int *nstates;
 } UiMenuToggleItemArgs;
 
 typedef struct UiMenuItemListArgs {
-       const charvarname;
+       const char *varname;
        ui_getvaluefunc getvalue;
        ui_callback onselect;
-       void* onselectdata;
+       void *onselectdata;
+        const char *action;
         UiBool addseparator;
 } UiMenuItemListArgs;
 
index c102f0b36ce20b74160aa1b2494b599c099dd92c..ebea880d84bc0c4c7df1b75155cf8dd27df593dc 100644 (file)
@@ -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
 }
index 2e230df495810275d9a65fc0313a5ff40e05224e..29319ecb9172235af0e7e7b2722e8bedb8c40c94 100644 (file)
@@ -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;
index 94c77f01b103693af936b6b2367848dfcdbd24b1..b798e664b7d53699edf528a3e38b9c2b9ff32d63 100644 (file)
@@ -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
index d5a243ddb9d48aca1ddb928e42684dde547952f1..65ca1392036b67717490d808ff135ecce8d36d15 100644 (file)
@@ -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__ } )