--- a/ui/motif/toolkit.c Sun Dec 07 20:00:33 2025 +0100 +++ b/ui/motif/toolkit.c Sat Dec 13 15:58:58 2025 +0100 @@ -34,11 +34,11 @@ #include "toolkit.h" #include "toolbar.h" #include "container.h" -#include "stock.h" #include "../common/menu.h" #include "../common/toolbar.h" #include "../common/document.h" #include "../common/properties.h" +#include "../common/app.h" #include <cx/buffer.h> #include <X11/Intrinsic.h> @@ -49,13 +49,6 @@ static Widget active_window; static const char *application_name; -static ui_callback startup_func; -static void *startup_data; -static ui_callback open_func; -static void *open_data; -static ui_callback exit_func; -static void *exit_data; - static ui_callback appclose_fnc; static void *appclose_udata; @@ -84,11 +77,17 @@ NULL }; +static String *fallback_resources = fallback; + void input_proc(XtPointer data, int *source, XtInputId *iid) { void *ptr; read(event_pipe[0], &ptr, sizeof(void*)); } +void ui_motif_set_fallback_resources(String *fallbackres) { + fallback_resources = fallbackres; +} + void ui_init(const char *appname, int argc, char **argv) { application_name = appname; uic_init_global_context(); @@ -96,7 +95,7 @@ XtToolkitInitialize(); XtSetLanguageProc(NULL, NULL, NULL); app = XtCreateApplicationContext(); - XtAppSetFallbackResources(app, fallback); + XtAppSetFallbackResources(app, fallback_resources); display = XtOpenDisplay(app, NULL, appname, appname, NULL, 0, &argc, argv); @@ -128,40 +127,21 @@ return display; } -void ui_onstartup(ui_callback f, void *userdata) { - startup_func = f; - startup_data = userdata; -} - -void ui_onopen(ui_callback f, void *userdata) { - open_func = f; - open_data = userdata; -} - -void ui_onexit(ui_callback f, void *userdata) { - exit_func = f; - exit_data = userdata; -} - void ui_app_exit_on_shutdown(UiBool exitapp) { exit_on_shutdown = exitapp; } void ui_main() { - if(startup_func) { - startup_func(NULL, startup_data); - } + uic_application_startup(NULL); XtAppMainLoop(app); - if(exit_func) { - exit_func(NULL, exit_data); - } + uic_application_exit(NULL); uic_store_app_properties(); if(exit_on_shutdown) { exit(0); } } -void ui_exit_mainloop() { +void ui_app_quit() { XtAppSetExitFlag(app); } @@ -174,7 +154,7 @@ } void ui_show(UiObject *obj) { - uic_check_group_widgets(obj->ctx); + uic_check_state_widgets(obj->ctx); if(!XtIsRealized(obj->widget)) { XtRealizeWidget(obj->widget); obj->ref++; @@ -220,6 +200,15 @@ return TRUE; } +static Boolean ui_mainthread_job(void *data) { + UiJob *job = data; + if(job->job_func) { + job->job_func(job->job_data); + } + free(job); + return TRUE; +} + static void* ui_jobthread(void *data) { UiJob *job = data; int result = job->job_func(job->job_data); @@ -231,6 +220,15 @@ return NULL; } +void ui_call_mainthread(ui_threadfunc tf, void* td) { + UiJob *job = malloc(sizeof(UiJob)); + memset(job, 0, sizeof(UiJob)); + job->job_func = tf; + job->job_data = td; + write(event_pipe[1], &job, sizeof(void*)); // hack + XtAppAddWorkProc(app, ui_mainthread_job, job); +} + void ui_job(UiObject *obj, ui_threadfunc tf, void *td, ui_callback f, void *fd) { UiJob *job = malloc(sizeof(UiJob)); job->obj = obj; @@ -325,7 +323,7 @@ 4); } -void ui_destroy_eventdata(Widget w, XtPointer data, XtPointer d) { +void ui_destroy_data(Widget w, XtPointer data, XtPointer d) { free(data); } @@ -333,13 +331,13 @@ if(!groups) { return; } - size_t ngroups = uic_group_array_size(groups); + size_t ngroups = uic_state_array_size(groups); ui_set_widget_ngroups(ctx, widget, groups, ngroups); } void ui_set_widget_ngroups(UiContext *ctx, Widget widget, const int *groups, size_t ngroups) { if(ngroups > 0) { - uic_add_group_widget_i(ctx, widget, (ui_enablefunc)ui_set_enabled, groups, ngroups); + uic_add_state_widget_i(ctx, widget, (ui_enablefunc)ui_set_enabled, groups, ngroups); ui_set_enabled(widget, FALSE); } }