141 lines
5.3 KiB
Diff
141 lines
5.3 KiB
Diff
From 6d5b0bc5b6ee45b6f31ba53d98c6a6c77e5ce2cd Mon Sep 17 00:00:00 2001
|
|
From: Michael Gratton <mike@vee.net>
|
|
Date: Sun, 25 Oct 2020 18:57:47 +1100
|
|
Subject: [PATCH 114/124] Composer.Widget: Rework draft manager management
|
|
|
|
Since the draft manager will now block until a remote for the draft
|
|
folder has been obtained, it now must be ensured that all calls to
|
|
opening the manager are backgrounded so that the UI isn't blocked
|
|
when offline.
|
|
---
|
|
src/client/composer/composer-widget.vala | 76 ++++++++++++++++--------
|
|
1 file changed, 50 insertions(+), 26 deletions(-)
|
|
|
|
diff --git a/src/client/composer/composer-widget.vala b/src/client/composer/composer-widget.vala
|
|
index fe29011d..61e3a84c 100644
|
|
--- a/src/client/composer/composer-widget.vala
|
|
+++ b/src/client/composer/composer-widget.vala
|
|
@@ -971,7 +971,21 @@ public class Composer.Widget : Gtk.EventBox, Geary.BaseInterface {
|
|
this.header.set_sensitive(enabled);
|
|
|
|
if (enabled) {
|
|
- this.open_draft_manager.begin(this.saved_id, null);
|
|
+ var current_account = this.sender_context.account;
|
|
+ this.open_draft_manager.begin(
|
|
+ this.saved_id,
|
|
+ (obj, res) => {
|
|
+ try {
|
|
+ this.open_draft_manager.end(res);
|
|
+ } catch (GLib.Error error) {
|
|
+ this.application.report_problem(
|
|
+ new Geary.AccountProblemReport(
|
|
+ current_account.information, error
|
|
+ )
|
|
+ );
|
|
+ }
|
|
+ }
|
|
+ );
|
|
} else {
|
|
if (this.container != null) {
|
|
this.container.close();
|
|
@@ -984,7 +998,7 @@ public class Composer.Widget : Gtk.EventBox, Geary.BaseInterface {
|
|
public async void set_save_to_override(Geary.Folder? save_to)
|
|
throws GLib.Error {
|
|
this.save_to = save_to;
|
|
- yield reopen_draft_manager();
|
|
+ this.reopen_draft_manager.begin();
|
|
}
|
|
|
|
/**
|
|
@@ -1423,11 +1437,21 @@ public class Composer.Widget : Gtk.EventBox, Geary.BaseInterface {
|
|
is_body_complete
|
|
);
|
|
|
|
- try {
|
|
- yield open_draft_manager(this.saved_id);
|
|
- } catch (Error e) {
|
|
- debug("Could not open draft manager: %s", e.message);
|
|
- }
|
|
+ var current_account = this.sender_context.account;
|
|
+ this.open_draft_manager.begin(
|
|
+ this.saved_id,
|
|
+ (obj, res) => {
|
|
+ try {
|
|
+ this.open_draft_manager.end(res);
|
|
+ } catch (GLib.Error error) {
|
|
+ this.application.report_problem(
|
|
+ new Geary.AccountProblemReport(
|
|
+ current_account.information, error
|
|
+ )
|
|
+ );
|
|
+ }
|
|
+ }
|
|
+ );
|
|
}
|
|
|
|
private async bool should_send() {
|
|
@@ -1501,6 +1525,11 @@ public class Composer.Widget : Gtk.EventBox, Geary.BaseInterface {
|
|
|
|
/**
|
|
* Creates and opens the composer's draft manager.
|
|
+ *
|
|
+ * Note that since the draft manager may block until a remote
|
|
+ * connection is open, this method may likewise do so. Hence this
|
|
+ * method typically needs to be called from the main loop as a
|
|
+ * background async task using the `begin` async call form.
|
|
*/
|
|
private async void open_draft_manager(Geary.EmailIdentifier? editing_draft_id)
|
|
throws GLib.Error {
|
|
@@ -1572,13 +1601,21 @@ public class Composer.Widget : Gtk.EventBox, Geary.BaseInterface {
|
|
/**
|
|
* Closes current draft manager, if any, then opens a new one.
|
|
*/
|
|
- private async void reopen_draft_manager()
|
|
- throws GLib.Error {
|
|
+ private async void reopen_draft_manager() {
|
|
// Discard the draft, if any, since it may be on a different
|
|
// account
|
|
- yield close_draft_manager(DISCARD);
|
|
- yield open_draft_manager(null);
|
|
- yield save_draft();
|
|
+ var current_account = this.sender_context.account;
|
|
+ try {
|
|
+ yield close_draft_manager(DISCARD);
|
|
+ yield open_draft_manager(null);
|
|
+ yield save_draft();
|
|
+ } catch (GLib.Error error) {
|
|
+ this.application.report_problem(
|
|
+ new Geary.AccountProblemReport(
|
|
+ current_account.information, error
|
|
+ )
|
|
+ );
|
|
+ }
|
|
}
|
|
|
|
private async void close_draft_manager(DraftPolicy draft_policy)
|
|
@@ -2254,20 +2291,7 @@ public class Composer.Widget : Gtk.EventBox, Geary.BaseInterface {
|
|
this.update_signature.begin(null);
|
|
load_entry_completions();
|
|
|
|
- var current_account = this.sender_context.account;
|
|
- this.reopen_draft_manager.begin(
|
|
- (obj, res) => {
|
|
- try {
|
|
- this.reopen_draft_manager.end(res);
|
|
- } catch (GLib.Error error) {
|
|
- this.application.report_problem(
|
|
- new Geary.AccountProblemReport(
|
|
- current_account.information, error
|
|
- )
|
|
- );
|
|
- }
|
|
- }
|
|
- );
|
|
+ this.reopen_draft_manager.begin();
|
|
}
|
|
}
|
|
}
|
|
--
|
|
2.29.2
|
|
|