X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=src%2Fempathy-main-window.c;h=f3722524bb83abbe2f2994f5f8e0ce41c6c7f9ff;hp=02c400ab8301c120af453f8458147867e2aa47ca;hb=e3598826ad6ede2f72fbee91c528e621f6dce926;hpb=a6a4c117c17659134df600c9b96f8cceb07f44ef diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c index 02c400ab..f3722524 100644 --- a/src/empathy-main-window.c +++ b/src/empathy-main-window.c @@ -204,18 +204,15 @@ main_window_flash_foreach (GtkTreeModel *model, GdkPixbuf *pixbuf = NULL; gtk_tree_model_get (model, iter, - EMPATHY_INDIVIDUAL_STORE_COL_INDIVIDUAL, - &individual, + EMPATHY_INDIVIDUAL_STORE_COL_INDIVIDUAL, &individual, -1); if (individual == NULL) return FALSE; contact = empathy_contact_dup_from_folks_individual (individual); - if (contact != data->event->contact) { - tp_clear_object (&contact); - return FALSE; - } + if (contact != data->event->contact) + goto out; if (data->on) { icon_name = data->event->icon_name; @@ -244,6 +241,7 @@ main_window_flash_foreach (GtkTreeModel *model, gtk_tree_path_free (parent_path); } +out: g_object_unref (individual); tp_clear_object (&contact); tp_clear_object (&pixbuf); @@ -433,12 +431,94 @@ main_window_auth_display (EmpathyMainWindow *window, g_hash_table_insert (priv->auths, event, info_bar); } +static void +modify_event_count (GtkTreeModel *model, + GtkTreeIter *iter, + EmpathyEvent *event, + gboolean increase) +{ + FolksIndividual *individual; + EmpathyContact *contact; + guint count; + + gtk_tree_model_get (model, iter, + EMPATHY_INDIVIDUAL_STORE_COL_INDIVIDUAL, &individual, + EMPATHY_INDIVIDUAL_STORE_COL_EVENT_COUNT, &count, + -1); + + if (individual == NULL) + return; + + increase ? count++ : count--; + + contact = empathy_contact_dup_from_folks_individual (individual); + if (contact == event->contact) { + gtk_tree_store_set (GTK_TREE_STORE (model), iter, + EMPATHY_INDIVIDUAL_STORE_COL_EVENT_COUNT, count, -1); + } + + tp_clear_object (&contact); + g_object_unref (individual); +} + +static gboolean +increase_event_count_foreach (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer user_data) +{ + EmpathyEvent *event = user_data; + + modify_event_count (model, iter, event, TRUE); + + return FALSE; +} + +static void +increase_event_count (EmpathyMainWindow *self, + EmpathyEvent *event) +{ + EmpathyMainWindowPriv *priv = GET_PRIV (self); + GtkTreeModel *model; + + model = GTK_TREE_MODEL (priv->individual_store); + + gtk_tree_model_foreach (model, increase_event_count_foreach, event); +} + +static gboolean +decrease_event_count_foreach (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer user_data) +{ + EmpathyEvent *event = user_data; + + modify_event_count (model, iter, event, FALSE); + + return FALSE; +} + +static void +decrease_event_count (EmpathyMainWindow *self, + EmpathyEvent *event) +{ + EmpathyMainWindowPriv *priv = GET_PRIV (self); + GtkTreeModel *model; + + model = GTK_TREE_MODEL (priv->individual_store); + + gtk_tree_model_foreach (model, decrease_event_count_foreach, event); +} + static void main_window_event_added_cb (EmpathyEventManager *manager, EmpathyEvent *event, EmpathyMainWindow *window) { if (event->contact) { + increase_event_count (window, event); + main_window_flash_start (window); } else if (event->type == EMPATHY_EVENT_TYPE_AUTH) { main_window_auth_display (window, event); @@ -462,6 +542,8 @@ main_window_event_removed_cb (EmpathyEventManager *manager, return; } + decrease_event_count (window, event); + data.on = FALSE; data.event = event; data.window = window; @@ -817,20 +899,17 @@ main_window_balance_activate_cb (GtkAction *action, static void main_window_balance_update_balance (GtkAction *action, - GValueArray *balance) + TpConnection *conn) { - TpAccount *account = g_object_get_data (G_OBJECT (action), "account"); + TpAccount *account = tp_connection_get_account (conn); GtkWidget *label; int amount = 0; guint scale = G_MAXINT32; - const char *currency = ""; + const gchar *currency = ""; char *money, *str; - if (balance != NULL) - tp_value_array_unpack (balance, 3, - &amount, - &scale, - ¤cy); + if (!tp_connection_get_balance (conn, &amount, &scale, ¤cy)) + return; if (amount == 0 && scale == G_MAXINT32 && @@ -860,42 +939,14 @@ main_window_balance_update_balance (GtkAction *action, g_free (money); } -static void -main_window_setup_balance_got_balance_props (TpProxy *conn, - GHashTable *props, - const GError *in_error, - gpointer user_data, - GObject *action) -{ - GValueArray *balance = NULL; - const char *uri; - - if (in_error != NULL) { - DEBUG ("Failed to get account balance properties: %s", - in_error->message); - goto finally; - } - - balance = tp_asv_get_boxed (props, "AccountBalance", - TP_STRUCT_TYPE_CURRENCY_AMOUNT); - uri = tp_asv_get_string (props, "ManageCreditURI"); - - g_object_set_data_full (action, "manage-credit-uri", - g_strdup (uri), g_free); - gtk_action_set_sensitive (GTK_ACTION (action), !tp_str_empty (uri)); - -finally: - main_window_balance_update_balance (GTK_ACTION (action), balance); -} - static void main_window_balance_changed_cb (TpConnection *conn, - const GValueArray *balance, - gpointer user_data, - GObject *action) + guint balance, + guint scale, + const gchar *currency, + GtkAction *action) { - main_window_balance_update_balance (GTK_ACTION (action), - (GValueArray *) balance); + main_window_balance_update_balance (action, conn); } static GtkAction * @@ -926,7 +977,6 @@ main_window_setup_balance_create_action (EmpathyMainWindow *window, g_object_bind_property (account, "icon-name", action, "icon-name", G_BINDING_SYNC_CREATE); - g_object_set_data (G_OBJECT (action), "account", account); g_signal_connect (action, "activate", G_CALLBACK (main_window_balance_activate_cb), window); @@ -965,15 +1015,12 @@ main_window_setup_balance_create_action (EmpathyMainWindow *window, static GtkWidget * main_window_setup_balance_create_widget (EmpathyMainWindow *window, - GtkAction *action) + GtkAction *action, + TpAccount *account) { EmpathyMainWindowPriv *priv = GET_PRIV (window); - TpAccount *account; GtkWidget *hbox, *image, *label, *button; - account = g_object_get_data (G_OBJECT (action), "account"); - g_return_val_if_fail (TP_IS_ACCOUNT (account), NULL); - hbox = gtk_hbox_new (FALSE, 6); /* protocol icon */ @@ -1012,27 +1059,19 @@ main_window_setup_balance_create_widget (EmpathyMainWindow *window, } static void -main_window_setup_balance_conn_ready (GObject *conn, - GAsyncResult *result, - gpointer user_data) +main_window_setup_balance (EmpathyMainWindow *window, + TpAccount *account) { - EmpathyMainWindow *window = user_data; EmpathyMainWindowPriv *priv = GET_PRIV (window); - TpAccount *account = g_object_get_data (conn, "account"); + TpConnection *conn = tp_account_get_connection (account); GtkAction *action; - GError *error = NULL; + const gchar *uri; - if (!tp_proxy_prepare_finish (conn, result, &error)) { - DEBUG ("Failed to prepare connection: %s", error->message); - - g_error_free (error); + if (conn == NULL) return; - } - if (!tp_proxy_has_interface_by_id (conn, - TP_IFACE_QUARK_CONNECTION_INTERFACE_BALANCE)) { + if (!tp_proxy_is_prepared (conn, TP_CONNECTION_FEATURE_BALANCE)) return; - } DEBUG ("Setting up balance for acct: %s", tp_account_get_display_name (account)); @@ -1046,33 +1085,20 @@ main_window_setup_balance_conn_ready (GObject *conn, gtk_action_set_visible (priv->view_balance_show_in_roster, TRUE); /* create the display widget */ - main_window_setup_balance_create_widget (window, action); + main_window_setup_balance_create_widget (window, action, account); - /* request the current balance and monitor for any changes */ - tp_cli_dbus_properties_call_get_all (conn, -1, - TP_IFACE_CONNECTION_INTERFACE_BALANCE, - main_window_setup_balance_got_balance_props, - window, NULL, G_OBJECT (action)); + /* check the current balance and monitor for any changes */ + uri = tp_connection_get_balance_uri (conn); - tp_cli_connection_interface_balance_connect_to_balance_changed ( - TP_CONNECTION (conn), main_window_balance_changed_cb, - window, NULL, G_OBJECT (action), NULL); -} + g_object_set_data_full (G_OBJECT (action), "manage-credit-uri", + g_strdup (uri), g_free); + gtk_action_set_sensitive (GTK_ACTION (action), !tp_str_empty (uri)); -static void -main_window_setup_balance (EmpathyMainWindow *window, - TpAccount *account) -{ - TpConnection *conn = tp_account_get_connection (account); + main_window_balance_update_balance (GTK_ACTION (action), conn); - if (conn == NULL) - return; + g_signal_connect (conn, "balance-changed", + G_CALLBACK (main_window_balance_changed_cb), action); - /* need to prepare the connection: - * store the account on the connection */ - g_object_set_data (G_OBJECT (conn), "account", account); - tp_proxy_prepare_async (conn, NULL, - main_window_setup_balance_conn_ready, window); } static void @@ -1821,9 +1847,9 @@ main_window_edit_blocked_contacts_cb (GtkAction *action, G_CALLBACK (gtk_widget_destroy), NULL); } -static void -main_window_edit_preferences_cb (GtkAction *action, - EmpathyMainWindow *window) +void +empathy_main_window_show_preferences (EmpathyMainWindow *window, + const gchar *tab) { EmpathyMainWindowPriv *priv = GET_PRIV (window); @@ -1836,6 +1862,17 @@ main_window_edit_preferences_cb (GtkAction *action, } else { gtk_window_present (GTK_WINDOW (priv->preferences)); } + + if (tab != NULL) + empathy_preferences_show_tab ( + EMPATHY_PREFERENCES (priv->preferences), tab); +} + +static void +main_window_edit_preferences_cb (GtkAction *action, + EmpathyMainWindow *window) +{ + empathy_main_window_show_preferences (window, NULL); } static void @@ -1849,42 +1886,7 @@ static void main_window_help_debug_cb (GtkAction *action, EmpathyMainWindow *window) { - GdkDisplay *display; - GError *error = NULL; - gchar *path; - GAppInfo *app_info; - GdkAppLaunchContext *context = NULL; - - /* Try to run from source directory if possible */ - path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"), "src", - "empathy-debugger", NULL); - - if (!g_file_test (path, G_FILE_TEST_EXISTS)) { - g_free (path); - path = g_build_filename (BIN_DIR, "empathy-debugger", NULL); - } - - app_info = g_app_info_create_from_commandline (path, NULL, 0, &error); - if (app_info == NULL) { - DEBUG ("Failed to create app info: %s", error->message); - g_error_free (error); - goto out; - } - - display = gdk_display_get_default (); - context = gdk_display_get_app_launch_context (display); - - if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context, - &error)) { - g_warning ("Failed to open debug window: %s", error->message); - g_error_free (error); - goto out; - } - -out: - tp_clear_object (&app_info); - tp_clear_object (&context); - g_free (path); + empathy_launch_program (BIN_DIR, "empathy-debugger", NULL); } static void @@ -1982,9 +1984,11 @@ main_window_connection_items_setup (EmpathyMainWindow *window, "room_join_favorites", "chat_new_message", "chat_new_call", + "chat_search_contacts", "chat_add_contact", "edit_personal_information", - "edit_blocked_contacts" + "edit_blocked_contacts", + "edit_search_contacts" }; for (i = 0, list = NULL; i < G_N_ELEMENTS (actions_connected); i++) { @@ -2006,7 +2010,7 @@ account_manager_prepared_cb (GObject *source_object, EmpathyMainWindowPriv *priv = GET_PRIV (window); GError *error = NULL; - if (!tp_account_manager_prepare_finish (manager, result, &error)) { + if (!tp_proxy_prepare_finish (manager, result, &error)) { DEBUG ("Failed to prepare account manager: %s", error->message); g_error_free (error); return; @@ -2094,7 +2098,7 @@ empathy_main_window_init (EmpathyMainWindow *window) { EmpathyMainWindowPriv *priv; EmpathyIndividualManager *individual_manager; - GtkBuilder *gui; + GtkBuilder *gui, *gui_mgr; GtkWidget *sw; GtkToggleAction *show_offline_widget; GtkAction *show_map_widget; @@ -2103,6 +2107,8 @@ empathy_main_window_init (EmpathyMainWindow *window) gchar *filename; GSList *l; GtkTreeModel *model; + GtkWidget *search_vbox; + GtkWidget *menubar; priv = window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window, EMPATHY_TYPE_MAIN_WINDOW, EmpathyMainWindowPriv); @@ -2116,6 +2122,10 @@ empathy_main_window_init (EmpathyMainWindow *window) gtk_window_set_role (GTK_WINDOW (window), "contact_list"); gtk_window_set_default_size (GTK_WINDOW (window), 225, 325); + /* don't finalize the widget on delete-event, just hide it */ + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_widget_hide_on_delete), NULL); + /* Set up interface */ filename = empathy_file_lookup ("empathy-main-window.ui", "src"); gui = empathy_builder_get_file (filename, @@ -2123,6 +2133,17 @@ empathy_main_window_init (EmpathyMainWindow *window) "balance_vbox", &priv->balance_vbox, "errors_vbox", &priv->errors_vbox, "auth_vbox", &priv->auth_vbox, + "search_vbox", &search_vbox, + "presence_toolbar", &priv->presence_toolbar, + "notebook", &priv->notebook, + "no_entry_label", &priv->no_entry_label, + "roster_scrolledwindow", &sw, + NULL); + g_free (filename); + + /* Set UI manager */ + filename = empathy_file_lookup ("empathy-main-window-menubar.ui", "src"); + gui_mgr = empathy_builder_get_file (filename, "ui_manager", &priv->ui_manager, "view_show_offline", &show_offline_widget, "view_show_protocols", &priv->show_protocols, @@ -2134,21 +2155,24 @@ empathy_main_window_init (EmpathyMainWindow *window) "view_history", &priv->view_history, "view_show_map", &show_map_widget, "room_join_favorites", &priv->room_join_favorites, - "presence_toolbar", &priv->presence_toolbar, - "notebook", &priv->notebook, - "no_entry_label", &priv->no_entry_label, - "roster_scrolledwindow", &sw, "view_balance_show_in_roster", &priv->view_balance_show_in_roster, + "menubar", &menubar, NULL); g_free (filename); + /* The UI manager is living in its own .ui file as Glade doesn't support + * those. The GtkMenubar has to be in this file as well to we manually add + * it to the first position of the vbox. */ + gtk_box_pack_start (GTK_BOX (priv->main_vbox), menubar, FALSE, FALSE, 0); + gtk_box_reorder_child (GTK_BOX (priv->main_vbox), menubar, 0); + gtk_container_add (GTK_CONTAINER (window), priv->main_vbox); gtk_widget_show (priv->main_vbox); g_signal_connect (window, "key-press-event", G_CALLBACK (main_window_key_press_event_cb), NULL); - empathy_builder_connect (gui, window, + empathy_builder_connect (gui_mgr, window, "chat_quit", "activate", main_window_chat_quit_cb, "chat_new_message", "activate", main_window_chat_new_message_cb, "chat_new_call", "activate", main_window_chat_new_call_cb, @@ -2176,10 +2200,11 @@ empathy_main_window_init (EmpathyMainWindow *window) NULL); /* Set up connection related widgets. */ - main_window_connection_items_setup (window, gui); + main_window_connection_items_setup (window, gui_mgr); g_object_ref (priv->ui_manager); g_object_unref (gui); + g_object_unref (gui_mgr); #ifndef HAVE_LIBCHAMPLAIN gtk_action_set_visible (show_map_widget, FALSE); @@ -2187,7 +2212,7 @@ empathy_main_window_init (EmpathyMainWindow *window) priv->account_manager = tp_account_manager_dup (); - tp_account_manager_prepare_async (priv->account_manager, NULL, + tp_proxy_prepare_async (priv->account_manager, NULL, account_manager_prepared_cb, window); priv->errors = g_hash_table_new_full (g_direct_hash, @@ -2230,7 +2255,6 @@ empathy_main_window_init (EmpathyMainWindow *window) /* Set up the throbber */ priv->throbber = gtk_spinner_new (); gtk_widget_set_size_request (priv->throbber, 16, -1); - gtk_widget_set_tooltip_text (priv->throbber, _("Show and edit accounts")); gtk_widget_set_events (priv->throbber, GDK_BUTTON_PRESS_MASK); g_signal_connect (priv->throbber, "button-press-event", G_CALLBACK (main_window_throbber_button_press_event_cb), @@ -2278,8 +2302,9 @@ empathy_main_window_init (EmpathyMainWindow *window) GTK_WIDGET (priv->individual_view)); empathy_individual_view_set_live_search (priv->individual_view, EMPATHY_LIVE_SEARCH (priv->search_bar)); - gtk_box_pack_start (GTK_BOX (priv->main_vbox), priv->search_bar, + gtk_box_pack_start (GTK_BOX (search_vbox), priv->search_bar, FALSE, TRUE, 0); + g_signal_connect_swapped (window, "map", G_CALLBACK (gtk_widget_grab_focus), priv->individual_view);