Now get_contacts_for_name does not block UI
authorJose Dapena Paz <jdapena@igalia.com>
Mon, 16 Feb 2009 14:54:29 +0000 (14:54 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Mon, 16 Feb 2009 14:54:29 +0000 (14:54 +0000)
pmo-trunk-r7499

src/hildon2/modest-address-book.c
src/hildon2/modest-msg-edit-window.c
src/widgets/modest-recpt-editor.c

index ecf87a9..7a629ad 100644 (file)
@@ -186,12 +186,12 @@ open_addressbook_sync ()
 
        info = g_slice_new (OpenAddressbookSyncInfo);
        info->mainloop = g_main_loop_new (NULL, FALSE);
+       info->retval = FALSE;
        if (e_book_async_open (book, FALSE, book_open_sync_cb, info) == E_BOOK_ERROR_OK) {
                GDK_THREADS_LEAVE ();
                g_main_loop_run (info->mainloop);
                GDK_THREADS_ENTER ();
        }
-       info->retval = FALSE;
        retval = info->retval;
        g_main_loop_unref (info->mainloop);
        g_slice_free (OpenAddressbookSyncInfo, info);
@@ -872,12 +872,32 @@ modest_address_book_check_names (ModestRecptEditor *recpt_editor, gboolean updat
 
 }
 
+typedef struct _GetContactsInfo {
+       GMainLoop *mainloop;
+       GList *result;
+} GetContactsInfo;
+
+static void 
+get_contacts_for_name_cb (EBook *book, 
+                         EBookStatus status, 
+                         GList *list, 
+                         gpointer userdata)
+{
+       GetContactsInfo *info = (GetContactsInfo *) userdata;
+
+       if (status == E_BOOK_ERROR_OK)
+               info->result = list;
+
+       g_main_loop_quit (info->mainloop);
+}
+
 static GList *
 get_contacts_for_name (const gchar *name)
 {
        EBookQuery *full_name_book_query = NULL;
        GList *result;
        gchar *unquoted;
+       GetContactsInfo *info;
 
        if (name == NULL)
                return NULL;
@@ -887,8 +907,18 @@ get_contacts_for_name (const gchar *name)
        g_free (unquoted);
 
        /* TODO: Make it launch a mainloop */
-       e_book_get_contacts (book, full_name_book_query, &result, NULL);
+       info = g_slice_new (GetContactsInfo);
+       info->mainloop = g_main_loop_new (NULL, FALSE);
+       info->result = NULL;
+       if (e_book_async_get_contacts (book, full_name_book_query, get_contacts_for_name_cb, info) == 0) {
+               GDK_THREADS_LEAVE ();
+               g_main_loop_run (info->mainloop);
+               GDK_THREADS_ENTER ();
+       } 
+       result = info->result;
        e_book_query_unref (full_name_book_query);
+       g_main_loop_unref (info->mainloop);
+       g_slice_free (GetContactsInfo, info);
 
        return result;
 }
index e30de18..dd8050a 100644 (file)
@@ -3155,22 +3155,27 @@ modest_msg_edit_window_check_names (ModestMsgEditWindow *window, gboolean add_to
                return FALSE;
        }
 
+       g_object_ref (window);
        if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->to_field),  add_to_addressbook)) {
                modest_recpt_editor_grab_focus (MODEST_RECPT_EDITOR (priv->to_field));
+               g_object_unref (window);
                return FALSE;
        }
        if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->cc_field),  add_to_addressbook)) {
                modest_recpt_editor_grab_focus (MODEST_RECPT_EDITOR (priv->cc_field));
+               g_object_unref (window);
                return FALSE;
        }
        if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->bcc_field), add_to_addressbook)) {
                modest_recpt_editor_grab_focus (MODEST_RECPT_EDITOR (priv->bcc_field));
+               g_object_unref (window);
                return FALSE;
        }
 
        if (!modest_recpt_editor_has_focus (MODEST_RECPT_EDITOR (priv->cc_field)) &&
            !modest_recpt_editor_has_focus (MODEST_RECPT_EDITOR (priv->bcc_field)))
                modest_recpt_editor_grab_focus (MODEST_RECPT_EDITOR (priv->to_field));
+       g_object_unref (window);
 
        return TRUE;
 
index 809233e..45b7ec2 100644 (file)
@@ -938,7 +938,7 @@ modest_recpt_editor_grab_focus (ModestRecptEditor *recpt_editor)
        g_return_if_fail (MODEST_IS_RECPT_EDITOR (recpt_editor));
        priv = MODEST_RECPT_EDITOR_GET_PRIVATE (recpt_editor);
 
-       if (GTK_WIDGET_DRAWABLE (recpt_editor)) {
+       if (GTK_WIDGET_VISIBLE (recpt_editor)) {
                gtk_widget_grab_focus (priv->text_view);
        }
 }
@@ -951,7 +951,7 @@ modest_recpt_editor_has_focus (ModestRecptEditor *recpt_editor)
        g_return_val_if_fail (MODEST_IS_RECPT_EDITOR (recpt_editor), FALSE);
        priv = MODEST_RECPT_EDITOR_GET_PRIVATE (recpt_editor);
 
-       return GTK_WIDGET_DRAWABLE (priv->text_view) && 
+       return GTK_WIDGET_VISIBLE (priv->text_view) && 
                gtk_widget_is_focus (priv->text_view);
 }