[gnumeric] Use application properties instead of ugly dual-use global variable



commit 762ef290bafcf043bd2e82b14c6f799edae57380
Author: Morten Welinder <terra gnome org>
Date:   Tue May 15 09:15:25 2018 -0400

    Use application properties instead of ugly dual-use global variable

 src/application.c      |   74 ++++++++++++++++++++++++++++++++++++++++++-----
 src/application.h      |    3 ++
 src/libgnumeric.c      |    3 --
 src/libgnumeric.h      |    2 -
 src/main-application.c |   12 +++++--
 src/wbc-gtk-actions.c  |    4 +-
 6 files changed, 79 insertions(+), 19 deletions(-)
---
diff --git a/src/application.c b/src/application.c
index 13a87f2..cc05afe 100644
--- a/src/application.c
+++ b/src/application.c
@@ -38,8 +38,10 @@
 #define GNM_IS_APP(o)          (G_TYPE_CHECK_INSTANCE_TYPE((o), GNM_APP_TYPE))
 
 enum {
-       APPLICATION_PROP_0,
-       APPLICATION_PROP_FILE_HISTORY_LIST
+       PROP_0,
+       PROP_HISTORY_LIST,
+       PROP_SHUTTING_DOWN,
+       PROP_INITIAL_OPEN_COMPLETE
 };
 /* Signals */
 enum {
@@ -71,6 +73,9 @@ struct _GnmApp {
 
        GtkRecentManager *recent;
        gulong           recent_sig;
+
+       gboolean         shutting_down;
+       gboolean         initial_open_complete;
 };
 
 typedef struct {
@@ -723,7 +728,7 @@ cb_recent_changed (G_GNUC_UNUSED GtkRecentManager *recent, GnmApp *app)
 }
 
 static void
-gnumeric_application_finalize (GObject *obj)
+gnm_app_finalize (GObject *obj)
 {
        GnmApp *application = GNM_APP (obj);
 
@@ -739,34 +744,75 @@ gnumeric_application_finalize (GObject *obj)
 }
 
 static void
-gnumeric_application_get_property (GObject *obj, guint param_id,
+gnm_app_get_property (GObject *obj, guint param_id,
                                   GValue *value, GParamSpec *pspec)
 {
 #if 0
        GnmApp *application = GNM_APP (obj);
 #endif
+
        switch (param_id) {
-       case APPLICATION_PROP_FILE_HISTORY_LIST:
+       case PROP_HISTORY_LIST:
                g_value_set_pointer (value, gnm_app_history_get_list (G_MAXINT));
                break;
+       case PROP_SHUTTING_DOWN:
+               g_value_set_boolean (value, gnm_app_shutting_down ());
+               break;
+       case PROP_INITIAL_OPEN_COMPLETE:
+               g_value_set_boolean (value, gnm_app_initial_open_complete ());
+               break;
        default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
                 break;
        }
 }
 
 static void
+gnm_app_set_property (GObject *object, guint property_id,
+                     GValue const *value, GParamSpec *pspec)
+{
+       GnmApp *app = (GnmApp *)object;
+
+       switch (property_id) {
+       case PROP_SHUTTING_DOWN:
+               app->shutting_down = g_value_get_boolean (value);
+               break;
+       case PROP_INITIAL_OPEN_COMPLETE:
+               app->initial_open_complete = g_value_get_boolean (value);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static void
 gnm_app_class_init (GObjectClass *gobject_klass)
 {
        parent_klass = g_type_class_peek_parent (gobject_klass);
 
        /* Object class method overrides */
-       gobject_klass->finalize = gnumeric_application_finalize;
-       gobject_klass->get_property = gnumeric_application_get_property;
-       g_object_class_install_property (gobject_klass, APPLICATION_PROP_FILE_HISTORY_LIST,
+       gobject_klass->finalize = gnm_app_finalize;
+       gobject_klass->get_property = gnm_app_get_property;
+       gobject_klass->set_property = gnm_app_set_property;
+
+       g_object_class_install_property (gobject_klass, PROP_HISTORY_LIST,
                g_param_spec_pointer ("file-history-list",
                                      P_("File History List"),
                                      P_("A list of filenames that have been read recently"),
                                      GSF_PARAM_STATIC | G_PARAM_READABLE));
+       g_object_class_install_property (gobject_klass, PROP_SHUTTING_DOWN,
+               g_param_spec_boolean ("shutting-down",
+                                     P_("Shutting Down"),
+                                     P_("In the process of shutting down?"),
+                                     FALSE,
+                                     GSF_PARAM_STATIC | G_PARAM_READWRITE));
+       g_object_class_install_property (gobject_klass, PROP_INITIAL_OPEN_COMPLETE,
+               g_param_spec_boolean ("initial-open-complete",
+                                     P_("Initial Open Complete"),
+                                     P_("All command-line files open?"),
+                                     FALSE,
+                                     GSF_PARAM_STATIC | G_PARAM_READWRITE));
+
 
        signals[WORKBOOK_ADDED] = g_signal_new ("workbook_added",
                GNM_APP_TYPE,
@@ -1074,3 +1120,15 @@ gnm_app_recalc_clear_caches (void)
 {
        g_signal_emit_by_name (gnm_app_get_app (), "recalc-clear-caches");
 }
+
+gboolean
+gnm_app_shutting_down (void)
+{
+       return app->shutting_down;
+}
+
+gboolean
+gnm_app_initial_open_complete (void)
+{
+       return app->initial_open_complete;
+}
diff --git a/src/application.h b/src/application.h
index af1d16b..368f7a1 100644
--- a/src/application.h
+++ b/src/application.h
@@ -13,6 +13,9 @@ typedef gboolean (*GnmWbIterFunc) (Workbook *wb, gpointer data);
 GType       gnm_app_get_type (void);
 GObject     *gnm_app_get_app (void);
 
+gboolean     gnm_app_shutting_down (void);
+gboolean     gnm_app_initial_open_complete (void);
+
 /* List of active workbooks */
 void         gnm_app_workbook_list_add     (Workbook *wb);
 void         gnm_app_workbook_list_remove  (Workbook *wb);
diff --git a/src/libgnumeric.c b/src/libgnumeric.c
index 1437d80..950cb10 100644
--- a/src/libgnumeric.c
+++ b/src/libgnumeric.c
@@ -128,9 +128,6 @@ fake_gtk_icon_theme_add_resource_path (GtkIconTheme G_GNUC_UNUSED *theme,
 
 #endif
 
-/* TODO : get rid of this monstrosity */
-gboolean initial_workbook_open_complete = FALSE;
-
 static gboolean param_show_version = FALSE;
 static char *param_lib_dir  = NULL;
 static char *param_data_dir = NULL;
diff --git a/src/libgnumeric.h b/src/libgnumeric.h
index 06a3d98..42cd7d4 100644
--- a/src/libgnumeric.h
+++ b/src/libgnumeric.h
@@ -25,8 +25,6 @@ void       gnm_shutdown           (void);
 
 GOptionGroup *gnm_get_option_group (void);
 
-GNM_VAR_DECL gboolean  initial_workbook_open_complete;
-
 G_END_DECLS
 
 #endif /* _GNM_LIBGNUMERIC_H_ */
diff --git a/src/main-application.c b/src/main-application.c
index 86ec06d..02c370d 100644
--- a/src/main-application.c
+++ b/src/main-application.c
@@ -88,7 +88,7 @@ handle_paint_events (void)
 {
        /* FIXME: we need to mask input events correctly here */
        /* Show something coherent */
-       while (gtk_events_pending () && !initial_workbook_open_complete)
+       while (gtk_events_pending () && !gnm_app_shutting_down ())
                gtk_main_iteration_do (FALSE);
 }
 
@@ -261,7 +261,7 @@ main (int argc, char const **argv)
 
                N = g_strv_length (startup_files);
                go_io_context_set_num_files (ioc, N);
-               for (i = 0; i < N && !initial_workbook_open_complete; i++) {
+               for (i = 0; i < N && !gnm_app_shutting_down (); i++) {
                        char *uri = go_shell_arg_to_uri (startup_files[i]);
 
                        if (uri == NULL) {
@@ -314,11 +314,13 @@ main (int argc, char const **argv)
                any_error = FALSE;
 
        // If we were intentionally short circuited exit now
-       if (any_error || initial_workbook_open_complete) {
+       if (any_error || gnm_app_shutting_down ()) {
                g_object_unref (ioc);
                g_slist_foreach (wbcgs_to_kill, (GFunc)cb_kill_wbcg, NULL);
        } else {
-               initial_workbook_open_complete = TRUE;
+               g_object_set (gnm_app_get_app (),
+                             "initial-open-complete", TRUE, NULL);
+
                if (!opened_workbook) {
                        gint n_of_sheets = gnm_conf_get_core_workbook_n_sheet ();
                        wbc_gtk_new (NULL,
@@ -343,6 +345,8 @@ main (int argc, char const **argv)
                gtk_main ();
        }
 
+       g_object_set (gnm_app_get_app (), "shutting-down", TRUE, NULL);
+
        g_slist_free (wbcgs_to_kill);
        gnumeric_arg_shutdown ();
        store_plugin_state ();
diff --git a/src/wbc-gtk-actions.c b/src/wbc-gtk-actions.c
index 884a3f6..b4876b5 100644
--- a/src/wbc-gtk-actions.c
+++ b/src/wbc-gtk-actions.c
@@ -287,8 +287,8 @@ static GNM_ACTION_DEF (cb_file_close)               { wbc_gtk_close (wbcg); }
 static GNM_ACTION_DEF (cb_file_quit)
 {
        /* If we are still loading initial files, short circuit */
-       if (!initial_workbook_open_complete) {
-               initial_workbook_open_complete = TRUE;
+       if (!gnm_app_initial_open_complete ()) {
+               g_object_set (gnm_app_get_app (), "shutting-down", TRUE, NULL);
                return;
        }
 


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