+static gint
+hildon_text_view_button_press_event (GtkWidget *widget,
+ GdkEventButton *event)
+{
+ HildonTextViewPrivate *priv = HILDON_TEXT_VIEW_GET_PRIVATE (widget);
+
+ if (GTK_TEXT_VIEW (widget)->editable &&
+ hildon_gtk_im_context_filter_event (GTK_TEXT_VIEW (widget)->im_context, (GdkEvent*)event)) {
+ GTK_TEXT_VIEW (widget)->need_im_reset = TRUE;
+ return TRUE;
+ }
+
+ if (event->button == 1 && event->type == GDK_BUTTON_PRESS) {
+ priv->x = event->x;
+ priv->y = event->y;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gint
+hildon_text_view_button_release_event (GtkWidget *widget,
+ GdkEventButton *event)
+{
+ GtkTextView *text_view = GTK_TEXT_VIEW (widget);
+ HildonTextViewPrivate *priv = HILDON_TEXT_VIEW_GET_PRIVATE (widget);
+ GtkTextIter iter;
+ gint x, y;
+
+ if (text_view->editable &&
+ hildon_gtk_im_context_filter_event (text_view->im_context, (GdkEvent*)event)) {
+ text_view->need_im_reset = TRUE;
+ return TRUE;
+ }
+
+ if (event->button == 1 && event->type == GDK_BUTTON_RELEASE) {
+ if (fabs (priv->x - event->x) < HILDON_TEXT_VIEW_DRAG_THRESHOLD &&
+ fabs (priv->y - event->y) < HILDON_TEXT_VIEW_DRAG_THRESHOLD) {
+ GtkTextWindowType window_type;
+
+ 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);
+ if (gtk_text_buffer_get_char_count (priv->main_buffer))
+ gtk_text_buffer_place_cursor (priv->main_buffer, &iter);
+
+ gtk_widget_grab_focus (GTK_WIDGET (text_view));
+
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+