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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
((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);
free((void*)args->icon);
free((void*)args->tooltip);
free((void*)args->states);
+ free((void*)args->visibility_states);
free(args);
}
((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);
free((void*)args->tooltip);
free((void*)args->varname);
free((void*)args->states);
+ free((void*)args->visibility_states);
free(args);
}
((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);
((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);
free(args->static_elements);
}
free((void*)args->states);
+ free((void*)args->visibility_states);
free(args);
}
}
-
void ui_sourcelist_args_set_onbuttonclickdata(UiSourceListArgs *args, void *userdata) {
args->onbuttonclickdata = userdata;
}
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);
}
((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);
}
((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);
}
((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);
}
((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);
}
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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
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;
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++) { }
#include <cx/list.h>
#include <cx/linked_list.h>
+#include "action.h"
+
#ifdef __cplusplus
extern "C" {
#endif
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);
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);
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) {
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)
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;
}
}
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"
#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;
return;
}
- if(!ui_appname()) {
- // applications without name cannot load app properties
- return;
- }
-
char *dir = ui_configfile(NULL);
if(!dir) {
return;
#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();
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;
}
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) {
}
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) {
}
}
+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);
}
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) {
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) {
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;
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;
}
-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);
}
}
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;
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) {
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
uic_object_push_container(obj, container);
}
+ uic_widget_set_visibility_states(obj->ctx, frame, args->visibility_states);
+
return frame;
}
uic_object_push_container(obj, container);
}
+ uic_widget_set_visibility_states(obj->ctx, expander, args->visibility_states);
+
return expander;
}
uic_object_push_container(obj, container);
}
+ uic_widget_set_visibility_states(obj->ctx, sw, args->visibility_states);
+
return sw;
}
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;
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;
}
UiLayout layout = UI_ARGS2LAYOUT(args);
ct->add(ct, widget, &layout);
+ uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states);
+
return widget;
}
UiLayout layout = UI_ARGS2LAYOUT(args);
ct->add(ct, progressbar, &layout);
+ uic_widget_set_visibility_states(obj->ctx, progressbar, args->visibility_states);
+
return progressbar;
}
UiLayout layout = UI_ARGS2LAYOUT(args);
ct->add(ct, spinner, &layout);
+ uic_widget_set_visibility_states(obj->ctx, spinner, args->visibility_states);
+
return spinner;
}
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);
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) {
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;
GtkTreeSelection *treeselection,
UiTreeEventData *event)
{
+ if(!ui_selection_events_is_enabled()) {
+ return;
+ }
+
UiListSelection selection = ui_listview_get_selection(treeselection, event);
UiEvent e;
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,
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);
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) {
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;
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) {
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);
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);
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;
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;
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);
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();
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);
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);
#include "toolkit.h"
#include "toolbar.h"
+#include "window.h"
#include "icon.h"
#include "../common/document.h"
#include "../common/properties.h"
uic_toolbar_init();
ui_image_init();
uic_load_app_properties();
+ uic_init_threads();
#if GTK_MAJOR_VERSION >= 4
scale_factor = 1; // TODO
}
}
+
+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
#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);
+ }
}
}
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;
#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))
#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))
#include "container.h"
#include "headerbar.h"
#include "button.h"
+#include "window.h"
static int nwindows = 0;
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) {
}
}
- uic_context_prepare_close(obj->ctx);
obj->ref--;
if(obj->ref > 0) {
#if GTK_CHECK_VERSION(2, 18, 0)
#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;
}
}
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
void *onclickdata;
const int *states;
+ const int *visibility_states;
} UiButtonArgs;
typedef struct UiToggleArgs {
int enable_state;
const int *states;
+ const int *visibility_states;
} UiToggleArgs;
typedef struct UiLinkButtonArgs {
UiLinkType type;
const int *states;
+ const int *visibility_states;
} UiLinkButtonArgs;
#define ui_button(obj, ...) ui_button_create(obj, &(UiButtonArgs){ __VA_ARGS__ } )
UiBool def_vfill;
UiBool def_hexpand;
UiBool def_vexpand;
+
+ const int *visibility_states;
} UiContainerArgs;
typedef struct UiFrameArgs {
const char* label;
UiBool isexpanded;
+
+ const int *visibility_states;
} UiFrameArgs;
typedef struct UiTabViewArgs {
int spacing;
int columnspacing;
int rowspacing;
+
+ const int *visibility_states;
} UiTabViewArgs;
typedef struct UiHeaderbarArgs {
UiInteger *value;
const char* varname;
int max_panes;
+
+ const int *visibility_states;
} UiSplitPaneArgs;
typedef struct UiItemListContainerArgs {
UiLabelStyle style;
UiString* value;
const char* varname;
+
+ const int *visibility_states;
} UiLabelArgs;
typedef struct UiProgressbarArgs {
double max;
UiDouble* value;
const char* varname;
+
+ const int *visibility_states;
} UiProgressbarArgs;
typedef struct UiProgressbarSpinnerArgs {
UiInteger* value;
const char* varname;
+
+ const int *visibility_states;
} UiProgressbarSpinnerArgs;
/* label widgets */
void* onchangedata;
const int *states;
+ const int *visibility_states;;
} UiSpinBoxArgs;
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);
void *onbuttonclickdata;
UiMenuBuilder *contextmenu;
+
+ const int *visibility_states;;
};
#define UI_SUBLIST(...) (UiSubList){ __VA_ARGS__ }
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;
void *onchangedata;
const int *states;
+ const int *visibility_states;
} UiTextAreaArgs;
typedef struct UiTextFieldArgs {
void *onactivatedata;
const int *states;
+ const int *visibility_states;
} UiTextFieldArgs;
typedef struct UiPathElmRet {
void *ondragcompletedata;
ui_callback ondrop;
void *ondropsdata;
+
+ const int *visibility_states;
} UiPathTextFieldArgs;
#define ui_textarea(obj, ...) ui_textarea_create(obj, &(UiTextAreaArgs) { __VA_ARGS__ })
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__ })
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
}
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;
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;
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*);
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);
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);
-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);
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);
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
const char *varname;
const int* states;
+ const int *visibility_states;
} UiWebviewArgs;
#define ui_webview(obj, ...) ui_webview_create(obj, &(UiWebviewArgs){ __VA_ARGS__ } )