gtkhtml r9202 - trunk/gtkhtml



Author: mcrha
Date: Fri Apr 10 10:17:33 2009
New Revision: 9202
URL: http://svn.gnome.org/viewvc/gtkhtml?rev=9202&view=rev

Log:
2009-04-10  Milan Crha  <mcrha redhat com>

	** Fix for bug #494986

	* gtkhtml-private.h: (struct _GtkHTMLPrivate):
	* gtkhtml.c: (any_has_cursor_moved), (any_has_skip_update_cursor),
	(idle_handler), (gtk_html_init), (cursor_move), (move_selection):
	Do not block view update when cursor changed in any frame of the
	whole hierarchy.



Modified:
   trunk/gtkhtml/ChangeLog
   trunk/gtkhtml/gtkhtml-private.h
   trunk/gtkhtml/gtkhtml.c

Modified: trunk/gtkhtml/gtkhtml-private.h
==============================================================================
--- trunk/gtkhtml/gtkhtml-private.h	(original)
+++ trunk/gtkhtml/gtkhtml-private.h	Fri Apr 10 10:17:33 2009
@@ -37,6 +37,7 @@
 
 	gboolean update_styles;
 	gboolean skip_update_cursor;
+	gboolean cursor_moved;
 
 	gint selection_type;
 

Modified: trunk/gtkhtml/gtkhtml.c
==============================================================================
--- trunk/gtkhtml/gtkhtml.c	(original)
+++ trunk/gtkhtml/gtkhtml.c	Fri Apr 10 10:17:33 2009
@@ -197,6 +197,8 @@
 static void     add_bindings           (GtkHTMLClass *klass);
 static const gchar * get_value_nick    (GtkHTMLCommandType com_type);
 static void	gtk_html_adjust_cursor_position (GtkHTML *html);
+static gboolean any_has_cursor_moved (GtkHTML *html);
+static gboolean any_has_skip_update_cursor (GtkHTML *html);
 
 /* Interval for scrolling during selection.  */
 #define SCROLL_TIMEOUT_INTERVAL 10
@@ -383,7 +385,7 @@
 	html = GTK_HTML (data);
 	engine = html->engine;
 
-	also_update_cursor = !html->priv->skip_update_cursor;
+	also_update_cursor = any_has_cursor_moved (html) || !any_has_skip_update_cursor (html);
 
 	if (html->engine->thaw_idle_id == 0 && !html_engine_frozen (html->engine))
 		html_engine_flush_draw_queue (engine);
@@ -393,14 +395,20 @@
 
  	html->priv->idle_handler_id = 0;
 	html->priv->skip_update_cursor = FALSE;
+	html->priv->cursor_moved = FALSE;
 
-	if (also_update_cursor) {
-		while (html->iframe_parent) {
-			html = GTK_HTML (html->iframe_parent);
-			gtk_html_adjust_cursor_position (html);
+	while (html->iframe_parent) {
+		html = GTK_HTML (html->iframe_parent);
+
+		if (html) {
+			html->priv->skip_update_cursor = FALSE;
+			html->priv->cursor_moved = FALSE;
 		}
 
+		if (also_update_cursor)
+			gtk_html_adjust_cursor_position (html);
 	}
+
 	return FALSE;
 }
 
@@ -1985,6 +1993,32 @@
 	return FALSE;
 }
 
+static gboolean
+any_has_cursor_moved (GtkHTML *html)
+{
+	while (html) {
+		if (html->priv->cursor_moved)
+			return TRUE;
+
+		html = html->iframe_parent ? GTK_HTML (html->iframe_parent) : NULL;
+	}
+
+	return FALSE;
+}
+
+static gboolean
+any_has_skip_update_cursor (GtkHTML *html)
+{
+	while (html) {
+		if (html->priv->skip_update_cursor)
+			return TRUE;
+
+		html = html->iframe_parent ? GTK_HTML (html->iframe_parent) : NULL;
+	}
+
+	return FALSE;
+}
+
 static gint
 button_release_event (GtkWidget *initial_widget,
 		      GdkEventButton *event)
@@ -3421,6 +3455,7 @@
 	html->priv->idle_handler_id = 0;
 	html->priv->scroll_timeout_id = 0;
 	html->priv->skip_update_cursor = FALSE;
+	html->priv->cursor_moved = FALSE;
 	html->priv->paragraph_style = GTK_HTML_PARAGRAPH_STYLE_NORMAL;
 	html->priv->paragraph_alignment = GTK_HTML_PARAGRAPH_ALIGNMENT_LEFT;
 	html->priv->paragraph_indentation = 0;
@@ -4832,6 +4867,8 @@
 	if (!html->engine->caret_mode && !html_engine_get_editable (html->engine))
 		return;
 
+	html->priv->cursor_moved = TRUE;
+
 	if (skip == GTK_HTML_CURSOR_SKIP_NONE) {
 		update_primary_selection (html);
 		g_signal_emit (GTK_HTML (html), signals [CURSOR_CHANGED], 0);
@@ -4943,6 +4980,7 @@
 	if (!html_engine_get_editable (html->engine) && !html->engine->caret_mode)
 		return FALSE;
 
+	html->priv->cursor_moved = TRUE;
 	html->engine->shift_selection = TRUE;
 	if (!html->engine->mark)
 		html_engine_set_mark (html->engine);



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