[easytag/wip/application-window: 79/112] Move some GApplication handlers to EtApplication
- From: David King <davidk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [easytag/wip/application-window: 79/112] Move some GApplication handlers to EtApplication
- Date: Wed, 27 Aug 2014 21:04:09 +0000 (UTC)
commit 3c128eebec84a905c77735e698af699242d00524
Author: David King <amigadave amigadave com>
Date: Tue Aug 5 16:38:06 2014 +0100
Move some GApplication handlers to EtApplication
src/application.c | 376 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
src/application.h | 4 +-
src/easytag.c | 333 -----------------------------------------------
3 files changed, 372 insertions(+), 341 deletions(-)
---
diff --git a/src/application.c b/src/application.c
index 408cd5c..0ca3711 100644
--- a/src/application.c
+++ b/src/application.c
@@ -21,14 +21,25 @@
#include "application.h"
#include "about.h"
+#include "bar.h"
#include "charset.h"
#include "easytag.h"
+#include "log.h"
+#include "misc.h"
#include <glib/gi18n.h>
#include <stdlib.h>
+/* TODO: Use G_DEFINE_TYPE_WITH_PRIVATE. */
G_DEFINE_TYPE (EtApplication, et_application, GTK_TYPE_APPLICATION)
+#define et_application_get_instance_private(app) (app->priv)
+
+struct _EtApplicationPrivate
+{
+ guint idle_handler;
+};
+
static const GOptionEntry entries[] =
{
{ "version", 'v', 0, G_OPTION_ARG_NONE, NULL,
@@ -80,7 +91,189 @@ static const GActionEntry actions[] =
};
/*
- * et_local_command_line:
+ * Load the default directory when the user interface is completely displayed
+ * to avoid bad visualization effect at startup.
+ */
+static gboolean
+on_idle_init (EtApplication *self)
+{
+ EtApplicationPrivate *priv;
+
+ priv = et_application_get_instance_private (self);
+
+ ET_Core_Free ();
+ ET_Core_Initialize ();
+
+ if (g_settings_get_boolean (MainSettings, "scan-startup"))
+ {
+ g_action_group_activate_action (G_ACTION_GROUP (MainWindow), "scanner",
+ NULL);
+ }
+
+ if (INIT_DIRECTORY)
+ {
+ et_application_window_select_dir (ET_APPLICATION_WINDOW (MainWindow),
+ INIT_DIRECTORY);
+ }
+ else
+ {
+ Statusbar_Message(_("Select a directory to browse"),FALSE);
+ g_action_group_activate_action (G_ACTION_GROUP (MainWindow),
+ "go-default", NULL);
+ }
+
+ /* Set sensitivity of buttons if the default directory is invalid. */
+ et_application_window_update_actions (ET_APPLICATION_WINDOW (MainWindow));
+
+ priv->idle_handler = 0;
+
+ return G_SOURCE_REMOVE;
+}
+
+/*
+ * common_init:
+ * @application: the application
+ *
+ * Create and show the main window. Common to all actions which may occur after
+ * startup, such as "activate" and "open".
+ */
+static void
+common_init (EtApplication *self)
+{
+ EtApplicationPrivate *priv;
+ gboolean settings_warning;
+ EtApplicationWindow *window;
+
+ priv = et_application_get_instance_private (self);
+
+ /* Create all config files. */
+ settings_warning = !Setting_Create_Files ();
+
+ /* Load Config */
+ Init_Config_Variables ();
+
+ /* Initialization */
+ ET_Core_Create ();
+ Main_Stop_Button_Pressed = FALSE;
+ Init_Mouse_Cursor ();
+
+ /* The main window */
+ window = et_application_window_new (GTK_APPLICATION (self));
+ MainWindow = GTK_WIDGET (window);
+
+ gtk_widget_show (MainWindow);
+
+ /* Starting messages */
+ Log_Print (LOG_OK, _("Starting EasyTAG version %s (PID: %d)…"),
+ PACKAGE_VERSION, getpid ());
+#ifdef G_OS_WIN32
+ if (g_getenv("EASYTAGLANG"))
+ Log_Print(LOG_OK,_("Variable EASYTAGLANG defined. Setting locale: '%s'"),g_getenv("EASYTAGLANG"));
+ else
+ Log_Print(LOG_OK,_("Setting locale: '%s'"),g_getenv("LANG"));
+#endif /* G_OS_WIN32 */
+
+ if (get_locale ())
+ Log_Print (LOG_OK,
+ _("Currently using locale '%s' (and eventually '%s')"),
+ get_locale (), get_encoding_from_locale (get_locale ()));
+
+ if (settings_warning)
+ {
+ Log_Print (LOG_WARNING, _("Unable to create setting directories"));
+ }
+
+ /* Load the default dir when the UI is created and displayed
+ * to the screen and open also the scanner window */
+ priv->idle_handler = g_idle_add ((GSourceFunc)on_idle_init, self);
+ g_source_set_name_by_id (priv->idle_handler, "Init idle function");
+}
+
+/*
+ * check_for_hidden_path_in_tree:
+ * @arg: the path to check
+ *
+ * Recursively check for a hidden path in the directory tree given by @arg. If
+ * a hidden path is found, set browse-show-hidden to TRUE.
+ */
+static void
+check_for_hidden_path_in_tree (GFile *arg)
+{
+ GFile *file = NULL;
+ GFile *parent;
+ GFileInfo *info;
+ GError *err = NULL;
+
+ /* Not really the parent until an iteration through the loop below. */
+ parent = g_file_dup (arg);
+
+ do
+ {
+ info = g_file_query_info (parent,
+ G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN,
+ G_FILE_QUERY_INFO_NONE, NULL, &err);
+
+ if (info == NULL)
+ {
+ g_message ("Error querying file information (%s)", err->message);
+ g_clear_error (&err);
+
+ if (file)
+ {
+ g_clear_object (&file);
+ }
+ g_object_unref (parent);
+ break;
+ }
+ else
+ {
+ if (g_file_info_get_is_hidden (info))
+ {
+ g_settings_set_boolean (MainSettings, "browse-show-hidden",
+ TRUE);
+ }
+ }
+
+ g_object_unref (info);
+
+ if (file)
+ {
+ g_clear_object (&file);
+ }
+
+ file = parent;
+ }
+ while ((parent = g_file_get_parent (file)) != NULL);
+
+ g_clear_object (&file);
+}
+
+/*
+ * et_application_activate:
+ * @application: the application
+ *
+ * Handle the application being activated, which occurs after startup and if
+ * no files are opened.
+ */
+static void
+et_application_activate (GApplication *application)
+{
+ GList *windows;
+
+ windows = gtk_application_get_windows (GTK_APPLICATION (application));
+
+ if (windows != NULL)
+ {
+ gtk_window_present (windows->data);
+ }
+ else
+ {
+ common_init (ET_APPLICATION (application));
+ }
+}
+
+/*
+ * et_application_local_command_line:
* @application: the application
* @arguments: pointer to the argument string array
* @exit_status: pointer to the returned exit status
@@ -91,8 +284,9 @@ static const GActionEntry actions[] =
* handled in the local instance
*/
static gboolean
-et_local_command_line (GApplication *application, gchar **arguments[],
- gint *exit_status)
+et_application_local_command_line (GApplication *application,
+ gchar **arguments[],
+ gint *exit_status)
{
GError *error = NULL;
guint n_args;
@@ -173,6 +367,144 @@ et_local_command_line (GApplication *application, gchar **arguments[],
return TRUE;
}
+/*
+ * et_application_open:
+ * @application: the application
+ * @files: array of files to open
+ * @n_files: the number of files
+ * @hint: hint of method to open files, currently empty
+ *
+ * Handle the files passed to the primary instance.
+ *
+ * Returns: the exit status to be passed to the calling process
+ */
+static void
+et_application_open (GApplication *self,
+ GFile **files,
+ gint n_files,
+ const gchar *hint)
+{
+ GList *windows;
+ gboolean activated;
+ GFile *arg;
+ GFile *parent;
+ GFileInfo *info;
+ GError *err = NULL;
+ GFileType type;
+ gchar *path;
+ gchar *path_utf8;
+
+ windows = gtk_application_get_windows (GTK_APPLICATION (self));
+ activated = windows ? TRUE : FALSE;
+
+ /* Only take the first file; ignore the rest. */
+ arg = files[0];
+
+ check_for_hidden_path_in_tree (arg);
+
+ path = g_file_get_path (arg);
+ path_utf8 = filename_to_display (path);
+ info = g_file_query_info (arg, G_FILE_ATTRIBUTE_STANDARD_TYPE,
+ G_FILE_QUERY_INFO_NONE, NULL, &err);
+
+ if (info == NULL)
+ {
+ if (activated)
+ {
+ Log_Print (LOG_ERROR, _("Error while querying information for file: '%s' (%s)"),
+ path_utf8, err->message);
+
+ }
+ else
+ {
+ g_warning ("Error while querying information for file: '%s' (%s)",
+ path_utf8, err->message);
+ }
+
+ g_free (path);
+ g_free (path_utf8);
+ g_error_free (err);
+ return;
+ }
+
+ type = g_file_info_get_file_type (info);
+
+ switch (type)
+ {
+ case G_FILE_TYPE_DIRECTORY:
+ if (activated)
+ {
+ et_application_window_select_dir (windows->data, path);
+ g_free (path);
+ }
+ else
+ {
+ INIT_DIRECTORY = path;
+ }
+
+ g_free (path_utf8);
+ g_object_unref (info);
+ break;
+ case G_FILE_TYPE_REGULAR:
+ /* When given a file, load the parent directory. */
+ parent = g_file_get_parent (arg);
+
+ if (parent)
+ {
+ g_free (path_utf8);
+ g_free (path);
+
+ if (activated)
+ {
+ gchar *parent_path;
+
+ parent_path = g_file_get_path (arg);
+ et_application_window_select_dir (windows->data,
+ parent_path);
+
+ g_free (parent_path);
+ }
+ else
+ {
+ INIT_DIRECTORY = g_file_get_path (parent);
+ }
+
+ g_object_unref (parent);
+ g_object_unref (info);
+ break;
+ }
+ /* Fall through on error. */
+ default:
+ Log_Print (LOG_WARNING, _("Cannot open path '%s'"), path_utf8);
+ g_free (path);
+ g_free (path_utf8);
+ return;
+ break;
+ }
+
+ if (!activated)
+ {
+ common_init (ET_APPLICATION (self));
+ }
+}
+
+/*
+ * et_application_shutdown:
+ * @application: the application
+ * @user_data: user data set when the signal handler was connected
+ *
+ * Handle the application being shutdown, which occurs after the main loop has
+ * exited and before returning from g_application_run().
+ */
+static void
+et_application_shutdown (GApplication *application)
+{
+ ET_Core_Destroy ();
+ Charset_Insert_Locales_Destroy ();
+
+ G_APPLICATION_CLASS (et_application_parent_class)->shutdown (application);
+}
+
static void
et_application_startup (GApplication *application)
{
@@ -207,22 +539,52 @@ et_application_startup (GApplication *application)
}
static void
+et_application_dispose (GObject *object)
+{
+ EtApplication *self;
+ EtApplicationPrivate *priv;
+
+ self = ET_APPLICATION (object);
+ priv = et_application_get_instance_private (self);
+
+ if (priv->idle_handler)
+ {
+ g_source_remove (priv->idle_handler);
+ priv->idle_handler = 0;
+ }
+}
+
+static void
et_application_finalize (GObject *object)
{
G_OBJECT_CLASS (et_application_parent_class)->finalize (object);
}
static void
-et_application_init (EtApplication *application)
+et_application_init (EtApplication *self)
{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, ET_TYPE_APPLICATION,
+ EtApplicationPrivate);
}
static void
et_application_class_init (EtApplicationClass *klass)
{
- G_OBJECT_CLASS (klass)->finalize = et_application_finalize;
- G_APPLICATION_CLASS (klass)->local_command_line = et_local_command_line;
- G_APPLICATION_CLASS (klass)->startup = et_application_startup;
+ GObjectClass *gobject_class;
+ GApplicationClass *gapplication_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gapplication_class = G_APPLICATION_CLASS (klass);
+
+ gobject_class->dispose = et_application_dispose;
+ gobject_class->finalize = et_application_finalize;
+ gapplication_class->activate = et_application_activate;
+ gapplication_class->local_command_line = et_application_local_command_line;
+ gapplication_class->open = et_application_open;
+ gapplication_class->shutdown = et_application_shutdown;
+ gapplication_class->startup = et_application_startup;
+
+ g_type_class_add_private (klass, sizeof (EtApplicationPrivate));
}
/*
diff --git a/src/application.h b/src/application.h
index 806fe4e..5195907 100644
--- a/src/application.h
+++ b/src/application.h
@@ -1,5 +1,5 @@
/* EasyTAG - tag editor for audio files
- * Copyright (C) 2013 David King <amigadave amigadave com>
+ * Copyright (C) 2013,2014 David King <amigadave amigadave com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -31,11 +31,13 @@ G_BEGIN_DECLS
typedef struct _EtApplication EtApplication;
typedef struct _EtApplicationClass EtApplicationClass;
+typedef struct _EtApplicationPrivate EtApplicationPrivate;
struct _EtApplication
{
/*< private >*/
GtkApplication parent_instance;
+ EtApplicationPrivate *priv;
};
struct _EtApplicationClass
diff --git a/src/easytag.c b/src/easytag.c
index 465abb6..6dafbf7 100644
--- a/src/easytag.c
+++ b/src/easytag.c
@@ -61,8 +61,6 @@
/****************
* Declarations *
****************/
-static guint idle_handler_id;
-
static GtkWidget *QuitRecursionWindow = NULL;
/* Used to force to hide the msgbox when saving tag */
@@ -89,7 +87,6 @@ static gint Save_Selected_Files_With_Answer (gboolean force_saving_files);
static gint Save_List_Of_Files (GList *etfilelist,
gboolean force_saving_files);
-static gboolean Init_Load_Default_Dir (void);
static void EasyTAG_Exit (void);
static gboolean et_rename_file (const char *old_filepath,
const char *new_filepath, GError **error);
@@ -101,293 +98,6 @@ static void Destroy_Quit_Recursion_Function_Window (void);
static void et_on_quit_recursion_response (GtkDialog *dialog, gint response_id,
gpointer user_data);
-/*
- * common_init:
- * @application: the application
- *
- * Create and show the main window. Common to all actions which may occur after
- * startup, such as "activate" and "open".
- */
-static void
-common_init (GApplication *application)
-{
- gboolean settings_warning;
- EtApplicationWindow *window;
-
- /* Create all config files. */
- settings_warning = !Setting_Create_Files ();
-
- /* Load Config */
- Init_Config_Variables();
- /* Display_Config(); // <- for debugging */
-
- /* Initialization */
- ET_Core_Create();
- Main_Stop_Button_Pressed = FALSE;
- Init_Mouse_Cursor();
-
- /* The main window */
- window = et_application_window_new (GTK_APPLICATION (application));
- MainWindow = GTK_WIDGET (window);
-
- gtk_widget_show (MainWindow);
-
- /* Starting messages */
- Log_Print(LOG_OK,_("Starting EasyTAG version %s (PID: %d)…"),PACKAGE_VERSION,getpid());
-#ifdef ENABLE_MP3
- Log_Print(LOG_OK,_("Using libid3tag version %s"), ID3_VERSION);
-#endif
-#if defined ENABLE_MP3 && defined ENABLE_ID3LIB
- Log_Print (LOG_OK, _("Using id3lib version %d.%d.%d"), ID3LIB_MAJOR_VERSION,
- ID3LIB_MINOR_VERSION, ID3LIB_PATCH_VERSION);
-#endif
-
-#ifdef G_OS_WIN32
- if (g_getenv("EASYTAGLANG"))
- Log_Print(LOG_OK,_("Variable EASYTAGLANG defined. Setting locale: '%s'"),g_getenv("EASYTAGLANG"));
- else
- Log_Print(LOG_OK,_("Setting locale: '%s'"),g_getenv("LANG"));
-#endif /* G_OS_WIN32 */
-
- if (get_locale())
- Log_Print (LOG_OK,
- _("Currently using locale '%s' (and eventually '%s')"),
- get_locale (), get_encoding_from_locale (get_locale ()));
-
- if (settings_warning)
- {
- Log_Print (LOG_WARNING, _("Unable to create setting directories"));
- }
-
- /* Minimised window icon */
- gtk_widget_realize(MainWindow);
-
- /* Load the default dir when the UI is created and displayed
- * to the screen and open also the scanner window */
- idle_handler_id = g_idle_add ((GSourceFunc)Init_Load_Default_Dir, NULL);
- g_source_set_name_by_id (idle_handler_id, "Init idle function");
-}
-
-/*
- * check_for_hidden_path_in_tree:
- * @arg: the path to check
- *
- * Recursively check for a hidden path in the directory tree given by @arg. If
- * a hidden path is found, set browse-show-hidden to TRUE.
- */
-static void
-check_for_hidden_path_in_tree (GFile *arg)
-{
- GFile *file = NULL;
- GFile *parent;
- GFileInfo *info;
- GError *err = NULL;
-
- /* Not really the parent until an iteration through the loop below. */
- parent = g_file_dup (arg);
-
- do
- {
- info = g_file_query_info (parent,
- G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN,
- G_FILE_QUERY_INFO_NONE, NULL, &err);
-
- if (info == NULL)
- {
- g_message ("Error querying file information (%s)", err->message);
- g_clear_error (&err);
-
- if (file)
- {
- g_clear_object (&file);
- }
- g_object_unref (parent);
- break;
- }
- else
- {
- if (g_file_info_get_is_hidden (info))
- {
- g_settings_set_boolean (MainSettings, "browse-show-hidden",
- TRUE);
- }
- }
-
- g_object_unref (info);
-
- if (file)
- {
- g_clear_object (&file);
- }
-
- file = parent;
- }
- while ((parent = g_file_get_parent (file)) != NULL);
-
- g_clear_object (&file);
-}
-
-/*
- * on_application_open:
- * @application: the application
- * @files: array of files to open
- * @n_files: the number of files
- * @hint: hint of method to open files, currently empty
- * @user_data: user data set when the signal handler was connected
- *
- * Handle the files passed to the primary instance. The local instance
- * arguments are handled in EtApplication.
- *
- * Returns: the exit status to be passed to the calling process
- */
-static void
-on_application_open (GApplication *application, GFile **files, gint n_files,
- gchar *hint, gpointer user_data)
-{
- GList *windows;
- gboolean activated;
- GFile *arg;
- GFile *parent;
- GFileInfo *info;
- GError *err = NULL;
- GFileType type;
- gchar *path;
- gchar *path_utf8;
-
- windows = gtk_application_get_windows (GTK_APPLICATION (application));
- activated = windows ? TRUE : FALSE;
-
- /* Only take the first file; ignore the rest. */
- arg = files[0];
-
- check_for_hidden_path_in_tree (arg);
-
- path = g_file_get_path (arg);
- path_utf8 = filename_to_display (path);
- info = g_file_query_info (arg, G_FILE_ATTRIBUTE_STANDARD_TYPE,
- G_FILE_QUERY_INFO_NONE, NULL, &err);
-
- if (info == NULL)
- {
- if (activated)
- {
- Log_Print (LOG_ERROR, _("Error while querying information for file: '%s' (%s)"),
- path_utf8, err->message);
-
- }
- else
- {
- g_warning ("Error while querying information for file: '%s' (%s)",
- path_utf8, err->message);
- }
-
- g_free (path);
- g_free (path_utf8);
- g_error_free (err);
- return;
- }
-
- type = g_file_info_get_file_type (info);
-
- switch (type)
- {
- case G_FILE_TYPE_DIRECTORY:
- if (activated)
- {
- et_application_window_select_dir (windows->data, path);
- g_free (path);
- }
- else
- {
- INIT_DIRECTORY = path;
- }
-
- g_free (path_utf8);
- g_object_unref (info);
- break;
- case G_FILE_TYPE_REGULAR:
- /* When given a file, load the parent directory. */
- parent = g_file_get_parent (arg);
-
- if (parent)
- {
- g_free (path_utf8);
- g_free (path);
-
- if (activated)
- {
- gchar *parent_path;
-
- parent_path = g_file_get_path (arg);
- et_application_window_select_dir (windows->data,
- parent_path);
-
- g_free (parent_path);
- }
- else
- {
- INIT_DIRECTORY = g_file_get_path (parent);
- }
-
- g_object_unref (parent);
- g_object_unref (info);
- break;
- }
- /* Fall through on error. */
- default:
- Log_Print (LOG_WARNING, _("Cannot open path '%s'"), path_utf8);
- g_free (path);
- g_free (path_utf8);
- return;
- break;
- }
-
- if (!activated)
- {
- common_init (application);
- }
-}
-
-/*
- * on_application_activate:
- * @application: the application
- * @user_data: user data set when the signal handler was connected
- *
- * Handle the application being activated, which occurs after startup and if
- * no files are opened.
- */
-static void
-on_application_activate (GApplication *application, gpointer user_data)
-{
- GList *windows;
-
- windows = gtk_application_get_windows (GTK_APPLICATION (application));
-
- if (windows != NULL)
- {
- gtk_window_present (windows->data);
- }
- else
- {
- common_init (application);
- }
-}
-
-/*
- * on_application_shutdown:
- * @application: the application
- * @user_data: user data set when the signal handler was connected
- *
- * Handle the application being shutdown, which occurs after the main loop has
- * exited and before returning from g_application_run().
- */
-static void
-on_application_shutdown (GApplication *application, gpointer user_data)
-{
- ET_Core_Destroy ();
- Charset_Insert_Locales_Destroy ();
-}
-
/********
* Main *
********/
@@ -409,12 +119,6 @@ int main (int argc, char *argv[])
#endif /* !GLIB_CHECK_VERSION (2, 35, 1) */
application = et_application_new ();
- g_signal_connect (application, "open", G_CALLBACK (on_application_open),
- NULL);
- g_signal_connect (application, "activate",
- G_CALLBACK (on_application_activate), NULL);
- g_signal_connect (application, "shutdown",
- G_CALLBACK (on_application_shutdown), NULL);
status = g_application_run (G_APPLICATION (application), argc, argv);
g_object_unref (application);
@@ -1527,43 +1231,6 @@ void Action_Main_Stop_Button_Pressed (void)
}
/*
- * Load the default directory when the user interface is completely displayed
- * to avoid bad visualization effect at startup.
- */
-static gboolean
-Init_Load_Default_Dir (void)
-{
- //ETCore->ETFileList = NULL;
- ET_Core_Free();
- ET_Core_Initialize();
-
- if (g_settings_get_boolean (MainSettings, "scan-startup"))
- {
- g_action_group_activate_action (G_ACTION_GROUP (MainWindow), "scanner",
- NULL);
- }
-
- if (INIT_DIRECTORY)
- {
- et_application_window_select_dir (ET_APPLICATION_WINDOW (MainWindow),
- INIT_DIRECTORY);
- }
- else
- {
- Statusbar_Message(_("Select a directory to browse"),FALSE);
- g_action_group_activate_action (G_ACTION_GROUP (MainWindow),
- "go-default", NULL);
- }
-
- /* Set sensitivity of buttons if the default directory is invalid. */
- et_application_window_update_actions (ET_APPLICATION_WINDOW (MainWindow));
-
- return G_SOURCE_REMOVE;
-}
-
-
-
-/*
* Exit the program
*/
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]