[evolution] [ENameSelectorEntry] Avoid fake "changed" signals on focus-in
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] [ENameSelectorEntry] Avoid fake "changed" signals on focus-in
- Date: Tue, 18 Apr 2017 08:44:08 +0000 (UTC)
commit 23ff4d865ca3ebb717d8c1d341f5fe48284fa253
Author: Milan Crha <mcrha redhat com>
Date: Tue Apr 18 10:38:41 2017 +0200
[ENameSelectorEntry] Avoid fake "changed" signals on focus-in
When the name selector entry is focused, it changes its content by
appending ", " to make it easier to add new contacts, but it also
emits the "changed" signal, to which listens EMsgComposer. It's fine
as long as this doesn't happen when user wants to close the composer
while staying in the name selector entry (To/Cc/Bcc) with some address
filled. The thing is that the fake "changed" signal marks composer
dirty again, which avoids its close after draft save.
src/e-util/e-name-selector-entry.c | 19 +++++++++++++++++++
1 files changed, 19 insertions(+), 0 deletions(-)
---
diff --git a/src/e-util/e-name-selector-entry.c b/src/e-util/e-name-selector-entry.c
index 0d3b824..3786f38 100644
--- a/src/e-util/e-name-selector-entry.c
+++ b/src/e-util/e-name-selector-entry.c
@@ -66,6 +66,8 @@ struct _ENameSelectorEntryPrivate {
GQueue cancellables;
GHashTable *known_contacts; /* gchar * ~> 1 */
+
+ gboolean block_entry_changed_signal;
};
enum {
@@ -2039,6 +2041,16 @@ sanitize_entry (ENameSelectorEntry *name_selector_entry)
generate_attribute_list (name_selector_entry);
}
+static void
+maybe_block_entry_changed_cb (ENameSelectorEntry *name_selector_entry,
+ gpointer user_data)
+{
+ g_return_if_fail (E_IS_NAME_SELECTOR_ENTRY (name_selector_entry));
+
+ if (name_selector_entry->priv->block_entry_changed_signal)
+ g_signal_stop_emission_by_name (name_selector_entry, "changed");
+}
+
static gboolean
user_focus_in (ENameSelectorEntry *name_selector_entry,
GdkEventFocus *event_focus)
@@ -2048,6 +2060,8 @@ user_focus_in (ENameSelectorEntry *name_selector_entry,
GString *str = g_string_new ("");
gint sel_start_pos = -1, sel_end_pos = -1;
+ /* To not send fake 'changed' signals, which can influence message composer */
+ name_selector_entry->priv->block_entry_changed_signal = TRUE;
g_signal_handlers_block_matched (name_selector_entry, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL,
name_selector_entry);
g_signal_handlers_block_matched (name_selector_entry->priv->destination_store, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, name_selector_entry);
@@ -2092,6 +2106,7 @@ user_focus_in (ENameSelectorEntry *name_selector_entry,
g_signal_handlers_unblock_matched (name_selector_entry->priv->destination_store, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, name_selector_entry);
g_signal_handlers_unblock_matched (name_selector_entry, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL,
name_selector_entry);
+ name_selector_entry->priv->block_entry_changed_signal = FALSE;
generate_attribute_list (name_selector_entry);
@@ -3401,11 +3416,15 @@ e_name_selector_entry_init (ENameSelectorEntry *name_selector_entry)
name_selector_entry->priv->minimum_query_length = 3;
name_selector_entry->priv->show_address = FALSE;
+ name_selector_entry->priv->block_entry_changed_signal = FALSE;
name_selector_entry->priv->known_contacts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
NULL);
/* Edit signals */
g_signal_connect (
+ name_selector_entry, "changed",
+ G_CALLBACK (maybe_block_entry_changed_cb), NULL);
+ g_signal_connect (
name_selector_entry, "insert-text",
G_CALLBACK (user_insert_text), name_selector_entry);
g_signal_connect (
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]