gtkhtml r8871 - trunk/gtkhtml



Author: mcrha
Date: Wed Jun 18 16:19:45 2008
New Revision: 8871
URL: http://svn.gnome.org/viewvc/gtkhtml?rev=8871&view=rev

Log:
2008-06-18  Milan Crha  <mcrha redhat com>

	** Fix for bug #423395

	* gtkhtml-private.h: (struct _GtkHTMLPrivate): New property.
	* gtkhtml.h: (gtk_html_set_caret_first_focus_anchor):
	* gtkhtml.c: (gtk_html_set_caret_first_focus_anchor), (destroy),
	(focus), (gtk_html_init): New API to let GtkHTML know where
	to place cursor on the first focus event, based on the anchor name.



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

Modified: trunk/gtkhtml/gtkhtml-private.h
==============================================================================
--- trunk/gtkhtml/gtkhtml-private.h	(original)
+++ trunk/gtkhtml/gtkhtml-private.h	Wed Jun 18 16:19:45 2008
@@ -76,6 +76,8 @@
 	gboolean in_url_test_mode;
 
 	gboolean in_key_binding;
+
+	char *caret_first_focus_anchor;
 };
 
 void  gtk_html_private_calc_scrollbars  (GtkHTML                *html,

Modified: trunk/gtkhtml/gtkhtml.c
==============================================================================
--- trunk/gtkhtml/gtkhtml.c	(original)
+++ trunk/gtkhtml/gtkhtml.c	Wed Jun 18 16:19:45 2008
@@ -768,6 +768,7 @@
 
 		g_free (html->priv->content_type);
 		g_free (html->priv->base_url);
+		g_free (html->priv->caret_first_focus_anchor);
 		g_free (html->priv);
 		html->priv = NULL;
 	}
@@ -2264,6 +2265,7 @@
 focus (GtkWidget *w, GtkDirectionType direction)
 {
 	HTMLEngine *e = GTK_HTML (w)->engine;
+	GtkHTMLPrivate *priv = GTK_HTML (w)->priv;
 
 	if (html_engine_get_editable (e)) {
 		gboolean rv;
@@ -2280,6 +2282,28 @@
 		e->shift_selection = FALSE;
 	}
 
+	if (!GTK_WIDGET_HAS_FOCUS (w) && e->caret_mode && priv->caret_first_focus_anchor) {
+		int x = 0, y = 0;
+
+		if (html_object_find_anchor (e->clue, priv->caret_first_focus_anchor, &x, &y)) {
+			GtkAdjustment *vadj;
+
+			gtk_widget_grab_focus (w);
+			html_engine_jump_at (e, x, y);
+
+			vadj = GTK_LAYOUT (e->widget)->vadjustment;
+
+			/* scroll to the position on screen if not visible */
+			if (y < vadj->value || y > vadj->value + vadj->page_size)
+				gtk_adjustment_set_value (vadj, y);
+
+			update_primary_selection (GTK_HTML (w));
+			g_signal_emit (GTK_HTML (w), signals [CURSOR_CHANGED], 0);
+
+			return TRUE;
+		}
+	}
+
 	if (((e->focus_object && !(GTK_WIDGET_HAS_FOCUS (w))) || html_engine_focus (e, direction)) && e->focus_object) {
 		gint offset;
 		HTMLObject *obj = html_engine_get_focus_object (e, &offset);
@@ -3270,6 +3294,8 @@
 	html->priv->in_url_test_mode = FALSE;
 	html->priv->in_key_binding = FALSE;
 
+	html->priv->caret_first_focus_anchor = NULL;
+
 	/* IM Context */
 	html->priv->im_context = gtk_im_multicontext_new ();
 	html->priv->need_im_reset = FALSE;
@@ -3913,6 +3939,26 @@
 	return html->engine->caret_mode;
 }
 
+/**
+ * gtk_html_set_caret_first_focus_anchor:
+ * When setting focus to the GtkHTML first time and is in caret mode,
+ * then looks for an anchor of name @param name and tries to set focus
+ * just after it. If NULL, then behaves as before.
+ *
+ * @param html GtkHTML instance.
+ * @param name Name of the anchor to be set the first focus just after it,
+ *             or NULL to not look for the anchor.
+ **/
+void
+gtk_html_set_caret_first_focus_anchor (GtkHTML *html, const char *name)
+{
+	g_return_if_fail (GTK_IS_HTML (html));
+	g_return_if_fail (html->priv != NULL);
+
+	g_free (html->priv->caret_first_focus_anchor);
+	html->priv->caret_first_focus_anchor = g_strdup (name);
+}
+
 void
 gtk_html_set_animate (GtkHTML *html, gboolean animate)
 {

Modified: trunk/gtkhtml/gtkhtml.h
==============================================================================
--- trunk/gtkhtml/gtkhtml.h	(original)
+++ trunk/gtkhtml/gtkhtml.h	Wed Jun 18 16:19:45 2008
@@ -208,6 +208,9 @@
 								   gboolean                   caret_mode);
 gboolean                   gtk_html_get_caret_mode                (const GtkHTML             *html);
 
+void			   gtk_html_set_caret_first_focus_anchor  (GtkHTML		     *html,
+								   const char                *name);
+
 /* Animated Images */
 void                       gtk_html_set_animate                   (GtkHTML                   *html,
 								   gboolean                   animate);



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