[gthumb] main: refactored the code to make it clearer



commit 437e422267e1b505ef95dc063e2880b107476329
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Mon Oct 31 16:34:32 2011 +0100

    main: refactored the code to make it clearer
    
    Removed the use of ClutterInitResult.  Added a GthApplication class.
    Removed the use of gth_window_get_window_list in favor of
    gtk_application_get_windows.

 extensions/slideshow/actions.c |    2 +-
 gthumb/gth-main.c              |   13 +--
 gthumb/gth-window.c            |  102 ++++--------
 gthumb/gth-window.h            |    6 -
 gthumb/main.c                  |  348 ++++++++++++++++++++++++----------------
 gthumb/main.h                  |   15 +--
 6 files changed, 252 insertions(+), 234 deletions(-)
---
diff --git a/extensions/slideshow/actions.c b/extensions/slideshow/actions.c
index 6258860..2c8fd31 100644
--- a/extensions/slideshow/actions.c
+++ b/extensions/slideshow/actions.c
@@ -73,7 +73,7 @@ gth_browser_activate_action_view_slideshow (GtkAction  *action,
 	projector = NULL;
 
 #ifdef HAVE_CLUTTER
-	if (ClutterInitResult == CLUTTER_INIT_SUCCESS)
+	if (gtk_clutter_init (NULL, NULL) == CLUTTER_INIT_SUCCESS)
 		projector = &clutter_projector;
 #endif /* HAVE_CLUTTER */
 
diff --git a/gthumb/gth-main.c b/gthumb/gth-main.c
index 5466a75..e457a31 100644
--- a/gthumb/gth-main.c
+++ b/gthumb/gth-main.c
@@ -41,10 +41,6 @@
 #include <gdk/gdkx.h>
 #endif
 
-#ifdef USE_SMCLIENT
-#include "eggsmclient.h"
-#endif
-#include "eggdesktopfile.h"
 
 static GStaticMutex register_mutex = G_STATIC_MUTEX_INIT;
 
@@ -222,15 +218,8 @@ gth_main_initialize (void)
 {
 	if (Main != NULL)
 		return;
-	Main = (GthMain*) g_object_new (GTH_TYPE_MAIN, NULL);
 
-#ifdef GDK_WINDOWING_X11
-	egg_set_desktop_file (GTHUMB_APPLICATIONS_DIR "/gthumb.desktop");
-#else
-	/* manually set name and icon */
-	g_set_application_name (_("gThumb"));
-	gtk_window_set_default_icon_name ("gthumb");
-#endif
+	Main = (GthMain*) g_object_new (GTH_TYPE_MAIN, NULL);
 }
 
 
diff --git a/gthumb/gth-window.c b/gthumb/gth-window.c
index 4f8f6a1..aead18c 100644
--- a/gthumb/gth-window.c
+++ b/gthumb/gth-window.c
@@ -23,18 +23,15 @@
 #include <gtk/gtk.h>
 #include "gth-window.h"
 #include "gtk-utils.h"
-
-
-#define GTH_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTH_TYPE_WINDOW, GthWindowPrivate))
+#include "main.h"
 
 enum  {
-	GTH_WINDOW_DUMMY_PROPERTY,
-	GTH_WINDOW_N_PAGES
+	PROP_0,
+	PROP_N_PAGES
 };
 
 
 static GtkWindowClass *parent_class = NULL;
-static GList *window_list = NULL;
 
 
 struct _GthWindowPrivate {
@@ -58,6 +55,11 @@ gth_window_set_n_pages (GthWindow *self,
 {
 	int i;
 
+	if (self->priv->n_pages != 0) {
+		g_critical ("The number of pages of a GthWindow can be set only once.");
+		return;
+	}
+
 	self->priv->n_pages = n_pages;
 
 	self->priv->table = gtk_table_new (5, 1, FALSE);
@@ -117,7 +119,7 @@ gth_window_set_property (GObject      *object,
 	self = GTH_WINDOW (object);
 
 	switch (property_id) {
-	case GTH_WINDOW_N_PAGES:
+	case PROP_N_PAGES:
 		gth_window_set_n_pages (self, g_value_get_int (value));
 		break;
 	default:
@@ -128,6 +130,27 @@ gth_window_set_property (GObject      *object,
 
 
 static void
+gth_window_get_property (GObject    *object,
+		         guint       property_id,
+		         GValue     *value,
+		         GParamSpec *pspec)
+{
+	GthWindow *self;
+
+        self = GTH_WINDOW (object);
+
+	switch (property_id) {
+	case PROP_N_PAGES:
+		g_value_set_int (value, self->priv->n_pages);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+		break;
+	}
+}
+
+
+static void
 gth_window_finalize (GObject *object)
 {
 	GthWindow *window = GTH_WINDOW (object);
@@ -136,12 +159,7 @@ gth_window_finalize (GObject *object)
 	g_free (window->priv->contents);
 	g_free (window->priv->window_size);
 
-	window_list = g_list_remove (window_list, window);
-
 	G_OBJECT_CLASS (parent_class)->finalize (object);
-
-	if (window_list == NULL)
-		gtk_main_quit ();
 }
 
 
@@ -202,6 +220,7 @@ gth_window_class_init (GthWindowClass *klass)
 
 	gobject_class = (GObjectClass*) klass;
 	gobject_class->set_property = gth_window_set_property;
+	gobject_class->get_property = gth_window_get_property;
 	gobject_class->finalize = gth_window_finalize;
 
 	widget_class = (GtkWidgetClass*) klass;
@@ -212,21 +231,21 @@ gth_window_class_init (GthWindowClass *klass)
 	klass->set_current_page = gth_window_real_set_current_page;
 
 	g_object_class_install_property (G_OBJECT_CLASS (klass),
-					 GTH_WINDOW_N_PAGES,
+					 PROP_N_PAGES,
 					 g_param_spec_int ("n-pages",
 							   "n-pages",
 							   "n-pages",
 							   0,
 							   G_MAXINT,
 							   1,
-							   G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+							   G_PARAM_READWRITE));
 }
 
 
 static void
 gth_window_init (GthWindow *window)
 {
-	window->priv = GTH_WINDOW_GET_PRIVATE (window);
+	window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window, GTH_TYPE_WINDOW, GthWindowPrivate);
 	window->priv->table = NULL;
 	window->priv->contents = NULL;
 	window->priv->n_pages = 0;
@@ -236,36 +255,11 @@ gth_window_init (GthWindow *window)
 	window->priv->infobar = NULL;
 	window->priv->statusbar = NULL;
 
-	window_list = g_list_prepend (window_list, window);
+	gtk_window_set_application (GTK_WINDOW (window), Main_Application);
 }
 
 
-GType
-gth_window_get_type (void)
-{
-	static GType type = 0;
-
-	if (! type) {
-		GTypeInfo type_info = {
-			sizeof (GthWindowClass),
-			NULL,
-			NULL,
-			(GClassInitFunc) gth_window_class_init,
-			NULL,
-			NULL,
-			sizeof (GthWindow),
-			0,
-			(GInstanceInitFunc) gth_window_init
-		};
-
-		type = g_type_register_static (GTK_TYPE_WINDOW,
-					       "GthWindow",
-					       &type_info,
-					       0);
-	}
-
-	return type;
-}
+G_DEFINE_TYPE(GthWindow, gth_window, GTK_TYPE_WINDOW)
 
 
 void
@@ -495,27 +489,3 @@ gth_window_get_page_size (GthWindow *window,
 
 	return TRUE;
 }
-
-
-int
-gth_window_get_n_windows (void)
-{
-	return g_list_length (window_list);
-}
-
-
-GList *
-gth_window_get_window_list (void)
-{
-	return window_list;
-}
-
-
-GtkWidget *
-gth_window_get_current_window (void)
-{
-	if ((window_list == NULL) || (g_list_length (window_list) > 1))
-		return NULL;
-	else
-		return (GtkWidget *) window_list->data;
-}
diff --git a/gthumb/gth-window.h b/gthumb/gth-window.h
index c258e7e..c4053e6 100644
--- a/gthumb/gth-window.h
+++ b/gthumb/gth-window.h
@@ -98,12 +98,6 @@ gboolean       gth_window_get_page_size      (GthWindow     *window,
 void           gth_window_clear_saved_size   (GthWindow     *window,
       	      	      	      	      	      int            page);
 
-/**/
-
-int            gth_window_get_n_windows      (void);
-GList *        gth_window_get_window_list    (void);
-GtkWidget *    gth_window_get_current_window (void);
-
 G_END_DECLS
 
 #endif /* GTH_WINDOW_H */
diff --git a/gthumb/main.c b/gthumb/main.c
index a0e1c2a..b2893b6 100644
--- a/gthumb/main.c
+++ b/gthumb/main.c
@@ -23,13 +23,17 @@
 #include <glib/gi18n.h>
 #include <glib/gprintf.h>
 #include <gtk/gtk.h>
+#ifdef HAVE_GSTREAMER
+#  include <gst/gst.h>
+#endif
 #ifdef HAVE_CLUTTER
-#include <clutter/clutter.h>
-#include <clutter-gtk/clutter-gtk.h>
+#  include <clutter/clutter.h>
+#  include <clutter-gtk/clutter-gtk.h>
 #endif
 #ifdef USE_SMCLIENT
-#include "eggsmclient.h"
+#  include "eggsmclient.h"
 #endif
+#include "eggdesktopfile.h"
 #include "gconf-utils.h"
 #include "glib-utils.h"
 #include "gth-browser.h"
@@ -40,16 +44,11 @@
 #include "main-migrate.h"
 
 
-gboolean NewWindow = FALSE;
-gboolean StartInFullscreen = FALSE;
-gboolean StartSlideshow = FALSE;
-gboolean ImportPhotos = FALSE;
-#ifdef HAVE_CLUTTER
-int      ClutterInitResult = CLUTTER_INIT_ERROR_UNKNOWN;
-#endif
-
-
-GtkApplication     *GThumb_Application;
+GtkApplication     *Main_Application = NULL;
+gboolean            NewWindow = FALSE;
+gboolean            StartInFullscreen = FALSE;
+gboolean            StartSlideshow = FALSE;
+gboolean            ImportPhotos = FALSE;
 static char       **remaining_args;
 static const char  *program_argv0; /* argv[0] from main(); used as the command to restart the program */
 static gboolean     Restart = FALSE;
@@ -84,6 +83,26 @@ static const GOptionEntry options[] = {
 };
 
 
+static void
+open_browser_window (GFile *location)
+{
+	GtkWidget *window;
+
+	window = gth_browser_new (location);
+	if (! StartSlideshow)
+		gtk_window_present (GTK_WINDOW (window));
+}
+
+
+static void
+import_photos_from_location (GFile *location)
+{
+	GtkWidget *window;
+
+	window = gth_browser_new (NULL);
+	gth_hook_invoke ("import-photos", window, location, NULL);
+}
+
 
 static void
 migrate_data (void)
@@ -92,12 +111,16 @@ migrate_data (void)
 }
 
 
+/* -- session management -- */
+
+
 #ifdef USE_SMCLIENT
 
+
 static void
-gth_save_state (EggSMClient *client,
-		GKeyFile    *state,
-		gpointer     user_data)
+client_save_state (EggSMClient *client,
+		   GKeyFile    *state,
+		   gpointer     user_data)
 {
 	const char *argv[2] = { NULL };
 	GList      *scan;
@@ -108,7 +131,7 @@ gth_save_state (EggSMClient *client,
 	egg_sm_client_set_restart_command (client, 1, argv);
 
 	i = 0;
-	for (scan = gth_window_get_window_list (); scan; scan = scan->next) {
+	for (scan = gtk_application_get_windows (Main_Application); scan; scan = scan->next) {
 		GtkWidget   *window = scan->data;
 		GFile       *location;
 		char        *key;
@@ -187,7 +210,7 @@ static void
 client_quit_requested_cb (EggSMClient *client,
 			  gpointer     data)
 {
-	client_window = gth_window_get_window_list ();
+	client_window = gtk_application_get_windows (Main_Application);
 	check_whether_to_save (client);
 }
 
@@ -201,28 +224,7 @@ client_quit_cb (EggSMClient *client,
 
 
 static void
-gth_session_manager_init (void)
-{
-	EggSMClient *client = NULL;
-
-	client = egg_sm_client_get ();
-	g_signal_connect (client,
-			  "save_state",
-			  G_CALLBACK (gth_save_state),
-			  NULL);
-	g_signal_connect (client,
-			  "quit_requested",
-			  G_CALLBACK (client_quit_requested_cb),
-			  NULL);
-	g_signal_connect (client,
-			  "quit",
-			  G_CALLBACK (client_quit_cb),
-			  NULL);
-}
-
-
-static void
-gth_restore_session (EggSMClient *client)
+restore_session (EggSMClient *client)
 {
 	GKeyFile *state = NULL;
 	guint     i;
@@ -256,50 +258,88 @@ gth_restore_session (EggSMClient *client)
 #endif
 
 
+/* -- main application -- */
+
+
+typedef GtkApplication      GthApplication;
+typedef GtkApplicationClass GthApplicationClass;
+
+static gpointer gth_application_parent_class;
+
+
+G_DEFINE_TYPE (GthApplication, gth_application, GTK_TYPE_APPLICATION)
+
+
 static void
-gthumb_application_activate_cb (GApplication *application,
-				gpointer      user_data)
+gth_application_finalize (GObject *object)
 {
-	GList     *list;
-	GtkWidget *window;
+        G_OBJECT_CLASS (gth_application_parent_class)->finalize (object);
+}
 
-	list = gtk_application_get_windows (GTK_APPLICATION (application));
-	if (list != NULL) {
-		window = gth_window_get_current_window ();
-		gtk_window_present (GTK_WINDOW (window));
-	}
-	else {
-		window = gth_browser_new (NULL);
-		gtk_widget_show (window);
-	}
+
+static void
+gth_application_init (GthApplication *app)
+{
+#ifdef GDK_WINDOWING_X11
+	egg_set_desktop_file (GTHUMB_APPLICATIONS_DIR "/gthumb.desktop");
+#else
+	/* manually set name and icon */
+	g_set_application_name (_("gThumb"));
+	gtk_window_set_default_icon_name ("gthumb");
+#endif
 }
 
 
 static void
-open_browser_window (GFile *location)
+gth_application_startup (GApplication *application)
 {
-	GtkWidget *window;
+	G_APPLICATION_CLASS (gth_application_parent_class)->startup (application);
 
-	window = gth_browser_new (location);
-	if (! StartSlideshow)
-		gtk_window_present (GTK_WINDOW (window));
+	gth_pref_initialize ();
+	migrate_data ();
+	gth_main_initialize ();
+	gth_main_register_default_hooks ();
+	gth_main_register_file_source (GTH_TYPE_FILE_SOURCE_VFS);
+	gth_main_register_default_sort_types ();
+	gth_main_register_default_tests ();
+	gth_main_register_default_types ();
+	gth_main_register_default_metadata ();
+	gth_main_activate_extensions ();
+	gth_hook_invoke ("initialize", NULL);
 }
 
 
-static void
-import_photos_from_location (GFile *location)
+static GOptionContext *
+gth_application_create_option_context (gboolean is_local)
 {
-	GtkWidget *window;
+	GOptionContext *context;
 
-	window = gth_browser_new (NULL);
-	gth_hook_invoke ("import-photos", window, location, NULL);
+	context = g_option_context_new (N_("- Image browser and viewer"));
+	g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
+	g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE);
+	if (is_local)
+		return context;
+
+	g_option_context_add_group (context, gtk_get_option_group (TRUE));
+#ifdef USE_SMCLIENT
+	g_option_context_add_group (context, egg_sm_client_get_option_group ());
+#endif
+#ifdef HAVE_GSTREAMER
+	g_option_context_add_group (context, gst_init_get_option_group ());
+#endif
+#ifdef HAVE_CLUTTER
+	g_option_context_add_group (context, cogl_get_option_group ());
+	g_option_context_add_group (context, clutter_get_option_group_without_init ());
+	g_option_context_add_group (context, gtk_clutter_get_option_group ());
+#endif
+
+	return context;
 }
 
 
 static int
-gthumb_application_command_line_cb (GApplication            *application,
-				    GApplicationCommandLine *command_line,
-				    gpointer                 user_data)
+gth_application_command_line (GApplication            *application,
+                              GApplicationCommandLine *command_line)
 {
 	char           **argv;
 	int              argc;
@@ -314,33 +354,44 @@ gthumb_application_command_line_cb (GApplication            *application,
 
 	argv = g_application_command_line_get_arguments (command_line, &argc);
 
-	/* command line options */
+	/* parse command line options */
 
-	context = g_option_context_new (N_("- Image browser and viewer"));
-	g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
-	g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE);
-	g_option_context_add_group (context, gtk_get_option_group (TRUE));
-#ifdef USE_SMCLIENT
-	g_option_context_add_group (context, egg_sm_client_get_option_group ());
-#endif
-#ifdef HAVE_CLUTTER
-	g_option_context_add_group (context, cogl_get_option_group ());
-	g_option_context_add_group (context, clutter_get_option_group_without_init ());
-#endif
+	context = gth_application_create_option_context (FALSE);
 	if (! g_option_context_parse (context, &argc, &argv, &error)) {
 		g_critical ("Failed to parse arguments: %s", error->message);
 		g_error_free (error);
 		g_option_context_free (context);
 		return EXIT_FAILURE;
 	}
+	g_option_context_free (context);
 
-	if (version) {
-		g_printf ("%s %s, Copyright  2001-2010 Free Software Foundation, Inc.\n", PACKAGE_NAME, PACKAGE_VERSION);
-		g_option_context_free (context);
-		return 0;
+	/* restore the session */
+
+#ifdef USE_SMCLIENT
+	{
+		EggSMClient *client;
+
+		client = egg_sm_client_get ();
+		g_signal_connect (client,
+				  "save_state",
+				  G_CALLBACK (client_save_state),
+				  NULL);
+		g_signal_connect (client,
+				  "quit_requested",
+				  G_CALLBACK (client_quit_requested_cb),
+				  NULL);
+		g_signal_connect (client,
+				  "quit",
+				  G_CALLBACK (client_quit_cb),
+				  NULL);
+		if (egg_sm_client_is_resumed (client)) {
+			restore_session (client);
+			return 0;
+		}
 	}
+#endif
 
-	g_option_context_free (context);
+	/* exec the command line */
 
 	if (ImportPhotos) {
 		GFile *location = NULL;
@@ -348,6 +399,7 @@ gthumb_application_command_line_cb (GApplication            *application,
 		if (remaining_args != NULL)
 			location = g_file_new_for_commandline_arg (remaining_args[0]);
 		import_photos_from_location (location);
+		gdk_notify_startup_complete ();
 
 		return 0;
 	}
@@ -357,6 +409,7 @@ gthumb_application_command_line_cb (GApplication            *application,
 
 		location = g_file_new_for_uri (gth_pref_get_startup_location ());
 		open_browser_window (location);
+		gdk_notify_startup_complete ();
 
 		g_object_unref (location);
 
@@ -395,6 +448,8 @@ gthumb_application_command_line_cb (GApplication            *application,
 	for (scan = dirs; scan; scan = scan->next)
 		open_browser_window ((GFile *) scan->data);
 
+	gdk_notify_startup_complete ();
+
 	_g_object_list_unref (dirs);
 	_g_object_list_unref (files);
 
@@ -402,87 +457,102 @@ gthumb_application_command_line_cb (GApplication            *application,
 }
 
 
+static gboolean
+gth_application_local_command_line (GApplication   *application,
+                                    char         ***arguments,
+                                    int            *exit_status)
+{
+        char           **local_argv;
+        int              local_argc;
+        GOptionContext  *context;
+        GError          *error = NULL;
+        gboolean         handled_locally = FALSE;
+
+        local_argv = g_strdupv (*arguments);
+        local_argc = g_strv_length (local_argv);
+
+        *exit_status = 0;
+
+        context = gth_application_create_option_context (TRUE);
+        g_option_context_set_ignore_unknown_options (context, TRUE);
+	if (! g_option_context_parse (context, &local_argc, &local_argv, &error)) {
+		*exit_status = EXIT_FAILURE;
+		g_critical ("Failed to parse arguments: %s", error->message);
+                g_clear_error (&error);
+                handled_locally = TRUE;
+	}
+
+	if (version) {
+		g_printf ("%s %s, Copyright  2001-2010 Free Software Foundation, Inc.\n", PACKAGE_NAME, PACKAGE_VERSION);
+		handled_locally = TRUE;
+	}
+
+	g_option_context_free (context);
+        g_strfreev (local_argv);
+
+        return handled_locally;
+}
+
+
 static void
-gthumb_application_startup_cb (GApplication *application,
-			       gpointer      user_data)
+gth_application_class_init (GthApplicationClass *klass)
 {
-#ifdef USE_SMCLIENT
-	EggSMClient *client = NULL;
+	GObjectClass      *object_class;
+	GApplicationClass *application_class;
 
-	gth_session_manager_init ();
-#endif
-	gth_pref_initialize ();
-	migrate_data ();
-	gth_main_initialize ();
-	gth_main_register_default_hooks ();
-	gth_main_register_file_source (GTH_TYPE_FILE_SOURCE_VFS);
-	gth_main_register_default_sort_types ();
-	gth_main_register_default_tests ();
-	gth_main_register_default_types ();
-	gth_main_register_default_metadata ();
-	gth_main_activate_extensions ();
-	gth_hook_invoke ("initialize", NULL);
+	gth_application_parent_class = g_type_class_peek_parent (klass);
 
-#ifdef USE_SMCLIENT
-	client = egg_sm_client_get ();
-	if (egg_sm_client_is_resumed (client))
-		gth_restore_session (client);
-#endif
+	object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = gth_application_finalize;
+
+	application_class = G_APPLICATION_CLASS (klass);
+	application_class->startup = gth_application_startup;
+	application_class->command_line = gth_application_command_line;
+	application_class->local_command_line = gth_application_local_command_line;
 }
 
 
-static GApplication *
-prepare_application (void)
+static GtkApplication *
+gth_application_new (void)
 {
-	GThumb_Application = gtk_application_new ("org.gnome.gthumb",
-						  G_APPLICATION_HANDLES_COMMAND_LINE);
-	g_signal_connect (GThumb_Application,
-			  "activate",
-			  G_CALLBACK (gthumb_application_activate_cb),
-			  NULL);
-	g_signal_connect (GThumb_Application,
-			  "command-line",
-			  G_CALLBACK (gthumb_application_command_line_cb),
-			  NULL);
-	g_signal_connect (GThumb_Application,
-			  "startup",
-			  G_CALLBACK (gthumb_application_startup_cb),
-			  NULL);
-	g_application_set_inactivity_timeout (G_APPLICATION (GThumb_Application), 10000);
-
-	return G_APPLICATION (GThumb_Application);
+        return g_object_new (gth_application_get_type (),
+                             "application-id", "org.gnome.Gthumb",
+                             "flags", 0,
+                             NULL);
 }
 
 
+/* -- main -- */
+
+
 int
 main (int argc, char *argv[])
 {
-	GApplication *app;
-	int           status;
-
-	if (! g_thread_supported ())
-		g_thread_init (NULL);
-
-#ifdef HAVE_CLUTTER
-	ClutterInitResult = gtk_clutter_init (NULL, NULL);
-#endif
+	int status;
 
 	program_argv0 = argv[0];
 
+	g_thread_init (NULL);
+	g_type_init ();
+
 	/* text domain */
 
-	bindtextdomain (GETTEXT_PACKAGE, GTHUMB_LOCALEDIR);
+	bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
 	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 	textdomain (GETTEXT_PACKAGE);
 
-	app = prepare_application ();
-	status = g_application_run (app, argc, argv);
-	if (! g_application_get_is_remote (app)) {
+	/* run the main application */
+
+	Main_Application = gth_application_new ();
+	status = g_application_run (G_APPLICATION (Main_Application), argc, argv);
+	if (! g_application_get_is_remote (G_APPLICATION (Main_Application))) {
 		gth_main_release ();
 		gth_pref_release ();
 	}
+	g_object_unref (Main_Application);
+	Main_Application = NULL;
 
-	g_object_unref (app);
+	/* restart if requested by the user */
 
 	if (Restart)
 		g_spawn_command_line_async (program_argv0, NULL);
@@ -497,7 +567,7 @@ gth_quit (gboolean restart)
 	GList *windows;
 	GList *scan;
 
-	windows = g_list_copy (gth_window_get_window_list ());
+	windows = g_list_copy (gtk_application_get_windows (Main_Application));
 	for (scan = windows; scan; scan = scan->next)
 		gth_window_close (GTH_WINDOW (scan->data));
 	g_list_free (windows);
diff --git a/gthumb/main.h b/gthumb/main.h
index 0f7c061..975a824 100644
--- a/gthumb/main.h
+++ b/gthumb/main.h
@@ -24,16 +24,11 @@
 
 G_BEGIN_DECLS
 
-extern gboolean NewWindow;
-extern gboolean StartInFullscreen;
-extern gboolean StartSlideshow;
-extern gboolean ImportPhotos;
-
-#ifdef HAVE_CLUTTER
-extern int ClutterInitResult;
-#endif
-
-extern GtkApplication *GThumb_Application;
+extern GtkApplication *Main_Application;
+extern gboolean        NewWindow;
+extern gboolean        StartInFullscreen;
+extern gboolean        StartSlideshow;
+extern gboolean        ImportPhotos;
 
 void gth_quit (gboolean restart);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]