diff --git a/plugins/openpgp/src/account_settings_widget.vala b/plugins/openpgp/src/account_settings_widget.vala index 2a6b99ac..8a616ef5 100644 --- a/plugins/openpgp/src/account_settings_widget.vala +++ b/plugins/openpgp/src/account_settings_widget.vala @@ -35,12 +35,16 @@ private class AccountSettingsWidget : Stack, Plugins.AccountSettingsWidget { } public void set_account(Account account) { + set_account_.begin(account); + } + + private async void set_account_(Account account) { this.current_account = account; if (keys == null) { - fetch_keys(); - } else { - activate_current_account(); + yield fetch_keys(); + populate_list_store(); } + activate_current_account(); } private void on_button_clicked() { @@ -52,6 +56,14 @@ private class AccountSettingsWidget : Stack, Plugins.AccountSettingsWidget { private void activate_current_account() { combobox.changed.disconnect(key_changed); + if (keys == null) { + label.set_markup(build_markup_string(_("Key publishing disabled"), _("Error in GnuPG"))); + return; + } + if (keys.size == 0) { + label.set_markup(build_markup_string(_("Key publishing disabled"), _("No keys available. Generate one!"))); + return; + } string? account_key = plugin.db.get_account_key(current_account); int activate_index = 0; @@ -71,11 +83,11 @@ private class AccountSettingsWidget : Stack, Plugins.AccountSettingsWidget { } private void populate_list_store() { - if (keys.size == 0) { - label.set_markup(build_markup_string(_("Key publishing disabled"), _("No keys available. Generate one!"))); + if (keys == null || keys.size == 0) { return; } + list_store.clear(); TreeIter iter; list_store.append(out iter); list_store.set(iter, 0, build_markup_string(_("Key publishing disabled"), _("Select key") + " \n "), 1, ""); @@ -87,31 +99,21 @@ private class AccountSettingsWidget : Stack, Plugins.AccountSettingsWidget { set_label_active(iter, i + 1); } } - activate_current_account(); button.sensitive = true; } - private void fetch_keys() { - TreeIter iter; - list_store.clear(); - list_store.append(out iter); + private async void fetch_keys() { label.set_markup(build_markup_string(_("Loading…"), _("Querying GnuPG"))); + + SourceFunc callback = fetch_keys.callback; new Thread (null, () => { // Querying GnuPG might take some time try { keys = GPGHelper.get_keylist(null, true); - Idle.add(() => { - list_store.clear(); - populate_list_store(); - return false; - }); - } catch (Error e) { - Idle.add(() => { - label.set_markup(build_markup_string(_("Key publishing disabled"), _("Error in GnuPG"))); - return false; - }); - } + } catch (Error e) { } + Idle.add((owned)callback); return null; }); + yield; } private void set_label_active(TreeIter iter, int i = -1) {