[gnome-builder/wip/slaf/vim-textobjects: 2/8] source-view: add a select-inner signal
- From: Sébastien Lafargue <slafargue src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/slaf/vim-textobjects: 2/8] source-view: add a select-inner signal
- Date: Fri, 23 Oct 2015 14:33:03 +0000 (UTC)
commit 2ba63f2350735f55c5c847317a15d153acafecec
Author: Sebastien Lafargue <slafargue gnome org>
Date: Thu Oct 22 23:42:33 2015 +0200
source-view: add a select-inner signal
we need this to define some textobject bindings in vim css.
This signal trigger the ide_source_view_select_inner function
libide/ide-source-view-movements.c | 36 ++++++++++++++++++++++++++++++++++
libide/ide-source-view-movements.h | 6 +++++
libide/ide-source-view.c | 38 ++++++++++++++++++++++++++++++++++++
3 files changed, 80 insertions(+), 0 deletions(-)
---
diff --git a/libide/ide-source-view-movements.c b/libide/ide-source-view-movements.c
index c212aee..9c948ef 100644
--- a/libide/ide-source-view-movements.c
+++ b/libide/ide-source-view-movements.c
@@ -786,6 +786,7 @@ bracket_predicate (gunichar ch,
state->depth += (state->direction == GTK_DIR_RIGHT) ? -1 : 1;
return (state->depth == 0);
+
}
/* find the matching char position in 'depth' outer levels */
@@ -1631,3 +1632,38 @@ _ide_source_view_apply_movement (IdeSourceView *self,
if (!mv.ignore_scroll_to_insert)
ide_source_view_scroll_mark_onscreen (self, insert, TRUE, 0.5, 0.5);
}
+
+void
+_ide_source_view_select_inner (IdeSourceView *self,
+ gunichar inner_left,
+ gunichar inner_right,
+ guint count,
+ gboolean exclusive)
+{
+ GtkTextBuffer *buffer;
+ GtkTextMark *insert;
+ GtkTextIter start;
+ GtkTextIter end;
+
+ g_return_if_fail (IDE_IS_SOURCE_VIEW (self));
+
+ 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, &start, insert);
+
+ count = MAX (1, count);
+
+ if (match_char_with_depth (&start, inner_left, inner_right, GTK_DIR_LEFT, count, !exclusive))
+ {
+ end = start;
+ if (exclusive)
+ gtk_text_iter_backward_char (&end);
+
+ if (match_char_with_depth (&end, inner_left, inner_right, GTK_DIR_RIGHT, 1, exclusive))
+ {
+ gtk_text_buffer_select_range (buffer, &start, &end);
+ gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW (self), insert);
+ }
+
+ }
+}
diff --git a/libide/ide-source-view-movements.h b/libide/ide-source-view-movements.h
index c80235e..72a7dc4 100644
--- a/libide/ide-source-view-movements.h
+++ b/libide/ide-source-view-movements.h
@@ -33,6 +33,12 @@ void _ide_source_view_apply_movement (IdeSourceView *source_view,
gunichar search_char,
gint *target_offset);
+void _ide_source_view_select_inner (IdeSourceView *self,
+ gunichar inner_left,
+ gunichar inner_right,
+ guint count,
+ gboolean exclusive);
+
G_END_DECLS
#endif /* IDE_SOURCE_VIEW_HELPER_H */
diff --git a/libide/ide-source-view.c b/libide/ide-source-view.c
index eff8404..541fd05 100644
--- a/libide/ide-source-view.c
+++ b/libide/ide-source-view.c
@@ -120,6 +120,8 @@ typedef struct
gunichar modifier;
gunichar search_char;
guint count;
+ gunichar inner_left;
+ gunichar inner_right;
guint delayed_scroll_replay;
@@ -247,6 +249,7 @@ enum {
SAVE_COMMAND,
SAVE_INSERT_MARK,
SAVE_SEARCH_CHAR,
+ SELECT_INNER,
SELECTION_THEATRIC,
SET_MODE,
SET_OVERWRITE,
@@ -3444,6 +3447,28 @@ ide_source_view_real_save_search_char (IdeSourceView *self)
}
static void
+ide_source_view_real_select_inner (IdeSourceView *self,
+ const gchar *inner_left,
+ const gchar *inner_right,
+ gboolean exclusive)
+{
+ IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
+ gunichar unichar_inner_left;
+ gunichar unichar_inner_right;
+
+ g_assert (IDE_IS_SOURCE_VIEW (self));
+
+ unichar_inner_left = g_utf8_get_char (inner_left);
+ unichar_inner_right = g_utf8_get_char (inner_right);
+
+ _ide_source_view_select_inner (self,
+ unichar_inner_left,
+ unichar_inner_right,
+ priv->count,
+ exclusive);
+}
+
+static void
ide_source_view__completion_hide_cb (IdeSourceView *self,
GtkSourceCompletion *completion)
{
@@ -5359,6 +5384,7 @@ ide_source_view_class_init (IdeSourceViewClass *klass)
klass->save_command = ide_source_view_real_save_command;
klass->save_insert_mark = ide_source_view_real_save_insert_mark;
klass->save_search_char = ide_source_view_real_save_search_char;
+ klass->select_inner = ide_source_view_real_select_inner;
klass->selection_theatric = ide_source_view_real_selection_theatric;
klass->set_mode = ide_source_view_real_set_mode;
klass->set_overwrite = ide_source_view_real_set_overwrite;
@@ -6005,6 +6031,18 @@ ide_source_view_class_init (IdeSourceViewClass *klass)
G_TYPE_NONE,
0);
+ gSignals [SELECT_INNER] =
+ g_signal_new ("select-inner",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (IdeSourceViewClass, select_inner),
+ NULL, NULL, NULL,
+ G_TYPE_NONE,
+ 3,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_BOOLEAN);
+
gSignals [SELECTION_THEATRIC] =
g_signal_new ("selection-theatric",
G_TYPE_FROM_CLASS (klass),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]