[gtk+/gestures: 146/173] textview: Convert gestures' coordinates to text window ones
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gestures: 146/173] textview: Convert gestures' coordinates to text window ones
- Date: Fri, 16 May 2014 17:12:39 +0000 (UTC)
commit 6fc82b97124ca0bc24492c0a3254ddeb4426ca1b
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri May 9 13:19:12 2014 +0200
textview: Convert gestures' coordinates to text window ones
And make some code shared between multipress/drag gesture.
gtk/gtktextview.c | 144 ++++++++++++++++++++++++++++++----------------------
1 files changed, 83 insertions(+), 61 deletions(-)
---
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 9c47a50..7f95fc9 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -5008,6 +5008,38 @@ gtk_text_view_key_release_event (GtkWidget *widget, GdkEventKey *event)
return GTK_WIDGET_CLASS (gtk_text_view_parent_class)->key_release_event (widget, event);
}
+static gboolean
+get_iter_from_gesture (GtkTextView *text_view,
+ GtkGesture *gesture,
+ GtkTextIter *iter,
+ gint *x,
+ gint *y)
+{
+ GdkEventSequence *sequence;
+ GtkTextViewPrivate *priv;
+ gint xcoord, ycoord;
+ gdouble px, py;
+
+ priv = text_view->priv;
+ sequence =
+ gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
+
+ if (!gtk_gesture_get_point (gesture, sequence, &px, &py))
+ return FALSE;
+
+ xcoord = px + priv->xoffset;
+ ycoord = py + priv->yoffset;
+ _widget_to_text_window_coords (text_view, &xcoord, &ycoord);
+ gtk_text_layout_get_iter_at_pixel (priv->layout, iter, xcoord, ycoord);
+
+ if (x)
+ *x = xcoord;
+ if (y)
+ *y = ycoord;
+
+ return TRUE;
+}
+
static void
gtk_text_view_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
gint n_press,
@@ -5069,11 +5101,8 @@ gtk_text_view_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
with the middle button */
priv->scroll_after_paste = FALSE;
- gtk_text_layout_get_iter_at_pixel (priv->layout,
- &iter,
- x + priv->xoffset,
- y + priv->yoffset);
-
+ get_iter_from_gesture (text_view, priv->multipress_gesture,
+ &iter, NULL, NULL);
gtk_text_buffer_paste_clipboard (get_buffer (text_view),
gtk_widget_get_clipboard (GTK_WIDGET (text_view),
GDK_SELECTION_PRIMARY),
@@ -5094,10 +5123,8 @@ gtk_text_view_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
GtkTextIter start, end;
handle_mode = GTK_TEXT_HANDLE_MODE_CURSOR;
- gtk_text_layout_get_iter_at_pixel (priv->layout,
- &iter,
- x + priv->xoffset,
- y + priv->yoffset);
+ get_iter_from_gesture (text_view, priv->multipress_gesture,
+ &iter, NULL, NULL);
if (gtk_text_buffer_get_selection_bounds (get_buffer (text_view),
&start, &end) &&
@@ -5121,11 +5148,8 @@ gtk_text_view_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
handle_mode = GTK_TEXT_HANDLE_MODE_SELECTION;
gtk_text_view_end_selection_drag (text_view);
- gtk_text_layout_get_iter_at_pixel (priv->layout,
- &iter,
- x + priv->xoffset,
- y + priv->yoffset);
-
+ get_iter_from_gesture (text_view, priv->multipress_gesture,
+ &iter, NULL, NULL);
gtk_text_view_start_selection_drag (text_view, &iter,
n_press == 2 ? SELECT_WORDS : SELECT_LINES,
event);
@@ -6635,37 +6659,6 @@ gtk_text_view_unselect (GtkTextView *text_view)
&insert);
}
-static gboolean
-get_iter_from_gesture (GtkTextView *text_view,
- GtkTextIter *iter,
- gint *x,
- gint *y)
-{
- gdouble start_x, start_y, offset_x, offset_y;
- GtkTextViewPrivate *priv;
- gint xcoord, ycoord;
-
- priv = text_view->priv;
-
- if (!gtk_gesture_drag_get_start_point (GTK_GESTURE_DRAG (priv->drag_gesture),
- &start_x, &start_y) ||
- !gtk_gesture_drag_get_offset (GTK_GESTURE_DRAG (priv->drag_gesture),
- &offset_x, &offset_y))
- return FALSE;
-
- xcoord = start_x + offset_x + priv->xoffset;
- ycoord = start_y + offset_y + priv->yoffset;
- gtk_text_layout_get_iter_at_pixel (priv->layout, iter, xcoord, ycoord);
-
- if (x)
- *x = xcoord;
-
- if (y)
- *y = ycoord;
-
- return TRUE;
-}
-
static void
get_iter_at_pointer (GtkTextView *text_view,
GdkDevice *device,
@@ -6702,7 +6695,8 @@ move_mark_to_pointer_and_scroll (GtkTextView *text_view,
GtkTextMark *mark;
buffer = get_buffer (text_view);
- get_iter_from_gesture (text_view, &newplace, NULL, NULL);
+ get_iter_from_gesture (text_view, text_view->priv->drag_gesture,
+ &newplace, NULL, NULL);
mark = gtk_text_buffer_get_mark (buffer, mark_name);
@@ -6882,14 +6876,39 @@ selection_data_free (SelectionData *data)
g_free (data);
}
+static gboolean
+drag_gesture_get_text_window_coords (GtkGestureDrag *gesture,
+ GtkTextView *text_view,
+ gint *start_x,
+ gint *start_y,
+ gint *x,
+ gint *y)
+{
+ gdouble sx, sy, ox, oy;
+
+ if (!gtk_gesture_drag_get_start_point (gesture, &sx, &sy) ||
+ !gtk_gesture_drag_get_offset (gesture, &ox, &oy))
+ return FALSE;
+
+ *start_x = sx;
+ *start_y = sy;
+ _widget_to_text_window_coords (text_view, start_x, start_y);
+
+ *x = sx + ox;
+ *y = sy + oy;
+ _widget_to_text_window_coords (text_view, x, y);
+
+ return TRUE;
+}
+
static void
gtk_text_view_drag_gesture_update (GtkGestureDrag *gesture,
gdouble offset_x,
gdouble offset_y,
GtkTextView *text_view)
{
+ gint start_x, start_y, x, y;
GdkEventSequence *sequence;
- gdouble start_x, start_y;
gboolean is_touchscreen;
const GdkEvent *event;
SelectionData *data;
@@ -6898,15 +6917,16 @@ gtk_text_view_drag_gesture_update (GtkGestureDrag *gesture,
data = g_object_get_qdata (G_OBJECT (gesture), quark_text_selection_data);
sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
- gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
+ drag_gesture_get_text_window_coords (gesture, text_view,
+ &start_x, &start_y, &x, &y);
if (!data)
{
/* If no data is attached, the initial press happened within the current
* text selection, check for drag and drop to be initiated.
*/
- if (gtk_drag_check_threshold (GTK_WIDGET (text_view), start_x, start_y,
- start_x + offset_x, start_y + offset_y))
+ if (gtk_drag_check_threshold (GTK_WIDGET (text_view),
+ start_x, start_y, x, y))
{
GtkTextIter iter;
gint buffer_x, buffer_y;
@@ -6927,6 +6947,7 @@ gtk_text_view_drag_gesture_update (GtkGestureDrag *gesture,
return;
}
+ /* Text selection */
device = gdk_event_get_source_device (event);
is_touchscreen = test_touchscreen ||
@@ -6947,8 +6968,8 @@ gtk_text_view_drag_gesture_update (GtkGestureDrag *gesture,
gtk_text_buffer_get_iter_at_mark (buffer, &orig_start, data->orig_start);
gtk_text_buffer_get_iter_at_mark (buffer, &orig_end, data->orig_end);
- get_iter_from_gesture (text_view, &cursor, NULL, NULL);
-
+ get_iter_from_gesture (text_view, text_view->priv->drag_gesture,
+ &cursor, NULL, NULL);
start = cursor;
extend_selection (text_view, data->granularity, &start, &end);
@@ -6978,8 +6999,7 @@ gtk_text_view_drag_gesture_update (GtkGestureDrag *gesture,
{
_gtk_text_view_ensure_text_handles (text_view);
gtk_text_view_update_handles (text_view, GTK_TEXT_HANDLE_MODE_SELECTION);
- gtk_text_view_show_magnifier (text_view, start_x + offset_x,
- start_y + offset_y);
+ gtk_text_view_show_magnifier (text_view, x, y);
}
}
@@ -6989,17 +7009,20 @@ gtk_text_view_drag_gesture_end (GtkGestureDrag *gesture,
gdouble offset_y,
GtkTextView *text_view)
{
+ gboolean is_touchscreen, clicked_in_selection;
+ gint start_x, start_y, x, y;
GdkEventSequence *sequence;
- gdouble start_x, start_y;
GtkTextViewPrivate *priv;
- gboolean is_touchscreen;
const GdkEvent *event;
GdkDevice *device;
priv = text_view->priv;
sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
- gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
+ drag_gesture_get_text_window_coords (gesture, text_view,
+ &start_x, &start_y, &x, &y);
+ clicked_in_selection =
+ g_object_get_qdata (G_OBJECT (gesture), quark_text_selection_data) == NULL;
g_object_set_qdata (G_OBJECT (gesture), quark_text_selection_data, NULL);
gtk_text_view_unobscure_mouse_cursor (text_view);
@@ -7024,8 +7047,8 @@ gtk_text_view_drag_gesture_end (GtkGestureDrag *gesture,
if (is_touchscreen)
gtk_text_view_selection_bubble_popup_set (text_view);
- if (!gtk_drag_check_threshold (GTK_WIDGET (text_view), start_x, start_y,
- start_x + offset_x, start_y + offset_y))
+ if (clicked_in_selection &&
+ !gtk_drag_check_threshold (GTK_WIDGET (text_view), start_x, start_y, x, y))
{
GtkTextHandleMode mode = GTK_TEXT_HANDLE_MODE_NONE;
GtkTextIter iter;
@@ -7035,8 +7058,7 @@ gtk_text_view_drag_gesture_end (GtkGestureDrag *gesture,
* and place cursor.
*/
gtk_text_layout_get_iter_at_pixel (priv->layout, &iter,
- start_x + offset_x + priv->xoffset,
- start_y + offset_y + priv->yoffset);
+ x + priv->xoffset, y + priv->yoffset);
gtk_text_buffer_place_cursor (get_buffer (text_view), &iter);
gtk_text_view_check_cursor_blink (text_view);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]