]> Pileus Git - ~andy/gtk/commitdiff
Stop cursor blinking in non-editable regions of a text view. (#311508,
authorMatthias Clasen <mclasen@redhat.com>
Fri, 9 Sep 2005 18:34:43 +0000 (18:34 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 9 Sep 2005 18:34:43 +0000 (18:34 +0000)
2005-09-09  Matthias Clasen  <mclasen@redhat.com>

Stop cursor blinking in non-editable regions of a text view.
(#311508, Torbjörn Andersson)

* gtk/gtktextview.c (gtk_text_view_check_cursor_blink):
(cursor_blinks): Take editability into account when deciding
whether the cursor blinks.
(gtk_text_view_button_release_event):
(gtk_text_view_move_cursor_internal): Update cursor blinking here.

ChangeLog
ChangeLog.pre-2-10
gtk/gtktextview.c

index 3e34ca7d4a156ba69660dd3b1c22dd8ae03428e2..d217e9d9c06a929a014e58335bc55dc7ebf3d0e1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2005-09-09  Matthias Clasen  <mclasen@redhat.com>
+
+       Stop cursor blinking in non-editable regions of a text view.
+       (#311508, Torbjörn Andersson)
        
+       * gtk/gtktextview.c (gtk_text_view_check_cursor_blink): 
+       (cursor_blinks): Take editability into account when deciding
+       whether the cursor blinks.
+       (gtk_text_view_button_release_event): 
+       (gtk_text_view_move_cursor_internal): Update cursor blinking here.
+
+       * gtk/gtkcellrenderertext.c (gtk_cell_renderer_text_start_editing): 
+       Use connect_after to connect to the focus_out event. This
+       ensures that the entry has already stopped blinking by the time
+       we emit the edited signal.  (#315229, Thomas Leonard)
+
        * tests/testgtk.c: Use GDK_MOD1_MASK, not GDK_ALT_MASK.
 
        * gtk/gtkwindow.c (gtk_window_parse_geometry): Don't set
index 3e34ca7d4a156ba69660dd3b1c22dd8ae03428e2..d217e9d9c06a929a014e58335bc55dc7ebf3d0e1 100644 (file)
@@ -1,5 +1,19 @@
 2005-09-09  Matthias Clasen  <mclasen@redhat.com>
+
+       Stop cursor blinking in non-editable regions of a text view.
+       (#311508, Torbjörn Andersson)
        
+       * gtk/gtktextview.c (gtk_text_view_check_cursor_blink): 
+       (cursor_blinks): Take editability into account when deciding
+       whether the cursor blinks.
+       (gtk_text_view_button_release_event): 
+       (gtk_text_view_move_cursor_internal): Update cursor blinking here.
+
+       * gtk/gtkcellrenderertext.c (gtk_cell_renderer_text_start_editing): 
+       Use connect_after to connect to the focus_out event. This
+       ensures that the entry has already stopped blinking by the time
+       we emit the edited signal.  (#315229, Thomas Leonard)
+
        * tests/testgtk.c: Use GDK_MOD1_MASK, not GDK_ALT_MASK.
 
        * gtk/gtkwindow.c (gtk_window_parse_geometry): Don't set
index 82f534d99dd8c259927a538b8fd2b98ba1f8e8e2..7e15007f892d294b42eec146f11408868ec505bb 100644 (file)
@@ -4076,7 +4076,8 @@ gtk_text_view_button_release_event (GtkWidget *widget, GdkEventButton *event)
                                             event->y + text_view->yoffset);
 
          gtk_text_buffer_place_cursor (get_buffer (text_view), &iter);
-
+         gtk_text_view_check_cursor_blink (text_view);
+         
           text_view->pending_place_cursor_button = 0;
           
           return FALSE;
@@ -4456,14 +4457,23 @@ cursor_blinks (GtkTextView *text_view)
 #endif
   if (gtk_debug_flags & GTK_DEBUG_UPDATES)
     return FALSE;
-  
+
   if (text_view->editable)
     {
-      g_object_get (settings, "gtk-cursor-blink", &blink, NULL);
-      return blink;
+      GtkTextMark *insert;
+      GtkTextIter iter;
+      
+      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_editable (&iter, text_view->editable))
+       {
+         g_object_get (settings, "gtk-cursor-blink", &blink, NULL);
+         return blink;
+       }
     }
-  else
-    return FALSE;
+
+  return FALSE;
 }
 
 static gint
@@ -4551,42 +4561,34 @@ gtk_text_view_check_cursor_blink (GtkTextView *text_view)
 {
   if (text_view->layout != NULL &&
       text_view->cursor_visible &&
-      GTK_WIDGET_HAS_FOCUS (text_view))
+      GTK_WIDGET_HAS_FOCUS (text_view) &&
+      cursor_blinks (text_view))
     {
-      if (cursor_blinks (text_view))
+      if (text_view->blink_timeout == 0)
        {
-         if (text_view->blink_timeout == 0)
-           {
-             gtk_text_layout_set_cursor_visible (text_view->layout, TRUE);
-             
-             text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_OFF_MULTIPLIER,
-                                                       blink_cb,
-                                                       text_view);
-           }
+         gtk_text_layout_set_cursor_visible (text_view->layout, TRUE);
+         
+         text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_OFF_MULTIPLIER,
+                                                   blink_cb,
+                                                   text_view);
        }
-      else
-       gtk_text_layout_set_cursor_visible (text_view->layout, TRUE);   
     }
   else
     {
       gtk_text_view_stop_cursor_blink (text_view);
+      gtk_text_layout_set_cursor_visible (text_view->layout, TRUE);    
     }
 }
 
 static void
-gtk_text_view_pend_cursor_blink(GtkTextView *text_view)
+gtk_text_view_pend_cursor_blink (GtkTextView *text_view)
 {
   if (text_view->layout != NULL &&
       text_view->cursor_visible &&
       GTK_WIDGET_HAS_FOCUS (text_view) &&
       cursor_blinks (text_view))
     {
-      if (text_view->blink_timeout != 0)
-       {
-         g_source_remove (text_view->blink_timeout);
-         text_view->blink_timeout = 0;
-       }
-      
+      gtk_text_view_stop_cursor_blink (text_view);
       gtk_text_layout_set_cursor_visible (text_view->layout, TRUE);
       
       text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_PEND_MULTIPLIER,
@@ -4632,8 +4634,9 @@ move_cursor (GtkTextView       *text_view,
                                        "insert",
                                        new_location);
   else
-    gtk_text_buffer_place_cursor (get_buffer (text_view),
-                                  new_location);
+      gtk_text_buffer_place_cursor (get_buffer (text_view),
+                                   new_location);
+  gtk_text_view_check_cursor_blink (text_view);
 }
 
 static void
@@ -4690,12 +4693,14 @@ gtk_text_view_move_cursor_internal (GtkTextView     *text_view,
   if (step == GTK_MOVEMENT_PAGES)
     {
       gtk_text_view_scroll_pages (text_view, count, extend_selection);
+      gtk_text_view_check_cursor_blink (text_view);
       gtk_text_view_pend_cursor_blink (text_view);
       return;
     }
   else if (step == GTK_MOVEMENT_HORIZONTAL_PAGES)
     {
       gtk_text_view_scroll_hpages (text_view, count, extend_selection);
+      gtk_text_view_check_cursor_blink (text_view);
       gtk_text_view_pend_cursor_blink (text_view);
       return;
     }
@@ -4815,6 +4820,7 @@ gtk_text_view_move_cursor_internal (GtkTextView     *text_view,
         gtk_text_view_set_virtual_cursor_pos (text_view, cursor_x_pos, -1);
     }
 
+  gtk_text_view_check_cursor_blink (text_view);
   gtk_text_view_pend_cursor_blink (text_view);
 }
 
@@ -5735,7 +5741,8 @@ gtk_text_view_start_selection_drag (GtkTextView       *text_view,
     }
 
   gtk_text_buffer_select_range (buffer, &end, &start);
-
+  gtk_text_view_check_cursor_blink (text_view);
+  
   text_view->selection_drag_handler = g_signal_connect (text_view,
                                                         "motion_notify_event",
                                                         G_CALLBACK (selection_motion_event_handler),