[gnome-builder] libide: hold a reference to the mode while dispatching
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] libide: hold a reference to the mode while dispatching
- Date: Mon, 23 Mar 2015 23:52:36 +0000 (UTC)
commit 7a682a8cb14a2bb3b8be2ed8a00d245d8410c3eb
Author: Christian Hergert <christian hergert me>
Date: Tue Mar 3 23:53:09 2015 -0800
libide: hold a reference to the mode while dispatching
libide/ide-source-view.c | 16 +++++++++++++---
1 files changed, 13 insertions(+), 3 deletions(-)
---
diff --git a/libide/ide-source-view.c b/libide/ide-source-view.c
index affea21..e17028b 100644
--- a/libide/ide-source-view.c
+++ b/libide/ide-source-view.c
@@ -1180,26 +1180,36 @@ ide_source_view_key_press_event (GtkWidget *widget,
g_assert (IDE_IS_SOURCE_VIEW (self));
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self));
+
/*
* If we are in a non-default mode, dispatch the event to the mode. This allows custom
* keybindings like Emacs and Vim to be implemented using gtk-bindings CSS.
*/
if (priv->mode)
{
+ IdeSourceViewMode *mode;
gboolean handled;
gboolean remove = FALSE;
+ /* hold a reference incase binding changes mode */
+ mode = g_object_ref (priv->mode);
+
handled = _ide_source_view_mode_do_event (priv->mode, event, &remove);
if (remove)
- g_clear_object (&priv->mode);
+ {
+ /* only remove mode if it is still active */
+ if (priv->mode == mode)
+ g_clear_object (&priv->mode);
+ }
+
+ g_object_unref (mode);
if (handled)
return TRUE;
}
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self));
-
/*
* Handle movement through the tab stops of the current snippet if needed.
*/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]