Commit a5aa3e9262e858debf7e08a1c1bf22e68c15fa5b

Authored by Perry Werneck
1 parent 5a112412

Migrating from GtkApplication to GtkOSXApplication.

@@ -234,7 +234,19 @@ dnl --------------------------------------------------------------------------- @@ -234,7 +234,19 @@ dnl ---------------------------------------------------------------------------
234 234
235 GLIB_GSETTINGS 235 GLIB_GSETTINGS
236 236
237 -PKG_CHECK_MODULES( [GTK], [gtk+-3.0 glib-2.0 gmodule-2.0], AC_DEFINE(HAVE_GTK), AC_MSG_ERROR([GTK not present.])) 237 +case "$host" in
  238 + *-mingw32|*-pc-msys)
  239 + PKG_CHECK_MODULES( [GTK], [gtk+-3.0 glib-2.0 gmodule-2.0], AC_DEFINE(HAVE_GTK), AC_MSG_ERROR([GTK not present.]))
  240 + ;;
  241 +
  242 + *-apple-darwin*)
  243 + PKG_CHECK_MODULES( [GTK], [gtk+-3.0 glib-2.0 gmodule-2.0 gtk-mac-integration-gtk3], AC_DEFINE(HAVE_GTK), AC_MSG_ERROR([GTK not present.]))
  244 + ;;
  245 +
  246 + *)
  247 + PKG_CHECK_MODULES( [GTK], [gtk+-3.0 glib-2.0 gmodule-2.0], AC_DEFINE(HAVE_GTK), AC_MSG_ERROR([GTK not present.]))
  248 +
  249 +esac
238 250
239 AC_SUBST(GTK_LIBS) 251 AC_SUBST(GTK_LIBS)
240 AC_SUBST(GTK_CFLAGS) 252 AC_SUBST(GTK_CFLAGS)
src/objects/application/application.c
@@ -34,26 +34,15 @@ enum { @@ -34,26 +34,15 @@ enum {
34 34
35 static GParamSpec * props[NUM_PROPERTIES]; 35 static GParamSpec * props[NUM_PROPERTIES];
36 36
37 -struct _pw3270ApplicationClass {  
38 - GtkApplicationClass parent_class;  
39 -};  
40 -  
41 -struct _pw3270Application {  
42 - GtkApplication parent;  
43 -  
44 - GSettings * settings;  
45 - GList * keypads;  
46 - gchar * logfile;  
47 - GSList * plugins; ///< @brief Handlers of the loaded plugins.  
48 - PW3270_UI_STYLE ui_style;  
49 -  
50 -};  
51 -  
52 static void startup(GApplication * application); 37 static void startup(GApplication * application);
53 static void activate(GApplication * application); 38 static void activate(GApplication * application);
54 static void finalize(GObject *object); 39 static void finalize(GObject *object);
55 40
56 -G_DEFINE_TYPE(pw3270Application, pw3270Application, GTK_TYPE_APPLICATION); 41 +#ifdef __APPLE__
  42 + G_DEFINE_TYPE(pw3270Application, pw3270Application, GTKOSX_TYPE_APPLICATION);
  43 +#else
  44 + G_DEFINE_TYPE(pw3270Application, pw3270Application, GTK_TYPE_APPLICATION);
  45 +#endif // __APPLE__
57 46
58 static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { 47 static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) {
59 48
@@ -270,41 +259,62 @@ static void pw3270Application_init(pw3270Application *app) { @@ -270,41 +259,62 @@ static void pw3270Application_init(pw3270Application *app) {
270 259
271 g_application_add_main_option_entries(G_APPLICATION(app), cmd_options); 260 g_application_add_main_option_entries(G_APPLICATION(app), cmd_options);
272 261
273 -#ifdef _WIN32 262 + app->settings = pw3270_application_settings_new();
  263 +
  264 +#if defined(_WIN32)
  265 + //
  266 + // Setup windows UI
  267 + //
274 app->ui_style = PW3270_UI_STYLE_CLASSICAL; 268 app->ui_style = PW3270_UI_STYLE_CLASSICAL;
  269 + {
  270 + // https://stackoverflow.com/questions/37035936/how-to-get-native-windows-decorations-on-gtk3-on-windows-7-and-msys2
  271 + int gtk_csd = g_settings_get_int(app->settings,"gtk-csd");
  272 + if(gtk_csd != -1) {
  273 + g_autofree gchar * env = g_strdup_printf("GTK_CSD=%d",gtk_csd);
  274 + putenv(env);
  275 + }
  276 + }
  277 +
  278 + if(app->settings) {
  279 + g_object_ref_sink(G_OBJECT(app->settings));
  280 + g_settings_bind(app->settings, "ui-style", app, "ui-style", G_SETTINGS_BIND_DEFAULT);
  281 + }
  282 +
  283 + {
  284 + lib3270_autoptr(char) plugin_path = lib3270_build_data_filename("plugins",NULL);
  285 + pw3270_load_plugins_from_path(app, plugin_path);
  286 + }
  287 +
  288 +#elif defined(__APPLE__)
  289 + //
  290 + // Setup Apple UI
  291 + //
  292 + {
  293 + lib3270_autoptr(char) plugin_path = lib3270_build_data_filename("plugins",NULL);
  294 + pw3270_load_plugins_from_path(app, plugin_path);
  295 + }
  296 +
275 #else 297 #else
  298 + //
  299 + // Setup linux UI
  300 + //
276 app->ui_style = PW3270_UI_STYLE_AUTOMATIC; 301 app->ui_style = PW3270_UI_STYLE_AUTOMATIC;
277 -#endif // _WIN32  
278 -  
279 - // Get settings  
280 app->settings = pw3270_application_settings_new(); 302 app->settings = pw3270_application_settings_new();
281 -  
282 - // Bind properties  
283 if(app->settings) { 303 if(app->settings) {
284 -  
285 g_object_ref_sink(G_OBJECT(app->settings)); 304 g_object_ref_sink(G_OBJECT(app->settings));
  305 + g_settings_bind(app->settings, "ui-style", app, "ui-style", G_SETTINGS_BIND_DEFAULT);
  306 + }
  307 +
  308 + pw3270_load_plugins_from_path(app, G_STRINGIFY(LIBDIR) G_DIR_SEPARATOR_S G_STRINGIFY(PRODUCT_NAME) "-plugins");
286 309
287 -#ifdef _WIN32  
288 - {  
289 - // https://stackoverflow.com/questions/37035936/how-to-get-native-windows-decorations-on-gtk3-on-windows-7-and-msys2  
290 - int gtk_csd = g_settings_get_int(app->settings,"gtk-csd");  
291 - if(gtk_csd != -1) {  
292 - g_autofree gchar * env = g_strdup_printf("GTK_CSD=%d",gtk_csd);  
293 - putenv(env);  
294 - }  
295 - }  
296 #endif // _WIN32 310 #endif // _WIN32
297 311
298 - g_settings_bind(app->settings, "ui-style", app, "ui-style", G_SETTINGS_BIND_DEFAULT);  
299 - } 312 + /*
  313 +
  314 + FIX-ME: Move to other place.
300 315
301 // Get plugins. 316 // Get plugins.
302 { 317 {
303 -#ifdef _WIN32  
304 - lib3270_autoptr(char) path = lib3270_build_data_filename("plugins",NULL);  
305 -#else  
306 - const gchar * path = G_STRINGIFY(LIBDIR) G_DIR_SEPARATOR_S G_STRINGIFY(PRODUCT_NAME) "-plugins";  
307 -#endif // _WIN32  
308 318
309 if(g_file_test(path,G_FILE_TEST_IS_DIR)) { 319 if(g_file_test(path,G_FILE_TEST_IS_DIR)) {
310 320
@@ -353,17 +363,19 @@ static void pw3270Application_init(pw3270Application *app) { @@ -353,17 +363,19 @@ static void pw3270Application_init(pw3270Application *app) {
353 363
354 } 364 }
355 365
356 - // Initialize plugins  
357 - {  
358 - GSList * item;  
359 - void (*call)(GtkApplication *application);  
360 366
361 - for(item = app->plugins; item; item = g_slist_next(item)) {  
362 - if(g_module_symbol((GModule *) item->data, "pw3270_plugin_set_application", (gpointer *) &call)) {  
363 - call(GTK_APPLICATION(app));  
364 - }  
365 - } 367 + }
  368 + */
  369 +
  370 + // Initialize plugins
  371 + {
  372 + GSList * item;
  373 + void (*call)(GtkApplication *application);
366 374
  375 + for(item = app->plugins; item; item = g_slist_next(item)) {
  376 + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_set_application", (gpointer *) &call)) {
  377 + call(GTK_APPLICATION(app));
  378 + }
367 } 379 }
368 380
369 } 381 }
@@ -537,6 +549,7 @@ void activate(GApplication *application) { @@ -537,6 +549,7 @@ void activate(GApplication *application) {
537 549
538 void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type) { 550 void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type) {
539 551
  552 +#ifndef __APPLE__
540 g_return_if_fail(PW3270_IS_APPLICATION(app)); 553 g_return_if_fail(PW3270_IS_APPLICATION(app));
541 554
542 pw3270Application * application = PW3270_APPLICATION(app); 555 pw3270Application * application = PW3270_APPLICATION(app);
@@ -547,12 +560,18 @@ void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type) { @@ -547,12 +560,18 @@ void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type) {
547 application->ui_style = type; 560 application->ui_style = type;
548 g_object_notify_by_pspec(G_OBJECT(app), props[PROP_UI_STYLE]); 561 g_object_notify_by_pspec(G_OBJECT(app), props[PROP_UI_STYLE]);
549 562
  563 +#endif // !__APPLE
  564 +
550 } 565 }
551 566
552 PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app) { 567 PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app) {
553 568
  569 +#ifdef __APPLE__
  570 + return PW3270_UI_STYLE_GNOME;
  571 +#else
554 g_return_val_if_fail(PW3270_IS_APPLICATION(app),PW3270_UI_STYLE_CLASSICAL); 572 g_return_val_if_fail(PW3270_IS_APPLICATION(app),PW3270_UI_STYLE_CLASSICAL);
555 return PW3270_APPLICATION(app)->ui_style; 573 return PW3270_APPLICATION(app)->ui_style;
  574 +#endif // __APPLE__
556 575
557 } 576 }
558 577
src/objects/application/plugins.c 0 → 100644
@@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
  1 +/* SPDX-License-Identifier: LGPL-3.0-or-later */
  2 +
  3 +/*
  4 + * Copyright (C) 2008 Banco do Brasil S.A.
  5 + *
  6 + * This program is free software: you can redistribute it and/or modify
  7 + * it under the terms of the GNU Lesser General Public License as published
  8 + * by the Free Software Foundation, either version 3 of the License, or
  9 + * (at your option) any later version.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License
  17 + * along with this program. If not, see <https://www.gnu.org/licenses/>.
  18 + */
  19 +
  20 +#include "private.h"
  21 +
  22 +void pw3270_load_plugins_from_path(pw3270Application *app, const char *path) {
  23 +
  24 + if(g_file_test(path,G_FILE_TEST_IS_DIR)) {
  25 +
  26 + g_message("Loading plugins from %s",path);
  27 +
  28 + GError * err = NULL;
  29 + GDir * dir = g_dir_open(path,0,&err);
  30 +
  31 + if(dir) {
  32 +
  33 + const gchar *name;
  34 + while((name = g_dir_read_name(dir)) != NULL) {
  35 +
  36 + g_autofree gchar *filename = g_build_filename(path,name,NULL);
  37 +
  38 + if(g_str_has_suffix(filename,G_MODULE_SUFFIX)) {
  39 +
  40 + g_message("Loading %s",filename);
  41 +
  42 + GModule *handle = g_module_open(filename,G_MODULE_BIND_LOCAL);
  43 +
  44 + if(handle) {
  45 +
  46 + app->plugins = g_slist_append(app->plugins,handle);
  47 +
  48 + } else {
  49 +
  50 + g_warning("Can't load %s: %s",filename,g_module_error());
  51 +
  52 + }
  53 +
  54 + }
  55 +
  56 + }
  57 +
  58 + g_dir_close(dir);
  59 + }
  60 +
  61 + if(err) {
  62 +
  63 + g_warning("Can't load plugins from %s: %s",path,err->message);
  64 + g_error_free(err);
  65 +
  66 + }
  67 +
  68 + }
  69 +
  70 +}
src/objects/application/private.h
@@ -46,10 +46,36 @@ @@ -46,10 +46,36 @@
46 #include <lib3270.h> 46 #include <lib3270.h>
47 #include <lib3270/log.h> 47 #include <lib3270/log.h>
48 48
  49 +#ifdef __APPLE__
  50 + #include <gtkosxapplication.h>
  51 +#endif // __APPLE__
  52 +
  53 +typedef struct _pw3270Application {
  54 +#ifdef __APPLE__
  55 + GtkosxApplication parent;
  56 +#else
  57 + GtkApplication parent;
  58 + PW3270_UI_STYLE ui_style;
  59 +#endif // __APPLE__
  60 +
  61 + GSettings * settings;
  62 + GList * keypads;
  63 + gchar * logfile;
  64 + GSList * plugins; ///< @brief Handlers of the loaded plugins.
  65 +
  66 +} pw3270Application;
  67 +
  68 +struct _pw3270ApplicationClass {
  69 + GtkApplicationClass parent_class;
  70 +};
  71 +
  72 +
49 G_GNUC_INTERNAL void pw3270_application_open(GApplication * application, GFile **files, gint n_files, const gchar *hint); 73 G_GNUC_INTERNAL void pw3270_application_open(GApplication * application, GFile **files, gint n_files, const gchar *hint);
50 74
51 G_GNUC_INTERNAL GtkWidget * pw3270_terminal_new(const gchar *session_file); 75 G_GNUC_INTERNAL GtkWidget * pw3270_terminal_new(const gchar *session_file);
52 76
  77 +G_GNUC_INTERNAL void pw3270_load_plugins_from_path(pw3270Application *app, const char *path);
  78 +
53 // Actions 79 // Actions
54 G_GNUC_INTERNAL GAction * pw3270_about_action_new(); 80 G_GNUC_INTERNAL GAction * pw3270_about_action_new();
55 G_GNUC_INTERNAL GAction * pw3270_preferences_action_new(); 81 G_GNUC_INTERNAL GAction * pw3270_preferences_action_new();
src/objects/window/window.c
@@ -531,7 +531,9 @@ static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) { @@ -531,7 +531,9 @@ static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) {
531 // 531 //
532 // Bind properties 532 // Bind properties
533 // 533 //
534 -#ifndef __APPLE__ 534 +#ifdef __APPLE__
  535 + gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(widget),TRUE);
  536 +#else
535 g_action_map_add_action( 537 g_action_map_add_action(
536 G_ACTION_MAP(widget), 538 G_ACTION_MAP(widget),
537 G_ACTION(g_property_action_new("menubar", widget, "show-menubar")) 539 G_ACTION(g_property_action_new("menubar", widget, "show-menubar"))