X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=src%2Fempathy-main-window.c;h=0e75b1cbe07e4abba421779f973c36114dafd986;hp=9cc65ba61ad3a9887f1b4e93b34b2f6a8d04715a;hb=378393285bb5de21c4da85b2e64e044faef6f5b6;hpb=f2ee2965a27340b7701c36230eb8ef0e7ecc6e8f diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c index 9cc65ba6..0e75b1cb 100644 --- a/src/empathy-main-window.c +++ b/src/empathy-main-window.c @@ -431,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); @@ -460,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,7 +901,7 @@ static void main_window_balance_update_balance (GtkAction *action, 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; @@ -893,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); @@ -932,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 */ @@ -979,24 +1059,16 @@ main_window_setup_balance_create_widget (EmpathyMainWindow *window, } static void -main_window_setup_balance_conn_ready (GObject *source, - GAsyncResult *result, - gpointer user_data) +main_window_setup_balance (EmpathyMainWindow *window, + TpAccount *account) { - EmpathyMainWindow *window = user_data; EmpathyMainWindowPriv *priv = GET_PRIV (window); - TpConnection *conn = TP_CONNECTION (source); - TpAccount *account = g_object_get_data (source, "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_is_prepared (conn, TP_CONNECTION_FEATURE_BALANCE)) return; @@ -1013,7 +1085,7 @@ main_window_setup_balance_conn_ready (GObject *source, 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); /* check the current balance and monitor for any changes */ uri = tp_connection_get_balance_uri (conn); @@ -1026,23 +1098,7 @@ main_window_setup_balance_conn_ready (GObject *source, g_signal_connect (conn, "balance-changed", G_CALLBACK (main_window_balance_changed_cb), action); -} - -static void -main_window_setup_balance (EmpathyMainWindow *window, - TpAccount *account) -{ - TpConnection *conn = tp_account_get_connection (account); - GQuark features[] = { TP_CONNECTION_FEATURE_BALANCE, 0 }; - - if (conn == NULL) - return; - /* 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, features, - main_window_setup_balance_conn_ready, window); } static void @@ -1791,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); @@ -1806,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 @@ -1819,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 @@ -1952,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++) { @@ -2064,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; @@ -2073,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); @@ -2086,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, @@ -2093,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, @@ -2104,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, @@ -2146,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); @@ -2200,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), @@ -2248,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);