Re: [evolution-patches] Patch to enable cursor and keyboard navigation in mail reader,(v5), gconf version



Attached wrong gtkhtml.diff, reattch and resend.


Hi,

In this patch, a gconf key is added
(/apps/evolution/mail/display/caret_mode). And a checkbox is added in
the preference setting corresponding to the option. The code is in
evolution.diff.

The attached pref.png is the screenshot, need Anna review?

At gtkhtml side, a new style property is also added. In the 'style-set'
signal handler we change the gboolean var added into the htmlengine
struct, and we use it to control whether to draw cusor. Other part is
the same to previous patch.

I decide to remove the F7, because all other gconf key settings are
handled by prefrence setting dialog. so I think we keep the processsing
of gconf settings consistent, and not just mimic mozilla. So Radek and
Ettore, you opinion?

I have tested the patch.


Regards
York

On Sun, 2003-06-22 at 18:23, Radek Doul?? wrote:
> On Sat, 2003-06-21 at 17:21, Ettore Perazzoli wrote:
> > On Fri, 2003-06-20 at 22:45, yuedong du wrote:
> > > We agree to use F7 to enable caret mode.
> > > 
> > > But, what is the best form the option should be implemented as ? Global
> > > variable or gconf ? Global variable means the setting will not be saved
> > > after you exit evolution. A little inconvinience. 
> > 
> > I thought F7 was just supposed to work per-session?
> 
> mozilla remembers it for the next session, so it could make sense to
> save it to gconf? I can imagine that user who want this feature would
> like to have it enabled all the time.
> 
> I think this setting should be handled in evolution and set by gtkhtml
> style property as fonts and other things?
> 
> cheers
> Radek
> 
> 

Attachment: pref.png
Description: PNG image

Index: mail/evolution-mail.schemas
===================================================================
RCS file: /cvs/gnome/evolution/mail/evolution-mail.schemas,v
retrieving revision 1.15
diff -u -r1.15 evolution-mail.schemas
--- mail/evolution-mail.schemas	20 May 2003 18:33:32 -0000	1.15
+++ mail/evolution-mail.schemas	25 Jun 2003 05:57:46 -0000
@@ -174,6 +174,20 @@
     </schema>
 
     <schema>
+      <key>/schemas/apps/evolution/mail/display/caret_mode</key>
+      <applyto>/apps/evolution/mail/display/caret_mode</applyto>
+      <owner>evolution-mail</owner>
+      <type>boolean</type>
+      <default>false</default>
+      <locale name="C">
+         <short>Enable/disable caret mode</short>
+         <long>
+	  Enable caret mode, so that you can see a cursor when reading mail.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/evolution/mail/display/load_http_images</key>
       <applyto>/apps/evolution/mail/display/load_http_images</applyto>
       <owner>evolution-mail</owner>
Index: mail/mail-config.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-config.c,v
retrieving revision 1.280
diff -u -r1.280 mail-config.c
--- mail/mail-config.c	11 Jun 2003 16:19:34 -0000	1.280
+++ mail/mail-config.c	25 Jun 2003 05:57:56 -0000
@@ -85,6 +85,7 @@
 	
 	guint font_notify_id;
 	guint spell_notify_id;
+	guint caret_mode_notify_id;
 
 	GPtrArray *mime_types;
 	guint mime_types_notify_id;
@@ -435,6 +436,7 @@
 	char *fix_font;
 	char *var_font;
 	gint red, green, blue;
+	gboolean caret_mode;
 	
 	/*
 	 * This is the wrong way to get the path but it needs to 
@@ -461,8 +463,10 @@
 	red   = gconf_client_get_int (config->gconf, "/GNOME/Spell/spell_error_color_red", NULL);
 	green = gconf_client_get_int (config->gconf, "/GNOME/Spell/spell_error_color_green", NULL);
 	blue  = gconf_client_get_int (config->gconf, "/GNOME/Spell/spell_error_color_blue", NULL);
+	caret_mode = gconf_client_get_bool (config->gconf, "/apps/evolution/mail/display/caret_mode", NULL);
 
 	fprintf (rc, "style \"evolution-mail-custom-fonts\" {\n");
+	fprintf (rc, "        GtkHTML::caret_mode = %d\n", caret_mode ? 1 :0);
 	fprintf (rc, "        GtkHTML::spell_error_color = \"#%02x%02x%02x\"\n",
 		 red >> 8, green >> 8, blue >> 8);
 
@@ -536,6 +540,8 @@
 							  gconf_style_changed, NULL, NULL, NULL);
 	config->spell_notify_id = gconf_client_notify_add (config->gconf, "/GNOME/Spell",
 							   gconf_style_changed, NULL, NULL, NULL);
+	config->caret_mode_notify_id = gconf_client_notify_add (config->gconf, "/apps/evolution/mail/display/caret_mode",
+							        gconf_style_changed, NULL, NULL, NULL);
 
 	gconf_client_add_dir (config->gconf, "/apps/evolution/mail/labels",
 			      GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
Index: mail/mail-config.glade
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-config.glade,v
retrieving revision 1.120
diff -u -r1.120 mail-config.glade
--- mail/mail-config.glade	21 May 2003 15:26:24 -0000	1.120
+++ mail/mail-config.glade	25 Jun 2003 05:58:22 -0000
@@ -3499,6 +3499,24 @@
 		      <property name="fill">True</property>
 		    </packing>
 		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="caret_mode">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">_Enable caret mode (show cursor when reading mail)</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
 		</widget>
 	      </child>
 
Index: mail/mail-preferences.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-preferences.c,v
retrieving revision 1.32
diff -u -r1.32 mail-preferences.c
--- mail/mail-preferences.c	11 Jun 2003 16:19:36 -0000	1.32
+++ mail/mail-preferences.c	25 Jun 2003 05:58:23 -0000
@@ -255,6 +255,11 @@
 	colorpicker_set_color (prefs->citation_color, buf ? buf : "#737373");
 	g_signal_connect (prefs->citation_color, "color-set", G_CALLBACK (color_set), prefs);
 	g_free (buf);
+
+	prefs->caret_mode = GTK_TOGGLE_BUTTON(glade_xml_get_widget(gui, "caret_mode"));
+	bool = gconf_client_get_bool (prefs->gconf, "/apps/evolution/mail/display/caret_mode", NULL);
+	gtk_toggle_button_set_active (prefs->caret_mode, bool);
+	g_signal_connect (prefs->caret_mode, "toggled", G_CALLBACK (settings_changed), prefs);
 	
 	/* Deleting Mail */
 	prefs->empty_trash = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkEmptyTrashOnExit"));
@@ -408,6 +413,8 @@
 	sprintf (buf,"#%06x", rgb & 0xffffff);
 	gconf_client_set_string (prefs->gconf, "/apps/evolution/mail/display/citation_colour", buf, NULL);
 	
+	gconf_client_set_bool (prefs->gconf, "/apps/evolution/mail/display/caret_mode",
+			       gtk_toggle_button_get_active (prefs->caret_mode), NULL);
 	/* Deleting Mail */
 	gconf_client_set_bool (prefs->gconf, "/apps/evolution/mail/trash/empty_on_exit",
 			       gtk_toggle_button_get_active (prefs->empty_trash), NULL);
Index: mail/mail-preferences.h
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-preferences.h,v
retrieving revision 1.11
diff -u -r1.11 mail-preferences.h
--- mail/mail-preferences.h	20 May 2003 18:33:33 -0000	1.11
+++ mail/mail-preferences.h	25 Jun 2003 05:58:23 -0000
@@ -67,6 +67,7 @@
 	GtkOptionMenu *charset;
 	GtkToggleButton *citation_highlight;
 	GnomeColorPicker *citation_color;
+	GtkToggleButton *caret_mode;
 	
 	/* Deleting Mail */
 	GtkToggleButton *empty_trash;
Index: src/gtkhtml.c
===================================================================
RCS file: /cvs/gnome/gtkhtml/src/gtkhtml.c,v
retrieving revision 1.516
diff -u -r1.516 gtkhtml.c
--- src/gtkhtml.c	13 Jun 2003 21:42:59 -0000	1.516
+++ src/gtkhtml.c	25 Jun 2003 08:03:51 -0000
@@ -720,6 +720,19 @@
 		(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
 }
 
+static void
+set_caret_mode(HTMLEngine *engine, gboolean caret_mode)
+{
+	g_return_if_fail (!engine->editable);
+
+	if (caret_mode)
+		engine->caret_mode = TRUE;
+	else
+		engine->caret_mode = FALSE;
+
+	return;
+}
+
 /* GtkWidget methods.  */
 static void
 style_set (GtkWidget *widget, GtkStyle  *previous_style)
@@ -730,6 +743,7 @@
 	gint  fixed_size = 0;
 	char *font_var = NULL;
 	gint  font_var_size = 0;
+	gboolean caret_mode = FALSE;
 
 	/* we don't need to set font's in idle time so call idle callback directly to avoid
 	   recalculating whole document
@@ -766,11 +780,14 @@
 			html_engine_calc_size (engine, FALSE);
 			html_engine_schedule_update (engine);
 		}
+
 		
 		g_free (fixed_name);
 		g_free (font_var);
 	}
 
+	gtk_widget_style_get (widget, "caret_mode", &caret_mode, NULL);
+	set_caret_mode(engine, caret_mode);
 
 	html_colorset_set_style (engine->defaultSettings->color_set, widget);
 	html_colorset_set_unchanged (engine->settings->color_set,
@@ -1477,8 +1494,10 @@
 				if (obj && ((HTML_IS_IMAGE (obj) && HTML_IMAGE (obj)->url && *HTML_IMAGE (obj)->url)
 					    || HTML_IS_LINK_TEXT (obj)))
 					html_engine_set_focus_object (orig_e, obj);
-				else
+				else {
 					html_engine_set_focus_object (orig_e, NULL);
+					html_engine_jump_at (engine, x, y);
+				}
 			}
 			if (html->allow_selection) {
 				if (event->state & GDK_SHIFT_MASK)
@@ -2598,6 +2617,12 @@
 								     GDK_TYPE_COLOR,
 								     G_PARAM_READABLE));
 
+	gtk_widget_class_install_style_property (widget_class,
+						 g_param_spec_boxed ("caret_mode",
+								     _("Caret Mode"),
+								     _("Enable cursor when reading mail"),
+								     G_TYPE_BOOLEAN,
+								     G_PARAM_READABLE));
 	widget_class->realize = realize;
 	widget_class->unrealize = unrealize;
 	widget_class->style_set = style_set;
@@ -3787,8 +3812,6 @@
 {
 	gint amount;
 
-	if (!html_engine_get_editable (html->engine))
-		return;
 
 	if (html->engine->selection_mode) {
 		if (!html->engine->mark)
Index: src/htmlengine-edit-cursor.c
===================================================================
RCS file: /cvs/gnome/gtkhtml/src/htmlengine-edit-cursor.c,v
retrieving revision 1.22
diff -u -r1.22 htmlengine-edit-cursor.c
--- src/htmlengine-edit-cursor.c	2 Apr 2003 05:41:47 -0000	1.22
+++ src/htmlengine-edit-cursor.c	25 Jun 2003 08:03:52 -0000
@@ -29,6 +29,7 @@
 #include "htmlengine-edit-table.h"
 #include "htmlengine-edit-tablecell.h"
 #include "htmlimage.h"
+#include "htmliframe.h"
 #include "htmlobject.h"
 #include "htmltable.h"
 
@@ -47,14 +48,42 @@
 static GdkColor image_stipple_active_on      = { 0, 0xffff, 0,      0 };
 static GdkColor image_stipple_active_off     = { 0, 0xffff, 0xffff, 0xffff };
 
+static HTMLEngine *
+get_direct_engine(HTMLObject * obj)
+{
+        HTMLObject * parent;
+	int i = 0;
+                                                                                
+        parent = obj;
+        while (parent) {
+                if ((HTML_OBJECT_TYPE (parent) == HTML_TYPE_FRAME)
+                    || (HTML_OBJECT_TYPE (parent) == HTML_TYPE_IFRAME)) {
+                       return html_object_get_engine (parent, NULL);
+                }
+                parent = parent->parent;
+        }
+                                                                                
+        return NULL;
+}
+
 void
 html_engine_hide_cursor  (HTMLEngine *engine)
 {
+	HTMLEngine *e = engine;
+
 	g_return_if_fail (engine != NULL);
 	g_return_if_fail (HTML_IS_ENGINE (engine));
 
-	if (engine->editable && engine->cursor_hide_count == 0)
-		html_engine_draw_cursor_in_area (engine, 0, 0, -1, -1);
+	if ((engine->editable || engine->caret_mode) && engine->cursor_hide_count == 0) {
+		if (!engine->editable) {
+        		e = get_direct_engine(engine->cursor->object);
+			if (e) {
+				e->caret_mode = engine->caret_mode;
+				html_cursor_copy(e->cursor, engine->cursor);
+			} else 	e = engine;
+		}
+		html_engine_draw_cursor_in_area (e, 0, 0, -1, -1);
+	}
 
 	engine->cursor_hide_count++;
 }
@@ -62,22 +91,37 @@
 void
 html_engine_show_cursor  (HTMLEngine *engine)
 {
+        HTMLEngine * e = engine;
+
 	g_return_if_fail (engine != NULL);
 	g_return_if_fail (HTML_IS_ENGINE (engine));
+	g_return_if_fail (engine->cursor != NULL);
 
 	if (engine->cursor_hide_count > 0) {
 		engine->cursor_hide_count--;
-		if (engine->editable && engine->cursor_hide_count == 0)
-			html_engine_draw_cursor_in_area (engine, 0, 0, -1, -1);
+		if ((engine->editable || engine->caret_mode) && engine->cursor_hide_count == 0) {
+			if (!engine->editable) {
+        			e = get_direct_engine(engine->cursor->object);
+				if (e) {
+					e->caret_mode = engine->caret_mode;
+					html_cursor_copy(e->cursor, engine->cursor);
+				} else e = engine;
+			}
+			html_engine_draw_cursor_in_area (e, 0, 0, -1, -1);
+		}
 	}
 }
 
 static gboolean
 clip_rect (HTMLEngine *engine, gint x, gint y, gint width, gint height, gint *x1, gint *y1, gint *x2, gint *y2)
 {
-	if (*x1 >= x + width || *y1 >= y + height || *x2 < x || *y2 < y)
+	if (*x1 > x + width || *y1 > y + height || *x2 < x || *y2 < y)
 		return FALSE;
 
+	if (*x1 == x + width)
+		*x1 = x + width - 1;
+	if (*y1 == y + width)
+		*y1 = y + height - 1;
 	if (*x2 >= x + width)
 		*x2 = x + width - 1;
 	if (*y2 >= y + height)
@@ -265,15 +309,13 @@
 	gint x1, y1, x2, y2;
 	GdkRectangle pos;
 
-	g_assert (engine->editable);
-
-	if (engine->editable && (engine->cursor_hide_count <= 0 && !engine->thaw_idle_id)) {
+	if ((engine->editable || engine->caret_mode) && (engine->cursor_hide_count <= 0 && !engine->thaw_idle_id)) {
 		html_engine_draw_table_cursor (engine);
 		html_engine_draw_cell_cursor (engine);
 		html_engine_draw_image_cursor (engine);
 	}
 
-	if (!cursor_enabled || engine->cursor_hide_count > 0 || ! engine->editable || engine->thaw_idle_id)
+	if (!cursor_enabled || engine->cursor_hide_count > 0 || !(engine->editable || engine->caret_mode) || engine->thaw_idle_id)
 		return;
 
 	obj = engine->cursor->object;
@@ -289,14 +331,23 @@
 		y = 0;
 	}
 
-	
 	html_object_get_cursor (obj, engine->painter, offset, &x1, &y1, &x2, &y2);
-	
 	pos.x = x1; 
 	pos.y = y1;
 	pos.width = x2 - x1;
 	pos.height = x2 - x1;
 	gtk_im_context_set_cursor_location (GTK_HTML (engine->widget)->priv->im_context, &pos);
+
+	obj = g_object_get_data(G_OBJECT(gtk_widget_get_parent(GTK_WIDGET(engine->widget))), "embeddedelement");	
+	if (obj) {
+		HTMLEmbedded * element;
+
+		element = HTML_EMBEDDED(obj);
+		x1 -= element->abs_x;
+		x2 -= element->abs_x;
+		y1 -= element->abs_y;
+		y2 -= element->abs_y;
+	}
 
 	if (clip_rect (engine, x, y, width, height, &x1, &y1, &x2, &y2)) {
 		gdk_draw_line (engine->window, engine->invert_gc, x1, y1, x2, y2);
Index: src/htmlengine-edit-movement.c
===================================================================
RCS file: /cvs/gnome/gtkhtml/src/htmlengine-edit-movement.c,v
retrieving revision 1.15
diff -u -r1.15 htmlengine-edit-movement.c
--- src/htmlengine-edit-movement.c	25 Apr 2001 21:31:53 -0000	1.15
+++ src/htmlengine-edit-movement.c	25 Jun 2003 08:03:52 -0000
@@ -275,8 +275,10 @@
 		if (new_y == y)
 			break;
 
-		if (new_y < start_y)
+		if (new_y < start_y) {
+			html_engine_show_cursor (engine);
 			return 0;
+		}
 
 		if (new_y - start_y >= amount) {
 			html_cursor_copy (cursor, &prev_cursor);
Index: src/htmlengine.c
===================================================================
RCS file: /cvs/gnome/gtkhtml/src/htmlengine.c,v
retrieving revision 1.544
diff -u -r1.544 htmlengine.c
--- src/htmlengine.c	13 Jun 2003 21:42:59 -0000	1.544
+++ src/htmlengine.c	25 Jun 2003 08:04:01 -0000
@@ -3569,6 +3569,7 @@
 	engine->allow_frameset = FALSE;
 
 	engine->editable = FALSE;
+	engine->caret_mode = FALSE;
 	engine->clipboard = NULL;
 	engine->clipboard_stack = NULL;
 	engine->selection_stack  = NULL;
@@ -4589,12 +4590,14 @@
 		html_engine_ensure_editable (e);
 		html_cursor_home (e->cursor, e);
 		e->newPage = FALSE;
-
 		if (e->have_focus)
 			html_engine_setup_blinking_cursor (e);
 	} else {
-		if (e->have_focus)
-			html_engine_stop_blinking_cursor (e);
+		if (e->have_focus )
+			if (e->caret_mode)
+				html_engine_setup_blinking_cursor (e);
+			else 
+				html_engine_stop_blinking_cursor (e);
 	}
 }
 
@@ -4626,7 +4629,7 @@
 	g_return_if_fail (engine != NULL);
 	g_return_if_fail (HTML_IS_ENGINE (engine));
 
-	if (engine->editable) {
+	if (engine->editable || engine->caret_mode) {
 		if (! engine->have_focus && have_focus)
 			html_engine_setup_blinking_cursor (engine);
 		else if (engine->have_focus && ! have_focus)
@@ -4665,9 +4668,6 @@
 	gint x1, y1, x2, y2, xo, yo;
 
 	g_return_val_if_fail (e != NULL, FALSE);
-
-	if (! e->editable)
-		return FALSE;
 
 	if (e->cursor->object == NULL)
 		return FALSE;
Index: src/htmlengine.h
===================================================================
RCS file: /cvs/gnome/gtkhtml/src/htmlengine.h,v
retrieving revision 1.168
diff -u -r1.168 htmlengine.h
--- src/htmlengine.h	19 May 2003 12:58:36 -0000	1.168
+++ src/htmlengine.h	25 Jun 2003 08:04:02 -0000
@@ -65,6 +65,7 @@
 	GdkGC *invert_gc;
 
 	gboolean editable;
+	gboolean caret_mode;
 
 	HTMLObject *clipboard;
 	guint       clipboard_len;
Index: src/htmliframe.c
===================================================================
RCS file: /cvs/gnome/gtkhtml/src/htmliframe.c,v
retrieving revision 1.74
diff -u -r1.74 htmliframe.c
--- src/htmliframe.c	19 May 2003 13:12:04 -0000	1.74
+++ src/htmliframe.c	25 Jun 2003 08:04:04 -0000
@@ -592,6 +592,7 @@
 
 	new_widget = gtk_html_new ();
 	new_html = GTK_HTML (new_widget);
+	new_html->engine->cursor_hide_count = 0;
 
 	new_tokenizer = html_tokenizer_clone (parent_html->engine->ht);
 


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