diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/empathy-account-assistant.c | 4 | ||||
-rw-r--r-- | src/empathy-accounts-common.c | 1 | ||||
-rw-r--r-- | src/empathy-accounts.c | 53 | ||||
-rw-r--r-- | src/empathy-av.c | 8 | ||||
-rw-r--r-- | src/empathy-debug-window.c | 4 | ||||
-rw-r--r-- | src/empathy-debugger.c | 9 | ||||
-rw-r--r-- | src/empathy-main-window.c | 14 | ||||
-rw-r--r-- | src/empathy.c | 484 |
9 files changed, 338 insertions, 243 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 378bdee67..31a21933c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,7 +16,6 @@ AM_LDFLAGS = -lm AM_CPPFLAGS = \ $(CPPFLAGS_COMMON) \ $(LIBNOTIFY_CFLAGS) \ - $(UNIQUE_CFLAGS) \ $(LIBCHAMPLAIN_CFLAGS) \ $(WEBKIT_CFLAGS) \ $(NULL) @@ -26,7 +25,6 @@ LDADD = \ $(top_builddir)/libempathy/libempathy.la \ $(top_builddir)/extensions/libemp-extensions.la \ $(LIBNOTIFY_LIBS) \ - $(UNIQUE_LIBS) \ $(EMPATHY_LIBS) \ $(GTK_LIBS) \ $(LIBCHAMPLAIN_LIBS) \ @@ -49,7 +47,6 @@ libempathy_accounts_common_la_LIBADD = \ $(top_builddir)/libempathy-gtk/libempathy-gtk.la \ $(EDS_LIBS) \ $(LIBNOTIFY_LIBS) \ - $(UNIQUE_LIBS) \ $(EMPATHY_LIBS) \ $(LIBCHAMPLAIN_LIBS) \ $(WEBKIT_LIBS) \ @@ -144,7 +141,6 @@ empathy_LDADD = \ $(top_builddir)/libempathy/libempathy.la \ $(top_builddir)/extensions/libemp-extensions.la \ $(LIBNOTIFY_LIBS) \ - $(UNIQUE_LIBS) \ $(EMPATHY_LIBS) \ $(LIBCHAMPLAIN_LIBS) \ $(WEBKIT_LIBS) \ diff --git a/src/empathy-account-assistant.c b/src/empathy-account-assistant.c index 926f6e09a..26032d7e8 100644 --- a/src/empathy-account-assistant.c +++ b/src/empathy-account-assistant.c @@ -655,8 +655,8 @@ account_assistant_build_introduction_page (EmpathyAccountAssistant *self) GINT_TO_POINTER (RESPONSE_IMPORT)); gtk_widget_show (radio); - w = gtk_combo_box_new_text (); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), "Pidgin"); + w = gtk_combo_box_text_new (); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), "Pidgin"); gtk_box_pack_start (GTK_BOX (hbox_1), w, TRUE, TRUE, 0); gtk_combo_box_set_active (GTK_COMBO_BOX (w), 0); gtk_widget_show (w); diff --git a/src/empathy-accounts-common.c b/src/empathy-accounts-common.c index a14a95c59..8932fdbbc 100644 --- a/src/empathy-accounts-common.c +++ b/src/empathy-accounts-common.c @@ -31,7 +31,6 @@ #include <gtk/gtk.h> #include <glib/gi18n-lib.h> -#include <unique/unique.h> #include <telepathy-glib/account-manager.h> #include <telepathy-glib/util.h> diff --git a/src/empathy-accounts.c b/src/empathy-accounts.c index 788bc89e4..4131100fb 100644 --- a/src/empathy-accounts.c +++ b/src/empathy-accounts.c @@ -31,7 +31,6 @@ #include <gtk/gtk.h> #include <glib/gi18n.h> -#include <unique/unique.h> #include <telepathy-glib/account-manager.h> #include <telepathy-glib/defs.h> @@ -135,35 +134,17 @@ account_manager_ready_for_accounts_cb (GObject *source_object, } } -static UniqueResponse -unique_app_message_cb (UniqueApp *unique_app, - gint command, - UniqueMessageData *data, - guint timestamp, - gpointer user_data) +static void +app_activated_cb (GtkApplication *app) { - DEBUG ("Other instance launched, presenting the main window. " - "Command=%d, timestamp %u", command, timestamp); - - if (command == UNIQUE_ACTIVATE) - { - TpAccountManager *account_manager; + TpAccountManager *account_manager; - account_manager = tp_account_manager_dup (); + account_manager = tp_account_manager_dup (); - empathy_accounts_show_accounts_ui (account_manager, NULL, + empathy_accounts_show_accounts_ui (account_manager, NULL, G_CALLBACK (gtk_main_quit)); - g_object_unref (account_manager); - } - else - { - g_warning (G_STRLOC "unhandled unique app command %d", command); - - return UNIQUE_RESPONSE_PASSTHROUGH; - } - - return UNIQUE_RESPONSE_OK; + g_object_unref (account_manager); } #define COMMAND_ACCOUNTS_DIALOG 1 @@ -173,7 +154,7 @@ main (int argc, char *argv[]) { TpAccountManager *account_manager; GError *error = NULL; - UniqueApp *unique_app; + GtkApplication *app; GOptionContext *optcontext; GOptionEntry options[] = { @@ -218,30 +199,20 @@ main (int argc, char *argv[]) gtk_window_set_default_icon_name ("empathy"); textdomain (GETTEXT_PACKAGE); - unique_app = unique_app_new (EMPATHY_ACCOUNTS_DBUS_NAME, NULL); - - if (unique_app_is_running (unique_app)) - { - if (unique_app_send_message (unique_app, UNIQUE_ACTIVATE, NULL) == - UNIQUE_RESPONSE_OK) - { - g_object_unref (unique_app); - return EXIT_SUCCESS; - } - } + app = gtk_application_new (EMPATHY_ACCOUNTS_DBUS_NAME, &argc, &argv); account_manager = tp_account_manager_dup (); tp_account_manager_prepare_async (account_manager, NULL, account_manager_ready_for_accounts_cb, selected_account_name); - g_signal_connect (unique_app, "message-received", - G_CALLBACK (unique_app_message_cb), NULL); + g_signal_connect (app, "activated", + G_CALLBACK (app_activated_cb), NULL); - gtk_main (); + gtk_application_run (app); g_object_unref (account_manager); - g_object_unref (unique_app); + g_object_unref (app); return EXIT_SUCCESS; } diff --git a/src/empathy-av.c b/src/empathy-av.c index 9ef0fbf29..c937c2a44 100644 --- a/src/empathy-av.c +++ b/src/empathy-av.c @@ -41,6 +41,8 @@ /* Exit after $TIMEOUT seconds if not displaying any call window */ #define TIMEOUT 60 +#define EMPATHY_AV_DBUS_NAME "org.gnome.Empathy.AudioVideo" + static guint nb_windows = 0; static guint timeout_id = 0; static gboolean use_timer = TRUE; @@ -126,6 +128,7 @@ main (int argc, #endif EmpathyCallFactory *call_factory; GError *error = NULL; + GtkApplication *app; /* Init */ g_thread_init (NULL); @@ -152,6 +155,8 @@ main (int argc, gtk_window_set_default_icon_name ("empathy"); textdomain (GETTEXT_PACKAGE); + app = gtk_application_new (EMPATHY_AV_DBUS_NAME, &argc, &argv); + #ifdef ENABLE_DEBUG /* Set up debug sender */ debug_sender = tp_debug_sender_dup (); @@ -179,8 +184,9 @@ main (int argc, start_timer (); - gtk_main (); + gtk_application_run (app); + g_object_unref (app); g_object_unref (call_factory); #ifdef ENABLE_DEBUG diff --git a/src/empathy-debug-window.c b/src/empathy-debug-window.c index ddebf233b..eba51c046 100644 --- a/src/empathy-debug-window.c +++ b/src/empathy-debug-window.c @@ -1413,7 +1413,7 @@ am_prepared_cb (GObject *am, gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 0); /* CM */ - priv->chooser = gtk_combo_box_new_text (); + priv->chooser = gtk_combo_box_text_new (); priv->service_store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN); gtk_combo_box_set_model (GTK_COMBO_BOX (priv->chooser), @@ -1489,7 +1489,7 @@ am_prepared_cb (GObject *am, gtk_container_add (GTK_CONTAINER (priv->level_label), label); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), priv->level_label, -1); - priv->level_filter = gtk_combo_box_new_text (); + priv->level_filter = gtk_combo_box_text_new (); gtk_widget_show (priv->level_filter); item = gtk_tool_item_new (); diff --git a/src/empathy-debugger.c b/src/empathy-debugger.c index 9ff142b1c..2203041d1 100644 --- a/src/empathy-debugger.c +++ b/src/empathy-debugger.c @@ -27,16 +27,20 @@ #include "empathy-debug-window.h" +#define EMPATHY_DEBUGGER_DBUS_NAME "org.gnome.Empathy.Debugger" + int main (int argc, char **argv) { GtkWidget *window; + GtkApplication *app; g_thread_init (NULL); - gtk_init (&argc, &argv); empathy_gtk_init (); + app = gtk_application_new (EMPATHY_DEBUGGER_DBUS_NAME, &argc, &argv); + g_set_application_name (_("Empathy Debugger")); gtk_window_set_default_icon_name ("empathy"); @@ -45,7 +49,8 @@ main (int argc, window = empathy_debug_window_new (NULL); g_signal_connect (window, "destroy", gtk_main_quit, NULL); - gtk_main (); + gtk_application_run (app); + g_object_unref (app); return EXIT_SUCCESS; } diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c index 6c9b225dc..cc49db934 100644 --- a/src/empathy-main-window.c +++ b/src/empathy-main-window.c @@ -101,6 +101,7 @@ G_DEFINE_TYPE (EmpathyMainWindow, empathy_main_window, GTK_TYPE_WINDOW); #define GET_PRIV(self) ((EmpathyMainWindowPriv *)((EmpathyMainWindow *) self)->priv) struct _EmpathyMainWindowPriv { + EmpathyContactList *contact_manager; EmpathyIndividualStore *individual_store; EmpathyIndividualView *individual_view; TpAccountManager *account_manager; @@ -695,6 +696,7 @@ empathy_main_window_finalize (GObject *window) g_object_unref (priv->account_manager); g_object_unref (priv->individual_store); + g_object_unref (priv->contact_manager); g_hash_table_destroy (priv->errors); /* disconnect all handlers of status-changed signal */ @@ -1545,7 +1547,6 @@ static void empathy_main_window_init (EmpathyMainWindow *window) { EmpathyMainWindowPriv *priv; - EmpathyContactList *list_iface; EmpathyIndividualManager *individual_manager; GtkBuilder *gui; GtkWidget *sw; @@ -1686,7 +1687,12 @@ empathy_main_window_init (EmpathyMainWindow *window) gtk_container_add (GTK_CONTAINER (item), priv->throbber); priv->throbber_tool_item = GTK_WIDGET (item); - list_iface = EMPATHY_CONTACT_LIST (empathy_contact_manager_dup_singleton ()); + /* XXX: this class is designed to live for the duration of the program, + * so it's got a race condition between its signal handlers and its + * finalization. The class is planned to be removed, so we won't fix + * this before then. */ + priv->contact_manager = EMPATHY_CONTACT_LIST ( + empathy_contact_manager_dup_singleton ()); individual_manager = empathy_individual_manager_dup_singleton (); priv->individual_store = empathy_individual_store_new ( individual_manager); @@ -1701,11 +1707,9 @@ empathy_main_window_init (EmpathyMainWindow *window) EMPATHY_INDIVIDUAL_FEATURE_ALL); priv->butterfly_log_migration_members_changed_id = g_signal_connect ( - list_iface, "members-changed", + priv->contact_manager, "members-changed", G_CALLBACK (main_window_members_changed_cb), window); - g_object_unref (list_iface); - gtk_widget_show (GTK_WIDGET (priv->individual_view)); gtk_container_add (GTK_CONTAINER (sw), GTK_WIDGET (priv->individual_view)); diff --git a/src/empathy.c b/src/empathy.c index 2a8761c6f..314e4fb0f 100644 --- a/src/empathy.c +++ b/src/empathy.c @@ -30,7 +30,6 @@ #include <glib/gi18n.h> #include <gtk/gtk.h> #include <gdk/gdkx.h> -#include <unique/unique.h> #ifdef HAVE_LIBCHAMPLAIN #include <clutter-gtk/clutter-gtk.h> @@ -73,13 +72,216 @@ #define DEBUG_FLAG EMPATHY_DEBUG_OTHER #include <libempathy/empathy-debug.h> -static gboolean start_hidden = FALSE; -static gboolean no_connect = FALSE; +#define EMPATHY_DBUS_NAME "org.gnome.Empathy" + +#define EMPATHY_TYPE_APP (empathy_app_get_type ()) +#define EMPATHY_APP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EMPATHY_TYPE_APP, EmpathyApp)) +#define EMPATHY_APP_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), EMPATHY_TYPE_APP, EmpathyAppClass)) +#define EMPATHY_IS_EMPATHY_APP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EMPATHY_TYPE_APP)) +#define EMPATHY_IS_EMPATHY_APP_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), EMPATHY_TYPE_APP)) +#define EMPATHY_APP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EMPATHY_TYPE_APP, EmpathyAppClass)) + +typedef struct _EmpathyApp EmpathyApp; +typedef struct _EmpathyAppClass EmpathyAppClass; + +enum +{ + PROP_NO_CONNECT = 1, + PROP_START_HIDDEN +}; + +GType empathy_app_get_type (void); + +struct _EmpathyAppClass +{ + GtkApplicationClass parent_class; +}; + +struct _EmpathyApp +{ + GtkApplication parent; + + /* Properties */ + gboolean no_connect; + gboolean start_hidden; + + GtkWidget *window; + EmpathyStatusIcon *icon; + EmpathyDispatcher *dispatcher; + TpAccountManager *account_manager; + TplLogManager *log_manager; + EmpathyChatroomManager *chatroom_manager; + EmpathyFTFactory *ft_factory; + EmpathyIdle *idle; + EmpathyConnectivity *connectivity; + EmpathyChatManager *chat_manager; + GSettings *gsettings; +#ifdef HAVE_GEOCLUE + EmpathyLocationManager *location_manager; +#endif +#ifdef ENABLE_DEBUG + TpDebugSender *debug_sender; +#endif +}; + + +G_DEFINE_TYPE(EmpathyApp, empathy_app, GTK_TYPE_APPLICATION) + +static void +empathy_app_dispose (GObject *object) +{ + EmpathyApp *self = EMPATHY_APP (object); + void (*dispose) (GObject *) = + G_OBJECT_CLASS (empathy_app_parent_class)->dispose; + + if (self->idle != NULL) + { + empathy_idle_set_state (self->idle, TP_CONNECTION_PRESENCE_TYPE_OFFLINE); + } + +#ifdef ENABLE_DEBUG + tp_clear_object (&self->debug_sender); +#endif + + tp_clear_object (&self->chat_manager); + tp_clear_object (&self->idle); + tp_clear_object (&self->connectivity); + tp_clear_object (&self->icon); + tp_clear_object (&self->account_manager); + tp_clear_object (&self->log_manager); + tp_clear_object (&self->dispatcher); + tp_clear_object (&self->chatroom_manager); +#ifdef HAVE_GEOCLUE + tp_clear_object (&self->location_manager); +#endif + tp_clear_object (&self->ft_factory); + tp_clear_object (&self->gsettings); + + if (dispose != NULL) + dispose (object); +} + +static void +empathy_app_finalize (GObject *object) +{ + EmpathyApp *self = EMPATHY_APP (object); + void (*finalize) (GObject *) = + G_OBJECT_CLASS (empathy_app_parent_class)->finalize; + + gtk_widget_destroy (self->window); + + if (finalize != NULL) + finalize (object); +} static void account_manager_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data); +static EmpathyApp * +empathy_app_new (guint argc, + const gchar * const * argv, + gboolean no_connect, + gboolean start_hidden) +{ + EmpathyApp *self; + GError *error = NULL; + GVariant *argv_variant; + + argv_variant = g_variant_new_bytestring_array (argv, argc); + + self = g_initable_new (EMPATHY_TYPE_APP, + NULL, &error, + "application-id", EMPATHY_DBUS_NAME, + "argv", argv_variant, + "register", TRUE, + "no-connect", no_connect, + "start-hidden", start_hidden, + NULL); + + if (self == NULL) + { + g_critical ("Failed to initiate EmpathyApp: %s", error->message); + g_error_free (error); + } + + return self; +} + +static void +empathy_app_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EmpathyApp *self = EMPATHY_APP (object); + + switch (prop_id) + { + case PROP_NO_CONNECT: + self->no_connect = g_value_get_boolean (value); + break; + case PROP_START_HIDDEN: + self->start_hidden = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +empathy_app_activated (GtkApplication *app, + GVariant *args) +{ + EmpathyApp *self = (EmpathyApp *) app; + + /* We're requested to show stuff again, disable the start hidden global + * in case the accounts wizard wants to pop up. + */ + self->start_hidden = FALSE; + + empathy_window_present (GTK_WINDOW (self->window)); + + /* Display the accounts dialog if needed */ + tp_account_manager_prepare_async (self->account_manager, NULL, + account_manager_ready_cb, self); +} + +static void empathy_app_constructed (GObject *object); + +static void +empathy_app_class_init (EmpathyAppClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkApplicationClass *gtk_app_class = GTK_APPLICATION_CLASS (klass); + GParamSpec *spec; + + gobject_class->set_property = empathy_app_set_property; + gobject_class->constructed = empathy_app_constructed; + gobject_class->dispose = empathy_app_dispose; + gobject_class->finalize = empathy_app_finalize; + + gtk_app_class->activated = empathy_app_activated; + + spec = g_param_spec_boolean ("no-connect", "no connect", + "Don't connect on startup", + FALSE, + G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (gobject_class, PROP_NO_CONNECT, spec); + + spec = g_param_spec_boolean ("start-hidden", "start hidden", + "Don't display the contact list or any other dialogs on startup", + FALSE, + G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (gobject_class, PROP_START_HIDDEN, spec); +} + +static void +empathy_app_init (EmpathyApp *self) +{ +} + static void use_conn_notify_cb (GSettings *gsettings, const gchar *key, @@ -160,54 +362,14 @@ migrate_config_to_xdg_dir (void) } static void -show_accounts_ui (GdkScreen *screen, +show_accounts_ui (EmpathyApp *self, + GdkScreen *screen, gboolean if_needed) { empathy_accounts_dialog_show_application (screen, - NULL, if_needed, start_hidden); + NULL, if_needed, self->start_hidden); } -static UniqueResponse -unique_app_message_cb (UniqueApp *unique_app, - gint command, - UniqueMessageData *data, - guint timestamp, - gpointer user_data) -{ - GtkWindow *window = user_data; - TpAccountManager *account_manager; - - DEBUG ("Other instance launched, presenting the main window. " - "Command=%d, timestamp %u", command, timestamp); - - /* XXX: the standalone app somewhat breaks this case, since - * communicating it would be a pain */ - - /* We're requested to show stuff again, disable the start hidden global - * in case the accounts wizard wants to pop up. - */ - start_hidden = FALSE; - - gtk_window_set_screen (GTK_WINDOW (window), - unique_message_data_get_screen (data)); - gtk_window_set_startup_id (GTK_WINDOW (window), - unique_message_data_get_startup_id (data)); - gtk_window_present_with_time (GTK_WINDOW (window), timestamp); - gtk_window_set_skip_taskbar_hint (window, FALSE); - - account_manager = tp_account_manager_dup (); - tp_account_manager_prepare_async (account_manager, NULL, - account_manager_ready_cb, NULL); - g_object_unref (account_manager); - - return UNIQUE_RESPONSE_OK; -} - -static gboolean show_version_cb (const char *option_name, - const char *value, - gpointer data, - GError **error) G_GNUC_NORETURN; - static gboolean show_version_cb (const char *option_name, const char *value, @@ -251,11 +413,9 @@ account_manager_ready_cb (GObject *source_object, gpointer user_data) { TpAccountManager *manager = TP_ACCOUNT_MANAGER (source_object); + EmpathyApp *self = user_data; GError *error = NULL; - EmpathyIdle *idle; - EmpathyConnectivity *connectivity; TpConnectionPresenceType presence; - GSettings *gsettings = g_settings_new (EMPATHY_PREFS_SCHEMA); if (!tp_account_manager_prepare_finish (manager, result, &error)) { @@ -279,27 +439,21 @@ account_manager_ready_cb (GObject *source_object, } /* Autoconnect */ - idle = empathy_idle_dup_singleton (); - connectivity = empathy_connectivity_dup_singleton (); - presence = tp_account_manager_get_most_available_presence (manager, NULL, NULL); - if (g_settings_get_boolean (gsettings, EMPATHY_PREFS_AUTOCONNECT) && - !no_connect && + if (g_settings_get_boolean (self->gsettings, EMPATHY_PREFS_AUTOCONNECT) && + !self->no_connect && tp_connection_presence_type_cmp_availability (presence, TP_CONNECTION_PRESENCE_TYPE_OFFLINE) <= 0) /* if current state is Offline, then put it online */ - empathy_idle_set_state (idle, TP_CONNECTION_PRESENCE_TYPE_AVAILABLE); + empathy_idle_set_state (self->idle, + TP_CONNECTION_PRESENCE_TYPE_AVAILABLE); /* Pop up the accounts dialog if we don't have any account */ if (!empathy_accounts_has_accounts (manager)) - show_accounts_ui (gdk_screen_get_default (), TRUE); - - g_object_unref (idle); - g_object_unref (connectivity); - g_object_unref (gsettings); + show_accounts_ui (self, gdk_screen_get_default (), TRUE); } static void @@ -396,70 +550,14 @@ empathy_idle_set_auto_away_cb (GSettings *gsettings, g_settings_get_boolean (gsettings, key)); } -int -main (int argc, char *argv[]) +static void +empathy_app_constructed (GObject *object) { -#ifdef HAVE_GEOCLUE - EmpathyLocationManager *location_manager = NULL; -#endif - EmpathyStatusIcon *icon; - EmpathyDispatcher *dispatcher; - TpAccountManager *account_manager; - TplLogManager *log_manager; - EmpathyChatroomManager *chatroom_manager; - EmpathyFTFactory *ft_factory; - GtkWidget *window; - EmpathyIdle *idle; - EmpathyConnectivity *connectivity; - EmpathyChatManager *chat_manager; + EmpathyApp *self = (EmpathyApp *) object; GError *error = NULL; - UniqueApp *unique_app; gboolean chatroom_manager_ready; - gboolean autoaway = TRUE; -#ifdef ENABLE_DEBUG - TpDebugSender *debug_sender; -#endif - GSettings *gsettings; + gboolean autoaway; - GOptionContext *optcontext; - GOptionEntry options[] = { - { "no-connect", 'n', - 0, G_OPTION_ARG_NONE, &no_connect, - N_("Don't connect on startup"), - NULL }, - { "start-hidden", 'h', - 0, G_OPTION_ARG_NONE, &start_hidden, - N_("Don't display the contact list or any other dialogs on startup"), - NULL }, - { "version", 'v', - G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, show_version_cb, - NULL, NULL }, - { NULL } - }; - - /* Init */ - g_thread_init (NULL); - -#ifdef HAVE_LIBCHAMPLAIN - gtk_clutter_init (&argc, &argv); -#endif - - empathy_init (); - - optcontext = g_option_context_new (N_("- Empathy IM Client")); - g_option_context_add_group (optcontext, gtk_get_option_group (TRUE)); - g_option_context_add_main_entries (optcontext, options, GETTEXT_PACKAGE); - - if (!g_option_context_parse (optcontext, &argc, &argv, &error)) { - g_print ("%s\nRun '%s --help' to see a full list of available command line options.\n", - error->message, argv[0]); - g_warning ("Error in empathy init: %s", error->message); - return EXIT_FAILURE; - } - - g_option_context_free (optcontext); - - empathy_gtk_init (); g_set_application_name (_(PACKAGE_NAME)); gtk_window_set_default_icon_name ("empathy"); @@ -467,90 +565,77 @@ main (int argc, char *argv[]) #ifdef ENABLE_DEBUG /* Set up debug sender */ - debug_sender = tp_debug_sender_dup (); + self->debug_sender = tp_debug_sender_dup (); g_log_set_default_handler (tp_debug_sender_log_handler, G_LOG_DOMAIN); #endif - unique_app = unique_app_new ("org.gnome."PACKAGE_NAME, NULL); - - if (unique_app_is_running (unique_app)) - { - if (unique_app_send_message (unique_app, UNIQUE_ACTIVATE, NULL) == - UNIQUE_RESPONSE_OK) - { - g_object_unref (unique_app); - return EXIT_SUCCESS; - } - } - notify_init (_(PACKAGE_NAME)); /* Setting up Idle */ - idle = empathy_idle_dup_singleton (); + self->idle = empathy_idle_dup_singleton (); - gsettings = g_settings_new (EMPATHY_PREFS_SCHEMA); - autoaway = g_settings_get_boolean (gsettings, EMPATHY_PREFS_AUTOAWAY); + self->gsettings = g_settings_new (EMPATHY_PREFS_SCHEMA); + autoaway = g_settings_get_boolean (self->gsettings, EMPATHY_PREFS_AUTOAWAY); - g_signal_connect (gsettings, + g_signal_connect (self->gsettings, "changed::" EMPATHY_PREFS_AUTOAWAY, - G_CALLBACK (empathy_idle_set_auto_away_cb), idle); + G_CALLBACK (empathy_idle_set_auto_away_cb), self->idle); - empathy_idle_set_auto_away (idle, autoaway); + empathy_idle_set_auto_away (self->idle, autoaway); /* Setting up Connectivity */ - connectivity = empathy_connectivity_dup_singleton (); - use_conn_notify_cb (gsettings, EMPATHY_PREFS_USE_CONN, - connectivity); - g_signal_connect (gsettings, + self->connectivity = empathy_connectivity_dup_singleton (); + use_conn_notify_cb (self->gsettings, EMPATHY_PREFS_USE_CONN, + self->connectivity); + g_signal_connect (self->gsettings, "changed::" EMPATHY_PREFS_USE_CONN, - G_CALLBACK (use_conn_notify_cb), connectivity); + G_CALLBACK (use_conn_notify_cb), self->connectivity); /* account management */ - account_manager = tp_account_manager_dup (); - tp_account_manager_prepare_async (account_manager, NULL, - account_manager_ready_cb, NULL); + self->account_manager = tp_account_manager_dup (); + tp_account_manager_prepare_async (self->account_manager, NULL, + account_manager_ready_cb, self); /* The EmpathyDispatcher doesn't dispatch anything any more but we have to * keep it around as we still use it to request channels */ - dispatcher = empathy_dispatcher_dup_singleton (); + self->dispatcher = empathy_dispatcher_dup_singleton (); migrate_config_to_xdg_dir (); /* Setting up UI */ - window = empathy_main_window_dup (); - gtk_widget_show (window); - icon = empathy_status_icon_new (GTK_WINDOW (window), start_hidden); + self->window = empathy_main_window_dup (); + gtk_widget_show (self->window); + self->icon = empathy_status_icon_new (GTK_WINDOW (self->window), + self->start_hidden); /* Chat manager */ - chat_manager = empathy_chat_manager_dup_singleton (); - - g_signal_connect (unique_app, "message-received", - G_CALLBACK (unique_app_message_cb), window); + self->chat_manager = empathy_chat_manager_dup_singleton (); /* Logging */ - log_manager = tpl_log_manager_dup_singleton (); + self->log_manager = tpl_log_manager_dup_singleton (); - chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL); + self->chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL); - g_object_get (chatroom_manager, "ready", &chatroom_manager_ready, NULL); + g_object_get (self->chatroom_manager, "ready", &chatroom_manager_ready, NULL); if (!chatroom_manager_ready) { - g_signal_connect (G_OBJECT (chatroom_manager), "notify::ready", - G_CALLBACK (chatroom_manager_ready_cb), account_manager); + g_signal_connect (G_OBJECT (self->chatroom_manager), "notify::ready", + G_CALLBACK (chatroom_manager_ready_cb), self->account_manager); } else { - chatroom_manager_ready_cb (chatroom_manager, NULL, account_manager); + chatroom_manager_ready_cb (self->chatroom_manager, NULL, + self->account_manager); } /* Create the FT factory */ - ft_factory = empathy_ft_factory_dup_singleton (); - g_signal_connect (ft_factory, "new-ft-handler", + self->ft_factory = empathy_ft_factory_dup_singleton (); + g_signal_connect (self->ft_factory, "new-ft-handler", G_CALLBACK (new_ft_handler_cb), NULL); - g_signal_connect (ft_factory, "new-incoming-transfer", + g_signal_connect (self->ft_factory, "new-incoming-transfer", G_CALLBACK (new_incoming_transfer_cb), NULL); - if (!empathy_ft_factory_register (ft_factory, &error)) + if (!empathy_ft_factory_register (self->ft_factory, &error)) { g_warning ("Failed to register FileTransfer handler: %s", error->message); g_error_free (error); @@ -558,35 +643,64 @@ main (int argc, char *argv[]) /* Location mananger */ #ifdef HAVE_GEOCLUE - location_manager = empathy_location_manager_dup_singleton (); + self->location_manager = empathy_location_manager_dup_singleton (); #endif +} - gtk_main (); +int +main (int argc, char *argv[]) +{ + EmpathyApp *app; + GError *error = NULL; + GOptionContext *optcontext; + gboolean no_connect = FALSE, start_hidden = FALSE; + GOptionEntry options[] = { + { "no-connect", 'n', + 0, G_OPTION_ARG_NONE, &no_connect, + N_("Don't connect on startup"), + NULL }, + { "start-hidden", 'h', + 0, G_OPTION_ARG_NONE, &start_hidden, + N_("Don't display the contact list or any other dialogs on startup"), + NULL }, + { "version", 'v', + G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, show_version_cb, + NULL, NULL }, + { NULL } + }; - empathy_idle_set_state (idle, TP_CONNECTION_PRESENCE_TYPE_OFFLINE); + g_thread_init (NULL); + g_type_init (); -#ifdef ENABLE_DEBUG - g_object_unref (debug_sender); +#ifdef HAVE_LIBCHAMPLAIN + gtk_clutter_init (&argc, &argv); #endif - g_object_unref (chat_manager); - g_object_unref (idle); - g_object_unref (connectivity); - g_object_unref (icon); - g_object_unref (account_manager); - g_object_unref (log_manager); - g_object_unref (dispatcher); - g_object_unref (chatroom_manager); -#ifdef HAVE_GEOCLUE - g_object_unref (location_manager); -#endif - g_object_unref (ft_factory); - g_object_unref (unique_app); - g_object_unref (gsettings); - gtk_widget_destroy (window); + empathy_init (); + + optcontext = g_option_context_new (N_("- Empathy IM Client")); + g_option_context_add_group (optcontext, gtk_get_option_group (TRUE)); + g_option_context_add_main_entries (optcontext, options, GETTEXT_PACKAGE); + + if (!g_option_context_parse (optcontext, &argc, &argv, &error)) { + g_print ("%s\nRun '%s --help' to see a full list of available command line options.\n", + error->message, argv[0]); + g_warning ("Error in empathy init: %s", error->message); + return EXIT_FAILURE; + } + + g_option_context_free (optcontext); + + empathy_gtk_init (); + + app = empathy_app_new (argc, (const gchar * const *) argv, + no_connect, start_hidden); + + gtk_application_run (GTK_APPLICATION (app)); notify_uninit (); xmlCleanupParser (); + g_object_unref (app); return EXIT_SUCCESS; } |