[evolution] Composer - Don't block selection-changed handlers if they are already blocked



commit a98974c433839a9e43992eb6a4e64e0f55d3ecaa
Author: Tomas Popela <tpopela redhat com>
Date:   Tue Apr 14 15:46:19 2015 +0200

    Composer - Don't block selection-changed handlers if they are already blocked

 e-util/e-html-editor-selection.c |   34 +++++++++++++++++++++++-----------
 e-util/e-html-editor-view.c      |   12 ++++++++++--
 2 files changed, 33 insertions(+), 13 deletions(-)
---
diff --git a/e-util/e-html-editor-selection.c b/e-util/e-html-editor-selection.c
index b8d1cc7..a8cf1fd 100644
--- a/e-util/e-html-editor-selection.c
+++ b/e-util/e-html-editor-selection.c
@@ -51,6 +51,7 @@ struct _EHTMLEditorSelectionPrivate {
 
        GWeakRef html_editor_view;
        gulong selection_changed_handler_id;
+       gboolean selection_changed_callbacks_blocked;
 
        gchar *text;
 
@@ -265,26 +266,35 @@ html_editor_selection_selection_changed_cb (WebKitWebView *web_view,
 void
 e_html_editor_selection_block_selection_changed (EHTMLEditorSelection *selection)
 {
-       EHTMLEditorView *view;
+       g_return_if_fail (E_IS_HTML_EDITOR_SELECTION (selection));
 
-       view = e_html_editor_selection_ref_html_editor_view (selection);
-       g_signal_handlers_block_by_func (
-               view, html_editor_selection_selection_changed_cb, selection);
-       g_object_unref (view);
+       if (!selection->priv->selection_changed_callbacks_blocked) {
+               EHTMLEditorView *view;
+
+               view = e_html_editor_selection_ref_html_editor_view (selection);
+               g_signal_handlers_block_by_func (
+                       view, html_editor_selection_selection_changed_cb, selection);
+               g_object_unref (view);
+               selection->priv->selection_changed_callbacks_blocked = TRUE;
+       }
 }
 
 void
 e_html_editor_selection_unblock_selection_changed (EHTMLEditorSelection *selection)
 {
-       EHTMLEditorView *view;
+       g_return_if_fail (E_IS_HTML_EDITOR_SELECTION (selection));
 
-       view = e_html_editor_selection_ref_html_editor_view (selection);
-       g_signal_handlers_unblock_by_func (
-               view, html_editor_selection_selection_changed_cb, selection);
+       if (selection->priv->selection_changed_callbacks_blocked) {
+               EHTMLEditorView *view;
 
-       html_editor_selection_selection_changed_cb (WEBKIT_WEB_VIEW (view), selection);
+               view = e_html_editor_selection_ref_html_editor_view (selection);
+               g_signal_handlers_unblock_by_func (
+                       view, html_editor_selection_selection_changed_cb, selection);
+               g_object_unref (view);
+               selection->priv->selection_changed_callbacks_blocked = FALSE;
 
-       g_object_unref (view);
+               html_editor_selection_selection_changed_cb (WEBKIT_WEB_VIEW (view), selection);
+       }
 }
 
 static void
@@ -855,6 +865,8 @@ e_html_editor_selection_init (EHTMLEditorSelection *selection)
        selection->priv->word_wrap_length =
                g_settings_get_int (g_settings, "composer-word-wrap-length");
        g_object_unref (g_settings);
+
+       selection->priv->selection_changed_callbacks_blocked = FALSE;
 }
 
 gint
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c
index 05d2d3d..fb4a5eb 100644
--- a/e-util/e-html-editor-view.c
+++ b/e-util/e-html-editor-view.c
@@ -105,6 +105,7 @@ struct _EHTMLEditorViewPrivate {
        gboolean dont_save_history_in_body_input;
        gboolean im_input_in_progress;
        gboolean style_change_callbacks_blocked;
+       gboolean selection_changed_callbacks_blocked;
 
        GHashTable *old_settings;
 
@@ -426,14 +427,20 @@ static void
 block_selection_changed_callbacks (EHTMLEditorView *view)
 {
        e_html_editor_selection_block_selection_changed (view->priv->selection);
-       g_signal_handlers_block_by_func (view, html_editor_view_selection_changed_cb, NULL);
+       if (!view->priv->selection_changed_callbacks_blocked) {
+               g_signal_handlers_block_by_func (view, html_editor_view_selection_changed_cb, NULL);
+               view->priv->selection_changed_callbacks_blocked = TRUE;
+       }
 }
 
 static void
 unblock_selection_changed_callbacks (EHTMLEditorView *view)
 {
        e_html_editor_selection_unblock_selection_changed (view->priv->selection);
-       g_signal_handlers_unblock_by_func (view, html_editor_view_selection_changed_cb, NULL);
+       if (view->priv->selection_changed_callbacks_blocked) {
+               g_signal_handlers_unblock_by_func (view, html_editor_view_selection_changed_cb, NULL);
+               view->priv->selection_changed_callbacks_blocked = FALSE;
+       }
 }
 
 static gboolean
@@ -9670,6 +9677,7 @@ e_html_editor_view_init (EHTMLEditorView *view)
        view->priv->undo_redo_in_progress = FALSE;
        view->priv->dont_save_history_in_body_input = FALSE;
        view->priv->style_change_callbacks_blocked = FALSE;
+       view->priv->selection_changed_callbacks_blocked = FALSE;
 
        view->priv->spell_check_on_scroll_event_source_id = 0;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]