diff options
-rw-r--r-- | addressbook/gui/contact-editor/e-contact-editor.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index 8359e7e0b7..ab7557188b 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -3161,6 +3161,18 @@ sensitize_simple (EContactEditor *editor) static void fill_in_all (EContactEditor *editor) { + GtkWidget *focused_widget; + gpointer weak_pointer; + + /* Widget changes can cause focus widget change, thus remember the current + widget and restore it after the fill is done; some fill operations + can delete widgets, like the dyntable, thus do the weak_pointer as well. + */ + focused_widget = gtk_window_get_focus (eab_editor_get_window (EAB_EDITOR (editor))); + weak_pointer = focused_widget; + if (focused_widget) + g_object_add_weak_pointer (G_OBJECT (focused_widget), &weak_pointer); + fill_in_source_field (editor); fill_in_simple (editor); fill_in_email (editor); @@ -3168,6 +3180,11 @@ fill_in_all (EContactEditor *editor) fill_in_sip (editor); fill_in_im (editor); fill_in_address (editor); + + if (weak_pointer) { + g_object_remove_weak_pointer (G_OBJECT (focused_widget), &weak_pointer); + gtk_widget_grab_focus (focused_widget); + } } static void |