ui/gtk/toolkit.c

changeset 133
6dd780cbc8c6
parent 115
102fc0b8fe3e
child 134
69e8e0936858
--- a/ui/gtk/toolkit.c	Sun Jan 15 15:08:07 2017 +0100
+++ b/ui/gtk/toolkit.c	Sun Jan 22 11:16:21 2017 +0100
@@ -38,10 +38,21 @@
 #include "../common/document.h"
 #include "../common/properties.h"
 
+#include <ucx/utils.h>
+
 #include <pthread.h>
 
+static GtkApplication *app;
+
 static char *application_name;
 
+static ui_callback   startup_func;
+static void          *startup_data;
+static ui_callback   open_func;
+void                 *open_data;
+static ui_callback   exit_func;
+void                 *exit_data;
+
 static ui_callback   appclose_fnc;
 static void          *appclose_udata;
 
@@ -66,23 +77,62 @@
     return application_name;
 }
 
-void ui_exitfunc(ui_callback f, void *userdata) {
-    appclose_fnc = f;
-    appclose_udata = userdata;
+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_openfilefunc(ui_callback f, void *userdata) {
-    // OS X only
+void ui_onexit(ui_callback f, void *userdata) {
+    exit_func = f;
+    exit_data = userdata;
+}
+
+
+static void app_startup(GtkApplication* app, gpointer userdata) {
+    startup_func(NULL, startup_data);
+}
+
+static void app_activate(GtkApplication* app, gpointer userdata) {
+    printf("activate\n");
 }
 
 void ui_main() {
+#ifndef GTK2_LEGACY
+    sstr_t appid = ucx_sprintf(
+            "ui.%s",
+            application_name ? application_name : "application1");
+    
+    app = gtk_application_new(
+            appid.ptr,
+            G_APPLICATION_FLAGS_NONE);
+    g_signal_connect (app, "startup", G_CALLBACK (app_startup), NULL);
+    g_signal_connect (app, "activate", G_CALLBACK (app_activate), NULL);
+    g_application_run(G_APPLICATION (app), 0, NULL);
+    g_object_unref (app);
+    
+    free(appid.ptr);
+#else
     gtk_main();
+#endif
     if(appclose_fnc) {
         appclose_fnc(NULL, appclose_udata);
     }
     uic_store_app_properties();
 }
 
+void ui_app_quit() {
+    g_application_quit(G_APPLICATION(app));
+}
+
+GtkApplication* ui_get_application() {
+    return app;
+}
+
 void ui_show(UiObject *obj) {
     uic_check_group_widgets(obj->ctx);
     gtk_widget_show_all(obj->widget);

mercurial