diff options
Diffstat (limited to 'src/empathy.c')
-rw-r--r-- | src/empathy.c | 119 |
1 files changed, 65 insertions, 54 deletions
diff --git a/src/empathy.c b/src/empathy.c index c36f2a2d7..5cfe9f38b 100644 --- a/src/empathy.c +++ b/src/empathy.c @@ -23,34 +23,31 @@ #include <glib/gstdio.h> #include <glib/gi18n.h> +#include <libnotify/notify.h> #ifdef HAVE_LIBCHAMPLAIN #include <clutter-gtk/clutter-gtk.h> #endif -#include <libnotify/notify.h> - -#include <libempathy/empathy-client-factory.h> -#include <libempathy/empathy-connection-aggregator.h> -#include <libempathy/empathy-presence-manager.h> -#include <libempathy/empathy-utils.h> -#include <libempathy/empathy-chatroom-manager.h> -#include <libempathy/empathy-request-util.h> -#include <libempathy/empathy-ft-factory.h> -#include <libempathy/empathy-gsettings.h> - -#include <libempathy-gtk/empathy-ui-utils.h> -#include <libempathy-gtk/empathy-location-manager.h> - -#include "empathy-roster-window.h" #include "empathy-accounts-common.h" #include "empathy-accounts-dialog.h" -#include "empathy-status-icon.h" +#include "empathy-chatroom-manager.h" +#include "empathy-client-factory.h" +#include "empathy-connection-aggregator.h" +#include "empathy-ft-factory.h" #include "empathy-ft-manager.h" +#include "empathy-gsettings.h" +#include "empathy-location-manager.h" #include "empathy-notifications-approver.h" +#include "empathy-presence-manager.h" +#include "empathy-request-util.h" +#include "empathy-roster-window.h" +#include "empathy-status-icon.h" +#include "empathy-ui-utils.h" +#include "empathy-utils.h" #define DEBUG_FLAG EMPATHY_DEBUG_OTHER -#include <libempathy/empathy-debug.h> +#include "empathy-debug.h" #define EMPATHY_DBUS_NAME "org.gnome.Empathy" @@ -214,11 +211,6 @@ new_ft_handler_cb (EmpathyFTFactory *factory, g_object_unref (handler); } -static gboolean -empathy_app_local_command_line (GApplication *app, - gchar ***arguments, - gint *exit_status); - static void empathy_presence_manager_set_auto_away_cb (GSettings *gsettings, const gchar *key, @@ -285,32 +277,18 @@ out: } } -static int -empathy_app_command_line (GApplication *app, - GApplicationCommandLine *cmdline) +static void +empathy_app_activate (GApplication *app) { EmpathyApp *self = (EmpathyApp *) app; - gchar **args, **argv; - gint argc, exit_status, i; - - args = g_application_command_line_get_arguments (cmdline, &argc); - /* We have to make an extra copy of the array, since g_option_context_parse() - * assumes that it can remove strings from the array without freeing them. */ - argv = g_new (gchar*, argc + 1); - for (i = 0; i <= argc; i++) - argv[i] = args[i]; - - if (empathy_app_local_command_line (app, &argv, &exit_status)) - DEBUG ("failed to parse command line!"); - - g_free (argv); - g_strfreev (args); if (!self->activated) { GError *error = NULL; TpDBusDaemon *dbus; + empathy_gtk_init (); + /* Create the FT factory */ self->ft_factory = empathy_ft_factory_dup_singleton (); g_signal_connect (self->ft_factory, "new-ft-handler", @@ -356,7 +334,8 @@ empathy_app_command_line (GApplication *app, if (self->show_preferences) { empathy_roster_window_show_preferences ( - EMPATHY_ROSTER_WINDOW (self->window), self->preferences_tab); + EMPATHY_ROSTER_WINDOW (self->window), + tp_str_empty (self->preferences_tab) ? NULL : self->preferences_tab); self->show_preferences = FALSE; } @@ -369,8 +348,6 @@ empathy_app_command_line (GApplication *app, /* Display the accounts dialog if needed */ tp_proxy_prepare_async (self->account_manager, NULL, account_manager_ready_cb, self); - - return 0; } static gboolean @@ -395,16 +372,30 @@ show_version_cb (const char *option_name, gpointer data, GError **error); +static void +open_preference_action_cb (GAction *action, + GVariant *parameter, + gpointer data) +{ + EmpathyApp *self = EMPATHY_APP (data); + + self->show_preferences = TRUE; + + g_free (self->preferences_tab); + self->preferences_tab = g_variant_dup_string (parameter, NULL); +} + static gboolean empathy_app_local_command_line (GApplication *app, gchar ***arguments, gint *exit_status) { EmpathyApp *self = (EmpathyApp *) app; + GSimpleAction *action; gint i; gchar **argv; gint argc = 0; - gboolean retval = FALSE; + gboolean retval = TRUE; GError *error = NULL; gboolean no_connect = FALSE, start_hidden = FALSE; @@ -428,13 +419,26 @@ empathy_app_local_command_line (GApplication *app, { NULL } }; + if (!g_application_register (app, NULL, &error)) + { + g_warning("Impossible to register empathy: %s", error->message); + g_clear_error (&error); + *exit_status = EXIT_FAILURE; + return retval; + } + + action = g_simple_action_new ("open-preferences", G_VARIANT_TYPE_STRING); + g_signal_connect (action, "activate", G_CALLBACK (open_preference_action_cb), app); + g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (action)); + g_object_unref (action); + /* We create a group so that GOptionArgFuncs get the user data */ group = g_option_group_new ("empathy", NULL, NULL, app, NULL); g_option_group_set_translation_domain (group, GETTEXT_PACKAGE); g_option_group_add_entries (group, options); optcontext = g_option_context_new (N_("- Empathy IM Client")); - g_option_context_add_group (optcontext, gtk_get_option_group (TRUE)); + g_option_context_add_group (optcontext, gtk_get_option_group (FALSE)); g_option_context_set_main_group (optcontext, group); g_option_context_set_translation_domain (optcontext, GETTEXT_PACKAGE); @@ -453,17 +457,27 @@ empathy_app_local_command_line (GApplication *app, "line options.\n", error->message, argv[0]); g_warning ("Error in empathy init: %s", error->message); + g_clear_error (&error); *exit_status = EXIT_FAILURE; - retval = TRUE; } + else + { + self->no_connect = no_connect; + self->start_hidden = start_hidden; - g_free (argv); + if (self->show_preferences) + { + GVariant *parameter; + parameter = g_variant_new_string (self->preferences_tab ? self->preferences_tab : ""); + g_action_group_activate_action (G_ACTION_GROUP (app), "open-preferences", parameter); + } - g_option_context_free (optcontext); + g_application_activate (app); + } - self->no_connect = no_connect; - self->start_hidden = start_hidden; + g_free (argv); + g_option_context_free (optcontext); return retval; } @@ -482,8 +496,8 @@ empathy_app_class_init (EmpathyAppClass *klass) gobject_class->dispose = empathy_app_dispose; gobject_class->finalize = empathy_app_finalize; - g_app_class->command_line = empathy_app_command_line; g_app_class->local_command_line = empathy_app_local_command_line; + g_app_class->activate = empathy_app_activate; spec = g_param_spec_boolean ("no-connect", "no connect", "Don't connect on startup", @@ -818,14 +832,11 @@ main (int argc, char *argv[]) g_type_init (); empathy_init (); - gtk_init (&argc, &argv); - empathy_gtk_init (); add_empathy_features (); app = g_object_new (EMPATHY_TYPE_APP, "application-id", EMPATHY_DBUS_NAME, - "flags", G_APPLICATION_HANDLES_COMMAND_LINE, NULL); retval = g_application_run (G_APPLICATION (app), argc, argv); |