[gedit] spell: handle again ::tab-removed
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit] spell: handle again ::tab-removed
- Date: Wed, 13 Jan 2016 12:05:41 +0000 (UTC)
commit 519996de19fc4c5aa1abc55119f01cf37e49b137
Author: Sébastien Wilmet <swilmet gnome org>
Date: Wed Jan 13 12:26:53 2016 +0100
spell: handle again ::tab-removed
The code was removed accidentally. I forgot that the ::tab-removed is
called also when a tab is moved to another window.
plugins/spell/gedit-spell-plugin.c | 71 ++++++++++++++++++++++++++++--------
1 files changed, 56 insertions(+), 15 deletions(-)
---
diff --git a/plugins/spell/gedit-spell-plugin.c b/plugins/spell/gedit-spell-plugin.c
index d436f83..5a8874c 100644
--- a/plugins/spell/gedit-spell-plugin.c
+++ b/plugins/spell/gedit-spell-plugin.c
@@ -497,21 +497,28 @@ activate_spell_checking_in_view (GeditSpellPlugin *plugin,
GeditView *view)
{
GeditDocument *doc;
- const GspellLanguage *lang;
- GspellChecker *checker;
doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
- lang = get_language_from_metadata (doc);
- checker = gspell_checker_new (lang);
- g_signal_connect_object (checker,
- "notify::language",
- G_CALLBACK (language_notify_cb),
- doc,
- 0);
+ /* It is possible that a GspellChecker has already been set, for example
+ * if a GeditTab has moved to another window.
+ */
+ if (gspell_text_buffer_get_spell_checker (GTK_TEXT_BUFFER (doc)) == NULL)
+ {
+ const GspellLanguage *lang = get_language_from_metadata (doc);
+ GspellChecker *checker = gspell_checker_new (lang);
+
+ g_signal_connect_object (checker,
+ "notify::language",
+ G_CALLBACK (language_notify_cb),
+ doc,
+ 0);
- gspell_text_buffer_set_spell_checker (GTK_TEXT_BUFFER (doc), checker);
- g_object_unref (checker);
+ gspell_text_buffer_set_spell_checker (GTK_TEXT_BUFFER (doc), checker);
+ g_object_unref (checker);
+
+ setup_inline_checker_from_metadata (plugin, view);
+ }
g_signal_connect_object (doc,
"loaded",
@@ -524,8 +531,24 @@ activate_spell_checking_in_view (GeditSpellPlugin *plugin,
G_CALLBACK (on_document_saved),
plugin,
0);
+}
- setup_inline_checker_from_metadata (plugin, view);
+static void
+disconnect_view (GeditSpellPlugin *plugin,
+ GeditView *view)
+{
+ GtkTextBuffer *buffer;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
+
+ /* It should still be the same buffer as the one where the signal
+ * handlers were connected. If not, we assume that the old buffer is
+ * finalized. And it is anyway safe to call
+ * g_signal_handlers_disconnect_by_func() if no signal handlers are
+ * found.
+ */
+ g_signal_handlers_disconnect_by_func (buffer, on_document_loaded, plugin);
+ g_signal_handlers_disconnect_by_func (buffer, on_document_saved, plugin);
}
static void
@@ -535,12 +558,11 @@ deactivate_spell_checking_in_view (GeditSpellPlugin *plugin,
GtkTextBuffer *buffer;
GspellInlineCheckerText *inline_checker;
+ disconnect_view (plugin, view);
+
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
gspell_text_buffer_set_spell_checker (buffer, NULL);
- g_signal_handlers_disconnect_by_func (buffer, on_document_loaded, plugin);
- g_signal_handlers_disconnect_by_func (buffer, on_document_saved, plugin);
-
inline_checker = gspell_text_view_get_inline_checker (GTK_TEXT_VIEW (view));
gspell_inline_checker_text_set_enabled (inline_checker, FALSE);
}
@@ -554,6 +576,19 @@ tab_added_cb (GeditWindow *window,
}
static void
+tab_removed_cb (GeditWindow *window,
+ GeditTab *tab,
+ GeditSpellPlugin *plugin)
+{
+ /* Don't deactivate completely the spell checking in @tab, since the tab
+ * can be moved to another window and we don't want to loose the spell
+ * checking settings (they are not saved in metadata for unsaved
+ * documents).
+ */
+ disconnect_view (plugin, gedit_tab_get_view (tab));
+}
+
+static void
gedit_spell_plugin_activate (GeditWindowActivatable *activatable)
{
GeditSpellPlugin *plugin;
@@ -594,6 +629,11 @@ gedit_spell_plugin_activate (GeditWindowActivatable *activatable)
"tab-added",
G_CALLBACK (tab_added_cb),
activatable);
+
+ g_signal_connect (priv->window,
+ "tab-removed",
+ G_CALLBACK (tab_removed_cb),
+ activatable);
}
static void
@@ -614,6 +654,7 @@ gedit_spell_plugin_deactivate (GeditWindowActivatable *activatable)
g_action_map_remove_action (G_ACTION_MAP (priv->window), "inline-spell-checker");
g_signal_handlers_disconnect_by_func (priv->window, tab_added_cb, activatable);
+ g_signal_handlers_disconnect_by_func (priv->window, tab_removed_cb, activatable);
views = gedit_window_get_views (priv->window);
for (l = views; l != NULL; l = l->next)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]