[gnome-terminal] app: Simplify GApplication setup



commit 42073371408fa5ef2346acec6f7564fb4d0c08d8
Author: Christian Persch <chpe gnome org>
Date:   Sat May 5 17:24:16 2012 +0200

    app: Simplify GApplication setup

 src/server.c       |  104 ++++++---------------------------------------------
 src/terminal-app.c |  104 +++++++++++++++++++++++++---------------------------
 src/terminal-app.h |    4 +-
 3 files changed, 64 insertions(+), 148 deletions(-)
---
diff --git a/src/server.c b/src/server.c
index 23078c8..4ac2011 100644
--- a/src/server.c
+++ b/src/server.c
@@ -62,79 +62,10 @@ static const GOptionEntry options[] = {
   { NULL }
 };
 
-
-typedef struct {
-  GApplication *app;
-  GMainLoop *loop;
-  gboolean owns_name;
-} MainData;
-
-static void
-bus_acquired_cb (GDBusConnection *connection,
-                 const char *name,
-                 gpointer user_data)
-{
-  MainData *data = (MainData *) user_data;
-  GDBusObjectManagerServer *object_manager;
-  TerminalObjectSkeleton *object;
-  TerminalFactory *factory;
-
-  _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
-                         "Bus %s acquired\n", name);
-
-  object = terminal_object_skeleton_new (TERMINAL_FACTORY_OBJECT_PATH);
-  factory = terminal_factory_impl_new ();
-  terminal_object_skeleton_set_factory (object, factory);
-  g_object_unref (factory);
-
-  object_manager = terminal_app_get_object_manager (TERMINAL_APP (data->app));
-  g_dbus_object_manager_server_export (object_manager, G_DBUS_OBJECT_SKELETON (object));
-  g_object_unref (object);
-
-  /* And export the object */
-  g_dbus_object_manager_server_set_connection (object_manager, connection);
-}
-
-static void
-name_acquired_cb (GDBusConnection *connection,
-                  const char *name,
-                  gpointer user_data)
-{
-  MainData *data = (MainData *) user_data;
-
-  _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
-                         "Acquired the name %s on the starter bus\n", name);
-  data->owns_name = TRUE;
-
-  if (g_main_loop_is_running (data->loop))
-    g_main_loop_quit (data->loop);
-}
-
-static void
-name_lost_cb (GDBusConnection *connection,
-              const char *name,
-              gpointer user_data)
-{
-  MainData *data = (MainData *) user_data;
-
-  if (connection) {
-    _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
-                          "Lost the name %s on the starter bus\n", name);
-  } else {
-    g_printerr ("Failed to connect to starter bus\n");
-  }
-
-  data->owns_name = FALSE;
-
-  if (g_main_loop_is_running (data->loop))
-    g_main_loop_quit (data->loop);
-}
-
 int
 main (int argc, char **argv)
 {
-  MainData data;
-  guint owner_id;
+  GApplication *app;
   int exit_code = EXIT_FAILURE;
   const char *home_dir;
   GError *error = NULL;
@@ -166,33 +97,24 @@ main (int argc, char **argv)
     exit (EXIT_FAILURE);
   }
 
-  data.app = terminal_app_new ();
-  data.loop = g_main_loop_new (NULL, FALSE);
-  data.owns_name = FALSE;
-
-  owner_id = g_bus_own_name (G_BUS_TYPE_STARTER,
-                             bus_name ? bus_name : TERMINAL_UNIQUE_NAME,
-                             G_BUS_NAME_OWNER_FLAGS_NONE,
-                             bus_acquired_cb,
-                             name_acquired_cb,
-                             name_lost_cb,
-                             &data, NULL);
-
-  g_main_loop_run (data.loop);
-
-  g_main_loop_unref (data.loop);
-  data.loop = NULL;
+  app = terminal_app_new (bus_name);
+  g_free (bus_name);
 
-  if (!data.owns_name)
+  if (!g_application_register (app, NULL, &error)) {
+    g_printerr ("Failed to register application: %s\n", error->message);
+    g_error_free (error);
     goto out;
+  }
 
-  exit_code = g_application_run (data.app, 0, NULL);
+  if (g_application_get_is_remote (app)) {
+    /* How the fuck did this happen? */
+    g_printerr ("Cannot be remote instance!\n");
+    goto out;
+  }
 
-  g_bus_unown_name (owner_id);
+  exit_code = g_application_run (app, 0, NULL);
 
 out:
-
-  g_free (bus_name);
   terminal_app_shutdown ();
 
   return exit_code;
diff --git a/src/terminal-app.c b/src/terminal-app.c
index 32efb7c..4f74ff8 100644
--- a/src/terminal-app.c
+++ b/src/terminal-app.c
@@ -74,7 +74,6 @@
 struct _TerminalAppClass {
   GtkApplicationClass parent_class;
 
-  void (* quit) (TerminalApp *app);
   void (* profile_list_changed) (TerminalApp *app);
   void (* encoding_list_changed) (TerminalApp *app);
 };
@@ -85,7 +84,6 @@ struct _TerminalApp
 
   GDBusObjectManagerServer *object_manager;
 
-  GList *windows;
   GtkWidget *new_profile_dialog;
   GtkWidget *manage_profiles_dialog;
   GtkWidget *manage_profiles_list;
@@ -111,7 +109,6 @@ struct _TerminalApp
 
 enum
 {
-  QUIT,
   PROFILE_LIST_CHANGED,
   ENCODING_LIST_CHANGED,
   LAST_SIGNAL
@@ -169,16 +166,6 @@ profiles_lookup_by_visible_name_foreach (gpointer key,
 }
 #endif
 
-static void
-terminal_window_destroyed (TerminalWindow *window,
-                           TerminalApp    *app)
-{
-  app->windows = g_list_remove (app->windows, window);
-
-  if (app->windows == NULL)
-    g_signal_emit (app, signals[QUIT], 0);
-}
-
 #if 0
 
 static TerminalProfile *
@@ -1236,9 +1223,6 @@ terminal_app_init (TerminalApp *app)
   terminal_app_ensure_any_profiles (app);
 
   terminal_accels_init ();
-
-  /* FIXMEchpe: find out why this is necessary... */
-  g_application_hold (G_APPLICATION (app));
 }
 
 static void
@@ -1269,21 +1253,57 @@ terminal_app_finalize (GObject *object)
 
   terminal_accels_shutdown ();
 
-  if (app->object_manager) {
-    g_dbus_object_manager_server_unexport (app->object_manager, TERMINAL_FACTORY_OBJECT_PATH);
-    g_object_unref (app->object_manager);
-  }
-
   G_OBJECT_CLASS (terminal_app_parent_class)->finalize (object);
 
   global_app = NULL;
 }
 
+static gboolean
+terminal_app_dbus_register (GApplication    *application,
+                            GDBusConnection *connection,
+                            const gchar     *object_path,
+                            GError         **error)
+{
+  TerminalApp *app = TERMINAL_APP (application);
+  TerminalObjectSkeleton *object;
+  TerminalFactory *factory;
+
+  if (!G_APPLICATION_CLASS (terminal_app_parent_class)->dbus_register (application,
+                                                                       connection,
+                                                                       object_path,
+                                                                       error))
+    return FALSE;
+
+  object = terminal_object_skeleton_new (TERMINAL_FACTORY_OBJECT_PATH);
+  factory = terminal_factory_impl_new ();
+  terminal_object_skeleton_set_factory (object, factory);
+  g_object_unref (factory);
+
+  app->object_manager = g_dbus_object_manager_server_new (TERMINAL_OBJECT_PATH_PREFIX);
+  g_dbus_object_manager_server_export (app->object_manager, G_DBUS_OBJECT_SKELETON (object));
+  g_object_unref (object);
+
+  /* And export the object */
+  g_dbus_object_manager_server_set_connection (app->object_manager, connection);
+  return TRUE;
+}
+
 static void
-terminal_app_real_quit (TerminalApp *app)
+terminal_app_dbus_unregister (GApplication    *application,
+                              GDBusConnection *connection,
+                              const gchar     *object_path)
 {
-  /* Release the hold added when creating the app  */
-  g_application_release (G_APPLICATION (app));
+  TerminalApp *app = TERMINAL_APP (application);
+
+  if (app->object_manager) {
+    g_dbus_object_manager_server_unexport (app->object_manager, TERMINAL_FACTORY_OBJECT_PATH);
+    g_object_unref (app->object_manager);
+    app->object_manager = NULL;
+  }
+
+  G_APPLICATION_CLASS (terminal_app_parent_class)->dbus_unregister (application,
+                                                                    connection,
+                                                                    object_path);
 }
 
 static void
@@ -1296,17 +1316,8 @@ terminal_app_class_init (TerminalAppClass *klass)
 
   g_application_class->activate = terminal_app_activate;
   g_application_class->startup = terminal_app_startup;
-
-  klass->quit = terminal_app_real_quit;
-
-  signals[QUIT] =
-    g_signal_new (I_("quit"),
-                  G_OBJECT_CLASS_TYPE (object_class),
-                  G_SIGNAL_RUN_LAST,
-                  G_STRUCT_OFFSET (TerminalAppClass, quit),
-                  NULL, NULL,
-                  g_cclosure_marshal_VOID__VOID,
-                  G_TYPE_NONE, 0);
+  g_application_class->dbus_register = terminal_app_dbus_register;
+  g_application_class->dbus_unregister = terminal_app_dbus_unregister;
 
   signals[PROFILE_LIST_CHANGED] =
     g_signal_new (I_("profile-list-changed"),
@@ -1330,13 +1341,12 @@ terminal_app_class_init (TerminalAppClass *klass)
 /* Public API */
 
 GApplication *
-terminal_app_new (void)
+terminal_app_new (const char *bus_name)
 {
-  const GApplicationFlags flags = G_APPLICATION_NON_UNIQUE |
-                                  G_APPLICATION_IS_SERVICE;
+  const GApplicationFlags flags = G_APPLICATION_IS_SERVICE;
 
   return g_object_new (TERMINAL_TYPE_APP,
-                       "application-id", TERMINAL_UNIQUE_NAME,
+                       "application-id", bus_name ? bus_name : TERMINAL_UNIQUE_NAME,
                        "flags", flags,
                        NULL);
 }
@@ -1367,10 +1377,6 @@ terminal_app_new_window (TerminalApp *app,
 
   window = terminal_window_new (G_APPLICATION (app));
 
-  app->windows = g_list_append (app->windows, window);
-  g_signal_connect (window, "destroy",
-                    G_CALLBACK (terminal_window_destroyed), app);
-
   if (screen)
     gtk_window_set_screen (GTK_WINDOW (window), screen);
 
@@ -1428,15 +1434,6 @@ terminal_app_edit_encodings (TerminalApp     *app,
   terminal_encoding_dialog_show (transient_parent);
 }
 
-TerminalWindow *
-terminal_app_get_current_window (TerminalApp *app)
-{
-  if (app->windows == NULL)
-    return NULL;
-
-  return g_list_last (app->windows)->data;
-}
-
 /**
  * terminal_profile_get_list:
  *
@@ -1648,7 +1645,6 @@ terminal_app_get_system_font (TerminalApp *app)
 GDBusObjectManagerServer *
 terminal_app_get_object_manager (TerminalApp *app)
 {
-  if (app->object_manager == NULL)
-    app->object_manager = g_dbus_object_manager_server_new (TERMINAL_OBJECT_PATH_PREFIX);
+  g_warn_if_fail (app->object_manager != NULL);
   return app->object_manager;
 }
diff --git a/src/terminal-app.h b/src/terminal-app.h
index 855a9cd..a538e1e 100644
--- a/src/terminal-app.h
+++ b/src/terminal-app.h
@@ -48,7 +48,7 @@ typedef struct _TerminalApp TerminalApp;
 
 GType terminal_app_get_type (void);
 
-GApplication *terminal_app_new (void);
+GApplication *terminal_app_new (const char *bus_name);
 
 TerminalApp* terminal_app_get (void);
 
@@ -77,8 +77,6 @@ TerminalScreen *terminal_app_new_terminal (TerminalApp     *app,
                                            char           **child_env,
                                            double           zoom);
 
-TerminalWindow *terminal_app_get_current_window (TerminalApp *app);
-
 void terminal_app_manage_profiles (TerminalApp     *app,
                                    GtkWindow       *transient_parent);
 



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