[gtksourceview] Turn alt+up/down in a proper keybinding



commit 5ac5099a2fe28cc8d7851ba8dcc6c8126dae0f28
Author: Paolo Borelli <pborelli gnome org>
Date:   Tue Jan 19 11:24:23 2010 +0100

    Turn alt+up/down in a proper keybinding

 gtksourceview/gtksourceview-marshal.list |    1 +
 gtksourceview/gtksourceview.c            |   68 ++++++++++++++++++++++++------
 gtksourceview/gtksourceview.h            |    4 +-
 3 files changed, 59 insertions(+), 14 deletions(-)
---
diff --git a/gtksourceview/gtksourceview-marshal.list b/gtksourceview/gtksourceview-marshal.list
index 84dd412..e2ffb4b 100644
--- a/gtksourceview/gtksourceview-marshal.list
+++ b/gtksourceview/gtksourceview-marshal.list
@@ -1,5 +1,6 @@
 VOID:VOID
 VOID:BOOLEAN
+VOID:BOOLEAN,INT
 VOID:BOXED
 VOID:BOXED,BOXED
 VOID:INT,INT
diff --git a/gtksourceview/gtksourceview.c b/gtksourceview/gtksourceview.c
index 12c9bb0..fce4b68 100644
--- a/gtksourceview/gtksourceview.c
+++ b/gtksourceview/gtksourceview.c
@@ -94,6 +94,7 @@ enum {
 	REDO,
 	SHOW_COMPLETION,
 	LINE_MARK_ACTIVATED,
+	MOVE_LINES,
 	LAST_SIGNAL
 };
 
@@ -234,6 +235,9 @@ static void 	gtk_source_view_get_lines 		(GtkTextView       *text_view,
 				       			 gint              *countp);
 static gint     gtk_source_view_expose 			(GtkWidget         *widget,
 							 GdkEventExpose    *event);
+static void	gtk_source_view_move_lines		(GtkSourceView     *view,
+							 gboolean           copy,
+							 gint               step);
 static gboolean	gtk_source_view_key_press_event		(GtkWidget         *widget,
 							 GdkEventKey       *event);
 static void 	view_dnd_drop 				(GtkTextView       *view,
@@ -307,6 +311,7 @@ gtk_source_view_class_init (GtkSourceViewClass *klass)
 	klass->undo = gtk_source_view_undo;
 	klass->redo = gtk_source_view_redo;
 	klass->show_completion = gtk_source_view_show_completion_real;
+	klass->move_lines = gtk_source_view_move_lines;
 
 	/**
 	 * GtkSourceView:show-line-numbers:
@@ -537,6 +542,18 @@ gtk_source_view_class_init (GtkSourceViewClass *klass)
 			      GTK_TYPE_TEXT_ITER,
 			      GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
+	signals [MOVE_LINES] =
+		g_signal_new ("move-lines",
+			      G_TYPE_FROM_CLASS (klass),
+			      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+			      G_STRUCT_OFFSET (GtkSourceViewClass, move_lines),
+			      NULL,
+			      NULL,
+			      _gtksourceview_marshal_VOID__BOOLEAN_INT,
+			      G_TYPE_NONE, 2,
+			      G_TYPE_BOOLEAN,
+			      G_TYPE_INT);
+
 	binding_set = gtk_binding_set_by_class (klass);
 
 	gtk_binding_entry_add_signal (binding_set,
@@ -558,6 +575,31 @@ gtk_source_view_class_init (GtkSourceViewClass *klass)
 
 	gtk_binding_entry_add_signal (binding_set,
 				      GDK_Up,
+				      GDK_MOD1_MASK,
+				      "move_lines", 2,
+				      G_TYPE_BOOLEAN, FALSE,
+				      G_TYPE_INT, -1);
+	gtk_binding_entry_add_signal (binding_set,
+				      GDK_KP_Up,
+				      GDK_MOD1_MASK,
+				      "move_lines", 2,
+				      G_TYPE_BOOLEAN, FALSE,
+				      G_TYPE_INT, -1);
+	gtk_binding_entry_add_signal (binding_set,
+				      GDK_Down,
+				      GDK_MOD1_MASK,
+				      "move_lines", 2,
+				      G_TYPE_BOOLEAN, FALSE,
+				      G_TYPE_INT, 1);
+	gtk_binding_entry_add_signal (binding_set,
+				      GDK_KP_Down,
+				      GDK_MOD1_MASK,
+				      "move_lines", 2,
+				      G_TYPE_BOOLEAN, FALSE,
+				      G_TYPE_INT, 1);
+
+	gtk_binding_entry_add_signal (binding_set,
+				      GDK_Up,
 				      GDK_MOD1_MASK | GDK_SHIFT_MASK,
 				      "move_viewport", 2,
 				      GTK_TYPE_SCROLL_STEP, GTK_SCROLL_STEPS,
@@ -3952,14 +3994,22 @@ insert_tab_or_spaces (GtkSourceView *view,
 }
 
 static void
-move_lines (GtkTextView *view, gboolean down)
+gtk_source_view_move_lines (GtkSourceView *view, gboolean copy, gint step)
 {
 	GtkTextBuffer *buf;
 	GtkTextIter s, e;
 	GtkTextMark *mark;
+	gboolean down;
 	gchar *text;
 
-	buf = gtk_text_view_get_buffer (view);
+	buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
+
+	if (step == 0 || gtk_text_view_get_editable (GTK_TEXT_VIEW (view)) == FALSE)
+		return;
+
+	/* FIXME: for now we just handle a step of one line */
+
+	down = step > 0;
 
 	gtk_text_buffer_get_selection_bounds (buf, &s, &e);
 
@@ -4003,7 +4053,8 @@ move_lines (GtkTextView *view, gboolean down)
 
 	gtk_text_buffer_begin_user_action (buf);
 
-	gtk_text_buffer_delete (buf, &s, &e);
+	if (!copy)
+		gtk_text_buffer_delete (buf, &s, &e);
 
 	if (down)
 	{
@@ -4042,7 +4093,7 @@ move_lines (GtkTextView *view, gboolean down)
 	/* select the moved text */
 	gtk_text_buffer_get_iter_at_mark (buf, &s, mark);
 	gtk_text_buffer_select_range (buf, &s, &e);
-	gtk_text_view_scroll_mark_onscreen (view,
+	gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW (view),
 					    gtk_text_buffer_get_insert (buf));
 
 	gtk_text_buffer_delete_mark (buf, mark);
@@ -4180,15 +4231,6 @@ gtk_source_view_key_press_event (GtkWidget   *widget,
  		return TRUE;
 	}
 
-	/* Alt+up/down moves the lines */
-	if ((key == GDK_Up || key == GDK_Down) &&
-	    ((event->state & modifiers) == GDK_MOD1_MASK) &&
-	    editable)
-	{
-		move_lines (GTK_TEXT_VIEW (widget), key == GDK_Down);
-		return TRUE;
-	}
-
 	return GTK_WIDGET_CLASS (gtk_source_view_parent_class)->key_press_event (widget, event);
 }
 
diff --git a/gtksourceview/gtksourceview.h b/gtksourceview/gtksourceview.h
index e7a5672..d5beba8 100644
--- a/gtksourceview/gtksourceview.h
+++ b/gtksourceview/gtksourceview.h
@@ -68,10 +68,12 @@ struct _GtkSourceViewClass
 	                             GtkTextIter   *iter,
 	                             GdkEvent      *event);
 	void (*show_completion) (GtkSourceView *view);
+	void (*move_lines) (GtkSourceView *view,
+	                    gboolean       copy,
+	                    gint           step);
 
 	/* Padding for future expansion */
 	void (*_gtk_source_reserved1) (void);
-	void (*_gtk_source_reserved2) (void);
 };
 
 /**



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