diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2012-09-27 18:31:06 +0800 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2012-10-03 18:04:15 +0800 |
commit | 11e0514f64c70770393f22b410c9e23153c132b3 (patch) | |
tree | 566393027c3f57f2551642f240576ad9ba450ddd /src | |
parent | 197e45140f3d79cca9bb3290b094a7055de24f74 (diff) | |
download | gsoc2013-empathy-11e0514f64c70770393f22b410c9e23153c132b3.tar gsoc2013-empathy-11e0514f64c70770393f22b410c9e23153c132b3.tar.gz gsoc2013-empathy-11e0514f64c70770393f22b410c9e23153c132b3.tar.bz2 gsoc2013-empathy-11e0514f64c70770393f22b410c9e23153c132b3.tar.lz gsoc2013-empathy-11e0514f64c70770393f22b410c9e23153c132b3.tar.xz gsoc2013-empathy-11e0514f64c70770393f22b410c9e23153c132b3.tar.zst gsoc2013-empathy-11e0514f64c70770393f22b410c9e23153c132b3.zip |
chat-window: load the individual mgr when the chat window is focused out
Dirty hack to cope with Folks being slow as hell and blocking the main loop
while preparing.
Diffstat (limited to 'src')
-rw-r--r-- | src/empathy-chat-window.c | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c index edc654796..9dfe225b0 100644 --- a/src/empathy-chat-window.c +++ b/src/empathy-chat-window.c @@ -1915,6 +1915,34 @@ chat_window_focus_in_event_cb (GtkWidget *widget, } static gboolean +chat_window_focus_out_event_cb (GtkWidget *widget, + GdkEvent *event, + EmpathyChatWindow *self) +{ + if (self->priv->individual_mgr != NULL) + return FALSE; + + /* Keep the individual manager alive so we won't fetch everything from Folks + * each time we need to use it. Loading FolksAggregator can takes quite a + * while (if user has a huge LDAP abook for example) and it blocks + * the mainloop during most of this loading. We workaround this by loading + * it when the chat window has been unfocused and so, hopefully, not impact + * the reactivity of the chat window too much. + * + * The individual manager (and so Folks) is needed to know to which + * FolksIndividual a TpContact belongs, including: + * - empathy_chat_get_contact_menu: to list all the personas of the contact + * - empathy_display_individual_info: to invoke gnome-contacts with the + * FolksIndividual.id of the contact + * - drag_data_received_individual_id: to find the individual associated + * with the ID we received from the DnD in order to invite him. + */ + self->priv->individual_mgr = empathy_individual_manager_dup_singleton (); + + return FALSE; +} + +static gboolean chat_window_drag_drop (GtkWidget *widget, GdkDragContext *context, int x, @@ -2033,6 +2061,11 @@ drag_data_received_individual_id (EmpathyChatWindow *self, goto out; } + if (self->priv->individual_mgr == NULL) + /* Not likely as we have to focus out the chat window in order to start + * the DnD but best to be safe. */ + goto out; + individual = empathy_individual_manager_lookup_member ( self->priv->individual_mgr, id); if (individual == NULL) @@ -2330,17 +2363,6 @@ empathy_chat_window_init (EmpathyChatWindow *self) self->priv->gsettings_ui = g_settings_new (EMPATHY_PREFS_UI_SCHEMA); self->priv->chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL); - /* Keep the individual manager alive so we won't fetch everything from Folks - * each time we need to use it. The individual manager (and so Folks) is - * needed to know to which FolksIndividual a TpContact belongs, including: - * - empathy_chat_get_contact_menu: to list all the personas of the contact - * - empathy_display_individual_info: to invoke gnome-contacts with the - * FolksIndividual.id of the contact - * - drag_data_received_individual_id: to find the individual associated - * with the ID we received from the DnD in order to invite him. - */ - self->priv->individual_mgr = empathy_individual_manager_dup_singleton (); - self->priv->sound_mgr = empathy_sound_manager_dup_singleton (); self->priv->notebook = gtk_notebook_new (); @@ -2395,6 +2417,8 @@ empathy_chat_window_init (EmpathyChatWindow *self) G_CALLBACK (chat_window_delete_event_cb), self); g_signal_connect (self->priv->dialog, "focus_in_event", G_CALLBACK (chat_window_focus_in_event_cb), self); + g_signal_connect (self->priv->dialog, "focus_out_event", + G_CALLBACK (chat_window_focus_out_event_cb), self); g_signal_connect_after (self->priv->notebook, "switch_page", G_CALLBACK (chat_window_page_switched_cb), self); g_signal_connect (self->priv->notebook, "page_added", |