[gnome-builder] libide: hold a reference to the mode while dispatching



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]