aboutsummaryrefslogtreecommitdiff
path: root/hildon
diff options
context:
space:
mode:
authorXabier Rodriguez Calvar <xrcalvar@igalia.com>2009-11-23 14:04:05 +0100
committerXabier Rodriguez Calvar <xrcalvar@igalia.com>2009-12-09 15:25:10 +0100
commit691f65bd0e56d75dbb3dd179aaeef99165f7b063 (patch)
tree5f120596801553cc329653ba0f724789a2c0e9a8 /hildon
parenta70b554d755330eabe70a94259183992a94adfbb (diff)
Implemented selection with Shift in HildonTextView
It uses GDK_SHIFT_MASK to detect the key and lets GtkTextView do the hard work.
Diffstat (limited to 'hildon')
-rw-r--r--hildon/hildon-text-view.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/hildon/hildon-text-view.c b/hildon/hildon-text-view.c
index 0a67ac2..1d95f1c 100644
--- a/hildon/hildon-text-view.c
+++ b/hildon/hildon-text-view.c
@@ -66,6 +66,7 @@ struct _HildonTextViewPrivate
{
gdouble x; /* tap x position */
gdouble y; /* tap y position */
+ gboolean selection_movement; /* selection in progress */
};
@@ -171,6 +172,31 @@ hildon_text_view_button_press_event (GtkWidget *widget,
priv->x = event->x;
priv->y = event->y;
+ if (event->state & GDK_SHIFT_MASK) {
+ GtkTextBuffer *buffer;
+ GtkTextWindowType window_type;
+ GtkTextIter iter;
+ gint x, y;
+ GtkTextView *text_view = GTK_TEXT_VIEW (widget);
+
+ priv->selection_movement = TRUE;
+
+ window_type = gtk_text_view_get_window_type (text_view,
+ event->window);
+ gtk_text_view_window_to_buffer_coords (text_view,
+ window_type,
+ event->x, event->y,
+ &x, &y);
+ gtk_text_view_get_iter_at_location (text_view, &iter, x, y);
+ buffer = gtk_text_view_get_buffer (text_view);
+ if (gtk_text_buffer_get_char_count (buffer)) {
+ gtk_text_buffer_place_cursor (buffer, &iter);
+ }
+
+ return GTK_WIDGET_CLASS (hildon_text_view_parent_class)->
+ button_press_event (widget, event);
+ }
+
return TRUE;
}
@@ -192,7 +218,8 @@ hildon_text_view_button_release_event (GtkWidget *widget,
return TRUE;
}
- if (event->button == 1 && event->type == GDK_BUTTON_RELEASE) {
+ if (event->button == 1 && event->type == GDK_BUTTON_RELEASE &&
+ !priv->selection_movement) {
if (fabs (priv->x - event->x) < HILDON_TEXT_VIEW_DRAG_THRESHOLD &&
fabs (priv->y - event->y) < HILDON_TEXT_VIEW_DRAG_THRESHOLD) {
GtkTextWindowType window_type;
@@ -213,6 +240,20 @@ hildon_text_view_button_release_event (GtkWidget *widget,
return TRUE;
}
}
+
+ if (priv->selection_movement) {
+ gboolean result;
+
+ result = GTK_WIDGET_CLASS (hildon_text_view_parent_class)->
+ button_release_event (widget, event);
+
+ if (result) {
+ priv->selection_movement = FALSE;
+ }
+
+ return result;
+ }
+
return FALSE;
}
@@ -230,4 +271,7 @@ hildon_text_view_class_init (HildonTextViewClass *klass)
static void
hildon_text_view_init (HildonTextView *self)
{
+ HildonTextViewPrivate *priv = HILDON_TEXT_VIEW_GET_PRIVATE (self);
+
+ priv->selection_movement = FALSE;
}