[gtk+/gtk-3-16] text view: Improve cursor hiding logic



commit 6b9edc43af5171fbf4019c8378579b44755893ed
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Sep 3 13:52:09 2015 -0400

    text view: Improve cursor hiding logic
    
    Same as we did for the entry in the previous commit.
    
    Previously, we just hid the cursor if a key event was adding text,
    but not when you used backspace, or Ctrl-V. Rearrange things so that
    we obscure the cursor whenever the buffer contents change while we
    are handling key events.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=754535

 gtk/gtktextview.c |   32 ++++++++++++++++++++------------
 1 files changed, 20 insertions(+), 12 deletions(-)
---
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index a247586..b5cbe4c 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -246,6 +246,7 @@ struct _GtkTextViewPrivate
   guint populate_all   : 1;
 
   guint in_scroll : 1;
+  guint handling_key_event : 1;
 };
 
 struct _GtkTextPendingScroll
@@ -4982,11 +4983,12 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event)
 
   text_view = GTK_TEXT_VIEW (widget);
   priv = text_view->priv;
-  
-  if (priv->layout == NULL ||
-      get_buffer (text_view) == NULL)
+
+  if (priv->layout == NULL || get_buffer (text_view) == NULL)
     return FALSE;
 
+  priv->handling_key_event = TRUE;
+
   /* Make sure input method knows where it is */
   flush_update_im_spot_location (text_view);
 
@@ -5017,8 +5019,6 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event)
        */
       gtk_text_view_reset_im_context (text_view);
       gtk_text_view_commit_text (text_view, "\n");
-
-      obscure = TRUE;
       retval = TRUE;
     }
   /* Pass through Tab as literal tab, unless Control is held down */
@@ -5034,7 +5034,6 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event)
        {
          gtk_text_view_reset_im_context (text_view);
          gtk_text_view_commit_text (text_view, "\t");
-         obscure = TRUE;
        }
       else
        g_signal_emit_by_name (text_view, "move-focus",
@@ -5046,9 +5045,6 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event)
   else
     retval = FALSE;
 
-  if (obscure)
-    gtk_text_view_obscure_mouse_cursor (text_view);
-  
   gtk_text_view_reset_blink_time (text_view);
   gtk_text_view_pend_cursor_blink (text_view);
 
@@ -5058,6 +5054,8 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event)
 
   gtk_text_view_selection_bubble_popup_unset (text_view);
 
+  priv->handling_key_event = FALSE;
+
   return retval;
 }
 
@@ -5068,23 +5066,30 @@ gtk_text_view_key_release_event (GtkWidget *widget, GdkEventKey *event)
   GtkTextViewPrivate *priv;
   GtkTextMark *insert;
   GtkTextIter iter;
+  gboolean retval = FALSE;
 
   text_view = GTK_TEXT_VIEW (widget);
   priv = text_view->priv;
 
   if (priv->layout == NULL || get_buffer (text_view) == NULL)
     return FALSE;
-      
+
+  priv->handling_key_event = TRUE;
+
   insert = gtk_text_buffer_get_insert (get_buffer (text_view));
   gtk_text_buffer_get_iter_at_mark (get_buffer (text_view), &iter, insert);
   if (gtk_text_iter_can_insert (&iter, priv->editable) &&
       gtk_im_context_filter_keypress (priv->im_context, event))
     {
       priv->need_im_reset = TRUE;
-      return TRUE;
+      retval = TRUE;
     }
   else
-    return GTK_WIDGET_CLASS (gtk_text_view_parent_class)->key_release_event (widget, event);
+    retval = GTK_WIDGET_CLASS (gtk_text_view_parent_class)->key_release_event (widget, event);
+
+  priv->handling_key_event = FALSE;
+
+  return retval;
 }
 
 static gboolean
@@ -6704,6 +6709,9 @@ gtk_text_view_buffer_changed_handler (GtkTextBuffer *buffer,
   GtkTextView *text_view = data;
   GtkTextViewPrivate *priv = text_view->priv;
 
+  if (priv->handling_key_event)
+    gtk_text_view_obscure_mouse_cursor (text_view);
+
   if (priv->text_handle)
     gtk_text_view_update_handles (text_view,
                                   _gtk_text_handle_get_mode (priv->text_handle));


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