[yelp] [yelp-application] Move global actions (cursor, font) into YelpApplication



commit 1a98a06ecb3b63577a81a78c74f5cd2a7c6a76b9
Author: Shaun McCance <shaunm gnome org>
Date:   Fri Apr 23 15:20:36 2010 -0500

    [yelp-application] Move global actions (cursor, font) into YelpApplication

 src/yelp-application.c |  161 +++++++++++++++++++++-----------
 src/yelp-application.h |    5 +-
 src/yelp-window.c      |  246 ++++++++++++++++++++++--------------------------
 3 files changed, 221 insertions(+), 191 deletions(-)
---
diff --git a/src/yelp-application.c b/src/yelp-application.c
index b1ace48..cea71b1 100644
--- a/src/yelp-application.c
+++ b/src/yelp-application.c
@@ -24,10 +24,15 @@
 #include <config.h>
 #endif
 
+#define G_SETTINGS_ENABLE_BACKEND
+
 #include <dbus/dbus-glib-bindings.h>
 #include <dbus/dbus-glib.h>
+#include <gio/gio.h>
+#include <gio/gsettingsbackend.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
+#include <gdk/gdkx.h>
 
 #include "yelp-settings.h"
 #include "yelp-view.h"
@@ -57,12 +62,16 @@ static void          yelp_application_class_init       (YelpApplicationClass  *k
 static void          yelp_application_dispose          (GObject               *object);
 static void          yelp_application_finalize         (GObject               *object);
 
+static void          application_setup                 (YelpApplication       *app);
 static void          application_uri_resolved          (YelpUri               *uri,
                                                         YelpApplicationLoad   *data);
 static gboolean      application_window_deleted        (YelpWindow            *window,
                                                         GdkEvent              *event,
                                                         YelpApplication       *app);
 static gboolean      application_maybe_quit            (YelpApplication       *app);
+static void          application_adjust_font           (GtkAction             *action,
+                                                        YelpApplication       *app);
+static void          application_set_font_sensitivity  (YelpApplication       *app);
 
 G_DEFINE_TYPE (YelpApplication, yelp_application, G_TYPE_OBJECT);
 #define GET_PRIV(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), YELP_TYPE_APPLICATION, YelpApplicationPrivate))
@@ -72,40 +81,29 @@ struct _YelpApplicationPrivate {
     DBusGConnection *connection;
 
     GSList *windows;
-
     GHashTable *windows_by_document;
 
+    GtkActionGroup *action_group;
+
     GSettings *gsettings;
 };
 
+static const GtkActionEntry action_entries[] = {
+    { "LargerText", GTK_STOCK_ZOOM_IN,
+      N_("_Larger Text"),
+      "<Control>plus",
+      N_("Increase the size of the text"),
+      G_CALLBACK (application_adjust_font) },
+    { "SmallerText", GTK_STOCK_ZOOM_OUT,
+      N_("_Smaller Text"),
+      "<Control>minus",
+      N_("Descrease the size of the text"),
+      G_CALLBACK (application_adjust_font) }
+};
+
 static void
 yelp_application_init (YelpApplication *app)
 {
-    YelpSettings *settings = yelp_settings_get_default ();
-    YelpApplicationPrivate *priv = GET_PRIV (app);
-
-    priv->windows_by_document = g_hash_table_new_full (g_str_hash,
-                                                       g_str_equal,
-                                                       g_free,
-                                                       NULL);
-    /* FIXME: is there a better way to see if there's a real backend in use? */
-    if (g_getenv ("GSETTINGS_BACKEND") == NULL) {
-        gchar *keyfile = g_build_filename (g_get_user_config_dir (),
-                                           "yelp", "yelp.cfg",
-                                           NULL);
-        g_settings_backend_setup_keyfile ("yelp-", keyfile);
-        priv->gsettings = g_settings_new_with_context ("org.gnome.yelp", "yelp-");
-        g_free (keyfile);
-    }
-    else {
-        priv->gsettings = g_settings_new ("org.gnome.yelp");
-    }
-    g_settings_bind (priv->gsettings, "show-cursor",
-                     settings, "show-text-cursor",
-                     G_SETTINGS_BIND_DEFAULT);
-    g_settings_bind (priv->gsettings, "font-adjustment",
-                     settings, "font-adjustment",
-                     G_SETTINGS_BIND_DEFAULT);
 }
 
 static void
@@ -132,6 +130,11 @@ yelp_application_dispose (GObject *object)
         priv->connection = NULL;
     }
 
+    if (priv->action_group) {
+        g_object_unref (priv->action_group);
+        priv->action_group = NULL;
+    }
+
     if (priv->gsettings) {
         g_object_unref (priv->gsettings);
         priv->gsettings = NULL;
@@ -151,38 +154,92 @@ yelp_application_finalize (GObject *object)
 }
 
 
+static void
+application_setup (YelpApplication *app)
+{
+    YelpApplicationPrivate *priv = GET_PRIV (app);
+    YelpSettings *settings = yelp_settings_get_default ();
+    GtkAction *action;
+
+    priv->windows_by_document = g_hash_table_new_full (g_str_hash,
+                                                       g_str_equal,
+                                                       g_free,
+                                                       NULL);
+    /* FIXME: is there a better way to see if there's a real backend in use? */
+    if (g_getenv ("GSETTINGS_BACKEND") == NULL) {
+        gchar *keyfile = g_build_filename (g_get_user_config_dir (),
+                                           "yelp", "yelp.cfg",
+                                           NULL);
+        g_settings_backend_setup_keyfile ("yelp-", keyfile);
+        priv->gsettings = g_settings_new_with_context ("org.gnome.yelp", "yelp-");
+        g_free (keyfile);
+    }
+    else {
+        priv->gsettings = g_settings_new ("org.gnome.yelp");
+    }
+    g_settings_bind (priv->gsettings, "show-cursor",
+                     settings, "show-text-cursor",
+                     G_SETTINGS_BIND_DEFAULT);
+    g_settings_bind (priv->gsettings, "font-adjustment",
+                     settings, "font-adjustment",
+                     G_SETTINGS_BIND_DEFAULT);
+
+    priv->action_group = gtk_action_group_new ("ApplicationActions");
+    gtk_action_group_set_translation_domain (priv->action_group, GETTEXT_PACKAGE);
+    gtk_action_group_add_actions (priv->action_group,
+				  action_entries, G_N_ELEMENTS (action_entries),
+				  app);
+    action = (GtkAction *) gtk_toggle_action_new ("ShowTextCursor",
+                                                  _("Show Text _Cursor"),
+                                                  NULL, NULL);
+    gtk_action_group_add_action_with_accel (priv->action_group,
+                                            action, "F7");
+    g_settings_bind (priv->gsettings, "show-cursor",
+                     action, "active",
+                     G_SETTINGS_BIND_DEFAULT);
+    g_object_unref (action);
+    application_set_font_sensitivity (app);
+}
+
 /******************************************************************************/
 
-void
-yelp_application_adjust_font (YelpApplication  *app,
-                              gint              adjust)
+GtkActionGroup *
+yelp_application_get_action_group (YelpApplication  *app)
 {
-    GSList *cur;
-    YelpSettings *settings = yelp_settings_get_default ();
-    GParamSpec *spec = g_object_class_find_property ((GObjectClass *) YELP_SETTINGS_GET_CLASS (settings),
-                                                     "font-adjustment");
     YelpApplicationPrivate *priv = GET_PRIV (app);
-    gint adjustment = g_settings_get_int (priv->gsettings, "font-adjustment");
+    return priv->action_group;
+}
 
-    if (!G_PARAM_SPEC_INT (spec)) {
-        g_warning ("Expcected integer param spec for font-adjustment");
-        return;
-    }
+static void
+application_adjust_font (GtkAction       *action,
+                         YelpApplication *app)
+{
+    YelpApplicationPrivate *priv = GET_PRIV (app);
+    gint adjustment = g_settings_get_int (priv->gsettings, "font-adjustment");
+    gint adjust = g_str_equal (gtk_action_get_name (action), "LargerText") ? 1 : -1;
 
     adjustment += adjust;
     g_settings_set_int (priv->gsettings, "font-adjustment", adjustment);
 
-    for (cur = priv->windows; cur != NULL; cur = cur->next) {
-        YelpWindow *win = (YelpWindow *) cur->data;
-        GtkActionGroup *group = yelp_window_get_action_group (win);
-        GtkAction *larger, *smaller;
-
-        larger = gtk_action_group_get_action (group, "LargerText");
-        gtk_action_set_sensitive (larger, adjustment < ((GParamSpecInt *) spec)->maximum);
+    application_set_font_sensitivity (app);
+}
 
-        smaller = gtk_action_group_get_action (group, "SmallerText");
-        gtk_action_set_sensitive (smaller, adjustment > ((GParamSpecInt *) spec)->minimum);
+static void
+application_set_font_sensitivity (YelpApplication *app)
+{
+    YelpApplicationPrivate *priv = GET_PRIV (app);
+    YelpSettings *settings = yelp_settings_get_default ();
+    GParamSpec *spec = g_object_class_find_property ((GObjectClass *) YELP_SETTINGS_GET_CLASS (settings),
+                                                     "font-adjustment");
+    gint adjustment = g_settings_get_int (priv->gsettings, "font-adjustment");
+    if (!G_PARAM_SPEC_INT (spec)) {
+        g_warning ("Expcected integer param spec for font-adjustment");
+        return;
     }
+    gtk_action_set_sensitive (gtk_action_group_get_action (priv->action_group, "LargerText"),
+                              adjustment < ((GParamSpecInt *) spec)->maximum);
+    gtk_action_set_sensitive (gtk_action_group_get_action (priv->action_group, "SmallerText"),
+                              adjustment > ((GParamSpecInt *) spec)->minimum);
 }
 
 /******************************************************************************/
@@ -284,6 +341,8 @@ yelp_application_run (YelpApplication  *app,
                                          "/org/gnome/Yelp",
                                          G_OBJECT (app));
 
+    application_setup (app);
+
     yelp_settings_set_editor_mode (yelp_settings_get_default (), editor_mode);
 
     yelp_application_load_uri (app, uri, gtk_get_current_event_time (), NULL);
@@ -352,17 +411,9 @@ application_uri_resolved (YelpUri             *uri,
         window = g_hash_table_lookup (priv->windows_by_document, doc_uri);
 
     if (window == NULL) {
-        GtkActionGroup *group;
-        GtkAction *action;
         window = yelp_window_new (data->app);
         priv->windows = g_slist_prepend (priv->windows, window);
 
-        group = yelp_window_get_action_group (window);
-        action = gtk_action_group_get_action (group, "ShowTextCursor");
-        g_settings_bind (priv->gsettings, "show-cursor",
-                         action, "active",
-                         G_SETTINGS_BIND_DEFAULT);
-
         if (!data->new) {
             g_hash_table_insert (priv->windows_by_document, doc_uri, window);
             g_object_set_data (G_OBJECT (window), "doc_uri", doc_uri);
diff --git a/src/yelp-application.h b/src/yelp-application.h
index b272381..c753212 100644
--- a/src/yelp-application.h
+++ b/src/yelp-application.h
@@ -55,10 +55,7 @@ gboolean          yelp_application_load_uri    (YelpApplication  *app,
                                                 GError          **error);
 void              yelp_application_new_window  (YelpApplication  *app,
                                                 const gchar      *uri);
-
-void              yelp_application_adjust_font          (YelpApplication  *app,
-                                                         gint              adjust);
-
+GtkActionGroup *  yelp_application_get_action_group     (YelpApplication  *app);
 void              yelp_application_install_package      (YelpApplication   *app,
                                                          const gchar       *pkg,
                                                          const gchar       *alt);
diff --git a/src/yelp-window.c b/src/yelp-window.c
index e60ef6b..3f7fe0b 100644
--- a/src/yelp-window.c
+++ b/src/yelp-window.c
@@ -49,14 +49,13 @@ static void          yelp_window_set_property     (GObject            *object,
                                                    const GValue       *value,
                                                    GParamSpec         *pspec);
 
+static void          window_construct             (YelpWindow         *window);
 static void          window_new                   (GtkAction          *action,
                                                    YelpWindow         *window);
 static void          window_close                 (GtkAction          *action,
                                                    YelpWindow         *window);
 static void          window_open_location         (GtkAction          *action,
                                                    YelpWindow         *window);
-static void          window_font_adjustment       (GtkAction          *action,
-                                                   YelpWindow         *window);
 static void          window_go_back               (GtkAction          *action,
                                                    YelpWindow         *window);
 static void          window_go_forward            (GtkAction          *action,
@@ -138,6 +137,7 @@ typedef struct _YelpWindowPrivate YelpWindowPrivate;
 struct _YelpWindowPrivate {
     GtkListStore *history;
     GtkListStore *completion;
+    GtkUIManager *ui_manager;
     GtkActionGroup *action_group;
     YelpApplication *application;
 
@@ -180,16 +180,6 @@ static const GtkActionEntry entries[] = {
       "<Control>L",
       NULL,
       G_CALLBACK (window_open_location) },
-    { "LargerText", NULL,
-      N_("_Larger Text"),
-      "<Control>plus",
-      NULL,
-      G_CALLBACK (window_font_adjustment) },
-    { "SmallerText", NULL,
-      N_("_Smaller Text"),
-      "<Control>minus",
-      NULL,
-      G_CALLBACK (window_font_adjustment) },
     {"GoBack", GTK_STOCK_GO_BACK,
      N_("_Back"),
      "<Alt>Left",
@@ -205,8 +195,109 @@ static const GtkActionEntry entries[] = {
 static void
 yelp_window_init (YelpWindow *window)
 {
+}
+
+static void
+yelp_window_class_init (YelpWindowClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+    object_class->dispose = yelp_window_dispose;
+    object_class->finalize = yelp_window_finalize;
+    object_class->get_property = yelp_window_get_property;
+    object_class->set_property = yelp_window_set_property;
+
+    g_object_class_install_property (object_class,
+                                     PROP_APPLICATION,
+                                     g_param_spec_object ("application",
+							  _("Application"),
+							  _("A YelpApplication instance that controls this window"),
+                                                          YELP_TYPE_APPLICATION,
+                                                          G_PARAM_CONSTRUCT_ONLY |
+							  G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
+							  G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+    g_type_class_add_private (klass, sizeof (YelpWindowPrivate));
+}
+
+static void
+yelp_window_dispose (GObject *object)
+{
+    YelpWindowPrivate *priv = GET_PRIV (object);
+
+    if (priv->history) {
+        g_object_unref (priv->history);
+        priv->history = NULL;
+    }
+
+    if (priv->action_group) {
+        g_object_unref (priv->action_group);
+        priv->action_group = NULL;
+    }
+
+    if (priv->align_location) {
+        g_object_unref (priv->align_location);
+        priv->align_location = NULL;
+    }
+
+    if (priv->align_hidden) {
+        g_object_unref (priv->align_hidden);
+        priv->align_hidden = NULL;
+    }
+
+    while (priv->back_list) {
+        back_entry_free ((YelpBackEntry *) priv->back_list->data);
+        priv->back_list = g_list_delete_link (priv->back_list, priv->back_list);
+    }
+
+    G_OBJECT_CLASS (yelp_window_parent_class)->dispose (object);
+}
+
+static void
+yelp_window_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (yelp_window_parent_class)->finalize (object);
+}
+
+static void
+yelp_window_get_property (GObject    *object,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+    YelpWindowPrivate *priv = GET_PRIV (object);
+    switch (prop_id) {
+    case PROP_APPLICATION:
+        g_value_set_object (value, priv->application);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+yelp_window_set_property (GObject     *object,
+                          guint        prop_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
+{
+    YelpWindowPrivate *priv = GET_PRIV (object);
+    switch (prop_id) {
+    case PROP_APPLICATION:
+        priv->application = g_value_get_object (value);
+        window_construct ((YelpWindow *) object);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+window_construct (YelpWindow *window)
+{
     GtkWidget *vbox, *scroll;
-    GtkUIManager *ui_manager;
     GtkAction *action;
     GError *error = NULL;
     GtkTreeIter iter;
@@ -218,22 +309,20 @@ yelp_window_init (YelpWindow *window)
     vbox = gtk_vbox_new (FALSE, 0);
     gtk_container_add (GTK_CONTAINER (window), vbox);
 
-    priv->action_group = gtk_action_group_new ("MenuActions");
+    priv->action_group = gtk_action_group_new ("WindowActions");
     gtk_action_group_set_translation_domain (priv->action_group, GETTEXT_PACKAGE);
     gtk_action_group_add_actions (priv->action_group,
 				  entries, G_N_ELEMENTS (entries),
 				  window);
-    action = (GtkAction *) gtk_toggle_action_new ("ShowTextCursor",
-                                                  _("Show Text _Cursor"),
-                                                  NULL, NULL);
-    gtk_action_group_add_action_with_accel (priv->action_group,
-                                            action, "F7");
-
-    ui_manager = gtk_ui_manager_new ();
-    gtk_ui_manager_insert_action_group (ui_manager, priv->action_group, 0);
+
+    priv->ui_manager = gtk_ui_manager_new ();
+    gtk_ui_manager_insert_action_group (priv->ui_manager, priv->action_group, 0);
+    gtk_ui_manager_insert_action_group (priv->ui_manager,
+                                        yelp_application_get_action_group (priv->application),
+                                        1);
     gtk_window_add_accel_group (GTK_WINDOW (window),
-                                gtk_ui_manager_get_accel_group (ui_manager));
-    if (!gtk_ui_manager_add_ui_from_file (ui_manager,
+                                gtk_ui_manager_get_accel_group (priv->ui_manager));
+    if (!gtk_ui_manager_add_ui_from_file (priv->ui_manager,
 					  DATADIR "/yelp/ui/yelp-ui.xml",
 					  &error)) {
         GtkWidget *dialog = gtk_message_dialog_new (NULL, 0,
@@ -247,7 +336,7 @@ yelp_window_init (YelpWindow *window)
         g_error_free (error);
     }
     gtk_box_pack_start (GTK_BOX (vbox),
-                        gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"),
+                        gtk_ui_manager_get_widget (priv->ui_manager, "/ui/menubar"),
                         FALSE, FALSE, 0);
 
     priv->hbox = gtk_hbox_new (FALSE, 0);
@@ -342,103 +431,6 @@ yelp_window_init (YelpWindow *window)
     gtk_widget_grab_focus (GTK_WIDGET (priv->view));
 }
 
-static void
-yelp_window_class_init (YelpWindowClass *klass)
-{
-    GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-    object_class->dispose = yelp_window_dispose;
-    object_class->finalize = yelp_window_finalize;
-    object_class->get_property = yelp_window_get_property;
-    object_class->set_property = yelp_window_set_property;
-
-    g_object_class_install_property (object_class,
-                                     PROP_APPLICATION,
-                                     g_param_spec_object ("application",
-							  _("Application"),
-							  _("A YelpApplication instance that controls this window"),
-                                                          YELP_TYPE_APPLICATION,
-                                                          G_PARAM_CONSTRUCT_ONLY |
-							  G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
-							  G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
-    g_type_class_add_private (klass, sizeof (YelpWindowPrivate));
-}
-
-static void
-yelp_window_dispose (GObject *object)
-{
-    YelpWindowPrivate *priv = GET_PRIV (object);
-
-    if (priv->history) {
-        g_object_unref (priv->history);
-        priv->history = NULL;
-    }
-
-    if (priv->action_group) {
-        g_object_unref (priv->action_group);
-        priv->action_group = NULL;
-    }
-
-    if (priv->align_location) {
-        g_object_unref (priv->align_location);
-        priv->align_location = NULL;
-    }
-
-    if (priv->align_hidden) {
-        g_object_unref (priv->align_hidden);
-        priv->align_hidden = NULL;
-    }
-
-    while (priv->back_list) {
-        back_entry_free ((YelpBackEntry *) priv->back_list->data);
-        priv->back_list = g_list_delete_link (priv->back_list, priv->back_list);
-    }
-
-    G_OBJECT_CLASS (yelp_window_parent_class)->dispose (object);
-}
-
-static void
-yelp_window_finalize (GObject *object)
-{
-    G_OBJECT_CLASS (yelp_window_parent_class)->finalize (object);
-}
-
-static void
-yelp_window_get_property (GObject    *object,
-                          guint       prop_id,
-                          GValue     *value,
-                          GParamSpec *pspec)
-{
-    YelpWindowPrivate *priv = GET_PRIV (object);
-    switch (prop_id) {
-    case PROP_APPLICATION:
-        g_value_set_object (value, priv->application);
-        break;
-    default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-        break;
-    }
-}
-
-static void
-yelp_window_set_property (GObject     *object,
-                          guint        prop_id,
-                          const GValue *value,
-                          GParamSpec   *pspec)
-{
-    YelpWindowPrivate *priv = GET_PRIV (object);
-    switch (prop_id) {
-    case PROP_APPLICATION:
-        priv->application = g_value_get_object (value);
-        break;
-    default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-        break;
-    }
-}
-
-
 /******************************************************************************/
 
 YelpWindow *
@@ -534,16 +526,6 @@ window_open_location (GtkAction *action, YelpWindow *window)
 }
 
 static void
-window_font_adjustment (GtkAction  *action,
-                        YelpWindow *window)
-{
-    YelpWindowPrivate *priv = GET_PRIV (window);
-
-    yelp_application_adjust_font (priv->application,
-                                  g_str_equal (gtk_action_get_name (action), "LargerText") ? 1 : -1);
-}
-
-static void
 window_go_back (GtkAction  *action,
                 YelpWindow *window)
 {



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