[gtk+/touch-text-selection] textview: Update to new GtkTextHandlePosition values



commit 2b02d97a93e9e3159e28773b2942e02cd92f88a6
Author: Carlos Garnacho <carlos lanedo com>
Date:   Mon Aug 27 14:38:15 2012 +0200

    textview: Update to new GtkTextHandlePosition values

 gtk/gtktextview.c |  110 +++++++++++++++++++++++++---------------------------
 1 files changed, 53 insertions(+), 57 deletions(-)
---
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 43e3f23..fa41468 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -232,9 +232,7 @@ struct _GtkTextViewPrivate
   guint hscroll_policy : 1;
   guint vscroll_policy : 1;
 
-  guint cursor_handle_dragged : 1;
-  guint selection_handle_dragged : 1;
-  guint update_handles_on_focus : 1
+  guint update_handles_on_focus : 1;
 };
 
 struct _GtkTextPendingScroll
@@ -509,10 +507,6 @@ static void gtk_text_view_handle_dragged       (GtkTextHandle         *handle,
                                                 gint                   x,
                                                 gint                   y,
                                                 GtkTextView           *text_view);
-static void gtk_text_view_handle_drag_finished (GtkTextHandle         *handle,
-                                                GtkTextHandlePosition  pos,
-                                                GtkTextView           *text_view);
-
 
 /* FIXME probably need the focus methods. */
 
@@ -1479,8 +1473,6 @@ gtk_text_view_init (GtkTextView *text_view)
   priv->text_handle = _gtk_text_handle_new (widget);
   g_signal_connect (priv->text_handle, "handle-dragged",
                     G_CALLBACK (gtk_text_view_handle_dragged), text_view);
-  g_signal_connect (priv->text_handle, "drag-finished",
-                    G_CALLBACK (gtk_text_view_handle_drag_finished), text_view);
 }
 
 /**
@@ -4459,15 +4451,12 @@ _gtk_text_view_set_handle_position (GtkTextView           *text_view,
   x = rect.x - priv->xoffset;
   y = rect.y - priv->yoffset;
 
-  if (((!priv->cursor_handle_dragged &&
-        pos == GTK_TEXT_HANDLE_POSITION_CURSOR) ||
-       (!priv->selection_handle_dragged &&
-        pos == GTK_TEXT_HANDLE_POSITION_SELECTION_BOUND)) &&
+  if (!_gtk_text_handle_get_is_dragged (priv->text_handle, pos) &&
       (x < 0 || x > SCREEN_WIDTH (text_view) ||
        y < 0 || y > SCREEN_HEIGHT (text_view)))
     {
-      /* Hide the opposite handle if it's not being manipulated
-       * too and fell outside of the visible text area.
+      /* Hide the handle if it's not being manipulated
+       * and fell outside of the visible text area.
        */
       _gtk_text_handle_set_visible (priv->text_handle, pos, FALSE);
     }
@@ -4491,8 +4480,10 @@ gtk_text_view_handle_dragged (GtkTextHandle         *handle,
   GtkTextViewPrivate *priv;
   GtkTextIter old_cursor, old_bound;
   GtkTextIter cursor, bound, iter;
+  GtkTextIter *min, *max;
   GtkTextHandleMode mode;
   GtkTextBuffer *buffer;
+  GtkTextHandlePosition cursor_pos;
 
   priv = text_view->priv;
   buffer = get_buffer (text_view);
@@ -4505,38 +4496,46 @@ gtk_text_view_handle_dragged (GtkTextHandle         *handle,
                                     gtk_text_buffer_get_insert (buffer));
   gtk_text_buffer_get_iter_at_mark (buffer, &old_bound,
                                     gtk_text_buffer_get_selection_bound (buffer));
+  cursor = old_cursor;
+  bound = old_bound;
 
-  if (pos == GTK_TEXT_HANDLE_POSITION_CURSOR)
+  if (mode == GTK_TEXT_HANDLE_MODE_CURSOR ||
+      gtk_text_iter_compare (&cursor, &bound) >= 0)
+    {
+      cursor_pos = GTK_TEXT_HANDLE_POSITION_CURSOR;
+      max = &cursor;
+      min = &bound;
+    }
+  else
     {
-      priv->cursor_handle_dragged = TRUE;
-      bound = old_bound;
+      cursor_pos = GTK_TEXT_HANDLE_POSITION_SELECTION_START;
+      max = &bound;
+      min = &cursor;
+    }
 
+  if (pos == GTK_TEXT_HANDLE_POSITION_SELECTION_END)
+    {
       if (mode == GTK_TEXT_HANDLE_MODE_SELECTION &&
-	  gtk_text_iter_compare (&iter, &old_bound) <= 0)
+	  gtk_text_iter_compare (&iter, min) <= 0)
         {
-          iter = old_bound;
+          iter = *min;
           gtk_text_iter_forward_char (&iter);
         }
 
-      cursor = iter;
-      _gtk_text_view_set_handle_position (text_view, &iter,
-                                          GTK_TEXT_HANDLE_POSITION_CURSOR);
+      *max = iter;
+      _gtk_text_view_set_handle_position (text_view, &iter, pos);
     }
   else
     {
-      priv->selection_handle_dragged = TRUE;
-      cursor = old_cursor;
-
       if (mode == GTK_TEXT_HANDLE_MODE_SELECTION &&
-	  gtk_text_iter_compare (&iter, &old_cursor) >= 0)
+	  gtk_text_iter_compare (&iter, max) >= 0)
         {
-          iter = old_cursor;
+          iter = *max;
           gtk_text_iter_backward_char (&iter);
         }
 
-      bound = iter;
-      _gtk_text_view_set_handle_position (text_view, &iter,
-                                          GTK_TEXT_HANDLE_POSITION_SELECTION_BOUND);
+      *min = iter;
+      _gtk_text_view_set_handle_position (text_view, &iter, pos);
     }
 
   if (gtk_text_iter_compare (&old_cursor, &cursor) != 0 ||
@@ -4547,7 +4546,7 @@ gtk_text_view_handle_dragged (GtkTextHandle         *handle,
       else
         gtk_text_buffer_select_range (buffer, &cursor, &bound);
 
-      if (priv->cursor_handle_dragged)
+      if (_gtk_text_handle_get_is_dragged (priv->text_handle, cursor_pos))
         gtk_text_view_scroll_mark_onscreen (text_view,
                                             gtk_text_buffer_get_insert (buffer));
       else
@@ -4557,44 +4556,40 @@ gtk_text_view_handle_dragged (GtkTextHandle         *handle,
 }
 
 static void
-gtk_text_view_handle_drag_finished (GtkTextHandle         *handle,
-                                    GtkTextHandlePosition  pos,
-                                    GtkTextView           *text_view)
-{
-  GtkTextViewPrivate *priv = text_view->priv;
-
-  if (pos == GTK_TEXT_HANDLE_POSITION_CURSOR)
-    priv->cursor_handle_dragged = FALSE;
-  else
-    priv->selection_handle_dragged = FALSE;
-}
-
-static void
 _gtk_text_view_update_handles (GtkTextView       *text_view,
                                GtkTextHandleMode  mode)
 {
   GtkTextViewPrivate *priv = text_view->priv;
+  GtkTextIter cursor, bound, min, max;
   GtkTextBuffer *buffer;
-  GtkTextIter iter;
 
   _gtk_text_handle_set_mode (priv->text_handle, mode);
   buffer = get_buffer (text_view);
 
-  if (mode != GTK_TEXT_HANDLE_MODE_NONE)
+  gtk_text_buffer_get_iter_at_mark (buffer, &cursor,
+                                    gtk_text_buffer_get_insert (buffer));
+  gtk_text_buffer_get_iter_at_mark (buffer, &bound,
+                                    gtk_text_buffer_get_selection_bound (buffer));
+
+  if (gtk_text_iter_compare (&cursor, &bound) >= 0)
     {
-      gtk_text_buffer_get_iter_at_mark (buffer, &iter,
-                                        gtk_text_buffer_get_insert (buffer));
-      _gtk_text_view_set_handle_position (text_view, &iter,
-                                          GTK_TEXT_HANDLE_POSITION_CURSOR);
+      min = bound;
+      max = cursor;
     }
-
-  if (mode == GTK_TEXT_HANDLE_MODE_SELECTION)
+  else
     {
-      gtk_text_buffer_get_iter_at_mark (buffer, &iter,
-                                        gtk_text_buffer_get_selection_bound (buffer));
-      _gtk_text_view_set_handle_position (text_view, &iter,
-                                          GTK_TEXT_HANDLE_POSITION_SELECTION_BOUND);
+      min = cursor;
+      max = bound;
     }
+
+
+  if (mode != GTK_TEXT_HANDLE_MODE_NONE)
+    _gtk_text_view_set_handle_position (text_view, &max,
+                                          GTK_TEXT_HANDLE_POSITION_SELECTION_END);
+
+  if (mode == GTK_TEXT_HANDLE_MODE_SELECTION)
+    _gtk_text_view_set_handle_position (text_view, &min,
+                                        GTK_TEXT_HANDLE_POSITION_SELECTION_START);
 }
 
 static gint
@@ -4881,6 +4876,7 @@ gtk_text_view_button_press_event (GtkWidget *widget, GdkEventButton *event)
 					 event->y + priv->yoffset);
       
       gtk_text_view_start_selection_drag (text_view, &iter, event);
+      _gtk_text_view_update_handles (text_view, GTK_TEXT_HANDLE_MODE_SELECTION);
       return TRUE;
     }
   



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