From 60e19a5cd6acce9af9b19d013eb396f12ea42abe Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 10 Jul 2012 16:03:17 +0200 Subject: factor out empathy_display_individual_info() It didn't want to put more misc stuffs to ui-utils so used this file. https://bugzilla.gnome.org/show_bug.cgi?id=679111 --- .../empathy-individual-information-dialog.c | 138 +++++++++++++++++++++ .../empathy-individual-information-dialog.h | 2 + libempathy-gtk/empathy-individual-menu.c | 128 +------------------ 3 files changed, 141 insertions(+), 127 deletions(-) (limited to 'libempathy-gtk') diff --git a/libempathy-gtk/empathy-individual-information-dialog.c b/libempathy-gtk/empathy-individual-information-dialog.c index 42bfb2053..9ac783aca 100644 --- a/libempathy-gtk/empathy-individual-information-dialog.c +++ b/libempathy-gtk/empathy-individual-information-dialog.c @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -35,11 +36,15 @@ #include #include +#include #include "empathy-individual-information-dialog.h" #include "empathy-individual-widget.h" #include "empathy-ui-utils.h" +#define DEBUG_FLAG EMPATHY_DEBUG_CONTACT +#include + #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIndividualInformationDialog) typedef struct { FolksIndividual *individual; @@ -316,3 +321,136 @@ empathy_individual_information_dialog_init ( g_signal_connect (dialog, "response", G_CALLBACK (individual_dialogs_response_cb), &information_dialogs); } + +static void +show_gnome_contacts_error_dialog (void) +{ + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + _("gnome-contacts not installed")); + + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("Please install gnome-contacts to access contacts details.")); + + g_signal_connect_swapped (dialog, "response", + G_CALLBACK (gtk_widget_destroy), dialog); + + gtk_widget_show (dialog); +} + +static void +start_gnome_contacts (FolksIndividual *individual, + gboolean try_installing); + +static void +install_gnome_contacts_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + FolksIndividual *individual = user_data; + GError *error = NULL; + + if (!empathy_pkg_kit_install_packages_finish (result, &error)) + { + DEBUG ("Failed to install gnome-contacts: %s", error->message); + g_error_free (error); + + show_gnome_contacts_error_dialog (); + goto out; + } + + DEBUG ("gnome-contacts installed"); + + start_gnome_contacts (individual, FALSE); + +out: + g_object_unref (individual); +} + +static void +start_gnome_contacts (FolksIndividual *individual, + gboolean try_installing) +{ + GDesktopAppInfo *desktop_info; + gchar *cmd; + GAppInfo *app_info; + GError *error = NULL; + GdkAppLaunchContext *context = NULL; + GdkDisplay *display; + + g_return_if_fail (FOLKS_IS_INDIVIDUAL (individual)); + + /* Start gnome-contacts */ + display = gdk_display_get_default (); + context = gdk_display_get_app_launch_context (display); + + desktop_info = g_desktop_app_info_new ("gnome-contacts.desktop"); + if (desktop_info == NULL) + { + if (try_installing) + { + const gchar *packages[] = { "gnome-contacts", NULL }; + + DEBUG ("gnome-contacts not installed; try to install it"); + + empathy_pkg_kit_install_packages_async (0, packages, NULL, + NULL, install_gnome_contacts_cb, g_object_ref (individual)); + } + else + { + show_gnome_contacts_error_dialog (); + } + + return; + } + + /* glib doesn't have API to start a desktop file with args... (#637875) */ + cmd = g_strdup_printf ("%s -i %s", g_app_info_get_commandline ( + (GAppInfo *) desktop_info), folks_individual_get_id (individual)); + + app_info = g_app_info_create_from_commandline (cmd, NULL, 0, &error); + if (app_info == NULL) + { + DEBUG ("Failed to create app_info: %s", error->message); + g_error_free (error); + return; + } + + if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context, + &error)) + { + g_critical ("Failed to start gnome-contacts: %s", error->message); + g_error_free (error); + } + + g_object_unref (desktop_info); + g_object_unref (app_info); +} + +/* Use gnome-contacts to display @individual or fallback to + * EmpathyIndividualInformationDialog if user is not not in Folks. + */ +void +empathy_display_individual_info (FolksIndividual *individual) +{ + EmpathyIndividualManager *mgr; + + mgr = empathy_individual_manager_dup_singleton (); + + /* Only use gnome-contacts if that's a 'real' individual we got from + * Folks (and so the individual manager knows about it). If not that's a + * MUC contact and we use the simple dialog. */ + if (empathy_individual_manager_lookup_member (mgr, + folks_individual_get_id (individual)) != NULL) + { + start_gnome_contacts (individual, TRUE); + } + else + { + empathy_individual_information_dialog_show (individual, NULL); + } + + g_object_unref (mgr); +} diff --git a/libempathy-gtk/empathy-individual-information-dialog.h b/libempathy-gtk/empathy-individual-information-dialog.h index aad26702f..cdba07a61 100644 --- a/libempathy-gtk/empathy-individual-information-dialog.h +++ b/libempathy-gtk/empathy-individual-information-dialog.h @@ -55,6 +55,8 @@ GType empathy_individual_information_dialog_get_type (void) G_GNUC_CONST; void empathy_individual_information_dialog_show (FolksIndividual *individual, GtkWindow *parent); +void empathy_display_individual_info (FolksIndividual *individual); + G_END_DECLS #endif /* __EMPATHY_INDIVIDUAL_INFORMATION_DIALOG_H__ */ diff --git a/libempathy-gtk/empathy-individual-menu.c b/libempathy-gtk/empathy-individual-menu.c index bd02325c3..5b83b2931 100644 --- a/libempathy-gtk/empathy-individual-menu.c +++ b/libempathy-gtk/empathy-individual-menu.c @@ -26,7 +26,6 @@ #include #include -#include #include @@ -38,7 +37,6 @@ #include #include #include -#include #include "empathy-account-selector-dialog.h" #include "empathy-individual-menu.h" @@ -1464,135 +1462,11 @@ empathy_individual_favourite_menu_item_new (FolksIndividual *individual) return item; } -static void -show_gnome_contacts_error_dialog (void) -{ - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, - _("gnome-contacts not installed")); - - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - _("Please install gnome-contacts to access contacts details.")); - - g_signal_connect_swapped (dialog, "response", - G_CALLBACK (gtk_widget_destroy), dialog); - - gtk_widget_show (dialog); -} - -static void -start_gnome_contacts (FolksIndividual *individual, - gboolean try_installing); - -static void -install_gnome_contacts_cb (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - FolksIndividual *individual = user_data; - GError *error = NULL; - - if (!empathy_pkg_kit_install_packages_finish (result, &error)) - { - DEBUG ("Failed to install gnome-contacts: %s", error->message); - g_error_free (error); - - show_gnome_contacts_error_dialog (); - goto out; - } - - DEBUG ("gnome-contacts installed"); - - start_gnome_contacts (individual, FALSE); - -out: - g_object_unref (individual); -} - -static void -start_gnome_contacts (FolksIndividual *individual, - gboolean try_installing) -{ - GDesktopAppInfo *desktop_info; - gchar *cmd; - GAppInfo *app_info; - GError *error = NULL; - GdkAppLaunchContext *context = NULL; - GdkDisplay *display; - - g_return_if_fail (FOLKS_IS_INDIVIDUAL (individual)); - - /* Start gnome-contacts */ - display = gdk_display_get_default (); - context = gdk_display_get_app_launch_context (display); - - desktop_info = g_desktop_app_info_new ("gnome-contacts.desktop"); - if (desktop_info == NULL) - { - if (try_installing) - { - const gchar *packages[] = { "gnome-contacts", NULL }; - - DEBUG ("gnome-contacts not installed; try to install it"); - - empathy_pkg_kit_install_packages_async (0, packages, NULL, - NULL, install_gnome_contacts_cb, g_object_ref (individual)); - } - else - { - show_gnome_contacts_error_dialog (); - } - - return; - } - - /* glib doesn't have API to start a desktop file with args... (#637875) */ - cmd = g_strdup_printf ("%s -i %s", g_app_info_get_commandline ( - (GAppInfo *) desktop_info), folks_individual_get_id (individual)); - - app_info = g_app_info_create_from_commandline (cmd, NULL, 0, &error); - if (app_info == NULL) - { - DEBUG ("Failed to create app_info: %s", error->message); - g_error_free (error); - return; - } - - if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context, - &error)) - { - g_critical ("Failed to start gnome-contacts: %s", error->message); - g_error_free (error); - } - - g_object_unref (desktop_info); - g_object_unref (app_info); -} - static void individual_info_menu_item_activate_cb (GtkMenuItem *item, FolksIndividual *individual) { - EmpathyIndividualManager *mgr; - - mgr = empathy_individual_manager_dup_singleton (); - - /* Only use gnome-contacts if that's a 'real' individual we got from - * Folks (and so the individual manager knows about it). If not that's a - * MUC contact and we use the simple dialog. */ - if (empathy_individual_manager_lookup_member (mgr, - folks_individual_get_id (individual)) != NULL) - { - start_gnome_contacts (individual, TRUE); - } - else - { - empathy_individual_information_dialog_show (individual, NULL); - } - - g_object_unref (mgr); + empathy_display_individual_info (individual); } static GtkWidget * -- cgit v1.2.3