[gnome-builder] libide: allow keeping insert mark over character



commit a286f4d30b234938961fdf7e1f798d1c5b0962ff
Author: Christian Hergert <christian hergert me>
Date:   Mon Mar 9 23:32:41 2015 -0700

    libide: allow keeping insert mark over character

 data/keybindings/vim.css      |    1 +
 libide/ide-source-view-mode.c |   14 ++++++++++++++
 libide/ide-source-view-mode.h |    9 +++++----
 libide/ide-source-view.c      |   26 ++++++++++++++++++++++----
 4 files changed, 42 insertions(+), 8 deletions(-)
---
diff --git a/data/keybindings/vim.css b/data/keybindings/vim.css
index ed90d1a..5cd0d25 100644
--- a/data/keybindings/vim.css
+++ b/data/keybindings/vim.css
@@ -834,6 +834,7 @@ IdeSourceViewMode.vim-normal {
   -IdeSourceViewMode-suppress-unbound: true;
   -IdeSourceViewMode-coalesce-undo: true;
   -IdeSourceViewMode-block-cursor: true;
+  -IdeSourceViewMode-keep-mark-on-char: true;
 
   gtk-key-bindings: builder-vim-source-view,
                     builder-vim-source-view-normal;
diff --git a/libide/ide-source-view-mode.c b/libide/ide-source-view-mode.c
index 20e5219..7ee11c9 100644
--- a/libide/ide-source-view-mode.c
+++ b/libide/ide-source-view-mode.c
@@ -90,6 +90,11 @@ ide_source_view_mode_get_block_cursor (IdeSourceViewMode *self)
 {
   return get_boolean_param (self, "block-cursor");
 }
+gboolean
+ide_source_view_mode_get_keep_mark_on_char (IdeSourceViewMode *self)
+{
+  return get_boolean_param (self, "keep-mark-on-char");
+}
 
 static void
 ide_source_view_mode_finalize (GObject *object)
@@ -230,6 +235,15 @@ ide_source_view_mode_class_init (IdeSourceViewModeClass *klass)
                                                                  (G_PARAM_READABLE |
                                                                   G_PARAM_STATIC_STRINGS)));
 
+  gtk_widget_class_install_style_property (GTK_WIDGET_CLASS (klass),
+                                           g_param_spec_boolean ("keep-mark-on-char",
+                                                                 _("Keep Mark on Char"),
+                                                                 _("Don't allow the cursor to "
+                                                                   "move to line end."),
+                                                                 FALSE,
+                                                                 (G_PARAM_READABLE |
+                                                                  G_PARAM_STATIC_STRINGS)));
+
   /* Proxy all action signals from source view */
   type = IDE_TYPE_SOURCE_VIEW;
   while (type != G_TYPE_INVALID && type != GTK_TYPE_WIDGET)
diff --git a/libide/ide-source-view-mode.h b/libide/ide-source-view-mode.h
index 90797f1..71db49f 100644
--- a/libide/ide-source-view-mode.h
+++ b/libide/ide-source-view-mode.h
@@ -46,10 +46,11 @@ struct _IdeSourceViewModeClass
   GtkWidgetClass parent_class;
 };
 
-gboolean     ide_source_view_mode_get_block_cursor     (IdeSourceViewMode *self);
-gboolean     ide_source_view_mode_get_suppress_unbound (IdeSourceViewMode *self);
-gboolean     ide_source_view_mode_get_coalesce_undo    (IdeSourceViewMode *self);
-const gchar *ide_source_view_mode_get_name             (IdeSourceViewMode *self);
+gboolean     ide_source_view_mode_get_block_cursor      (IdeSourceViewMode *self);
+gboolean     ide_source_view_mode_get_suppress_unbound  (IdeSourceViewMode *self);
+gboolean     ide_source_view_mode_get_coalesce_undo     (IdeSourceViewMode *self);
+const gchar *ide_source_view_mode_get_name              (IdeSourceViewMode *self);
+gboolean     ide_source_view_mode_get_keep_mark_on_char (IdeSourceViewMode *self);
 
 G_END_DECLS
 
diff --git a/libide/ide-source-view.c b/libide/ide-source-view.c
index 0d3af60..4063033 100644
--- a/libide/ide-source-view.c
+++ b/libide/ide-source-view.c
@@ -913,21 +913,22 @@ ide_source_view__buffer_mark_set_cb (GtkTextBuffer *buffer,
   IdeSourceView *self = user_data;
   IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
   IdeSourceSnippet *snippet;
+  GtkTextMark *insert;
 
   g_assert (IDE_IS_SOURCE_VIEW (self));
   g_assert (iter);
   g_assert (GTK_IS_TEXT_MARK (mark));
 
-  ide_source_view_block_handlers (self);
+  insert = gtk_text_buffer_get_insert (buffer);
 
-  if (mark == gtk_text_buffer_get_insert (buffer))
+  if (mark == insert)
     {
+      ide_source_view_block_handlers (self);
       while ((snippet = g_queue_peek_head (priv->snippets)) &&
              !ide_source_snippet_insert_set (snippet, mark))
         ide_source_view_pop_snippet (self);
+      ide_source_view_unblock_handlers (self);
     }
-
-  ide_source_view_unblock_handlers (self);
 }
 
 static void
@@ -1555,6 +1556,23 @@ ide_source_view_do_mode (IdeSourceView *self,
   if (!priv->mode)
     ide_source_view_real_set_mode (self, NULL,  IDE_SOURCE_VIEW_MODE_TYPE_PERMANENT);
 
+  if (ide_source_view_mode_get_keep_mark_on_char (priv->mode))
+    {
+      GtkTextBuffer *buffer;
+      GtkTextMark *insert;
+      GtkTextIter iter;
+
+      buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self));
+      insert = gtk_text_buffer_get_insert (buffer);
+      gtk_text_buffer_get_iter_at_mark (buffer, &iter, insert);
+
+      if (gtk_text_iter_ends_line (&iter) && !gtk_text_iter_starts_line (&iter))
+        {
+          gtk_text_iter_backward_char (&iter);
+          gtk_text_buffer_select_range (buffer, &iter, &iter);
+        }
+    }
+
   return ret;
 }
 


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