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



I see, 

Change to,
+       if (! e->editable && !e->caret_mode)
                return FALSE;

And in set_caret_mode()(called by style_set), call
gtk_html_edit_make_cursor_visible() adjust the view.

+       if (caret_mode)
+               gtk_html_edit_make_cursor_visible(engine->widget);
+

Patch re-attached,

Regards
York


On Thu, 2003-07-03 at 20:32, Radek Doulík wrote:
> On Thu, 2003-07-03 at 14:17, yuedong du wrote:
> > > > @@ -4679,9 +4682,6 @@
> > > >         gint x1, y1, x2, y2, xo, yo;
> > > >  
> > > >         g_return_val_if_fail (e != NULL, FALSE);
> > > > -
> > > > -       if (! e->editable)
> > > > -               return FALSE;
> > > 
> > > shouldn't this be rather
> > > 
> > > if (!e->editable && !e->caret_mode)
> > > 	return FALSE;
> > > 
> > > ?
> > 
> > The modification here made html_engine_make_cursor_visible() always made
> > cursor inside of view, either in editor/reader and caret mode/NOT caret
> > mode. Suppose you start evolution with caret mode disabled, and now you
> > scroll to somewhere in a mail, then F7 to enable caret mode. The cursor
> > maybe outside of user's view. 
> 
> the html_engine_make_cursor_visible modifies the view offset and not the
> cursor position. so when carret mode is disabled you don't want to make
> it scroll view to the place where the invisible(disabled) cursor is.
> 
> you may want to call this method after caret mode is enabled to make
> cursor visible
> 
> Radek
> 
> 
> _______________________________________________
> Evolution-patches mailing list
> Evolution-patches lists ximian com
> http://lists.ximian.com/mailman/listinfo/evolution-patches
Index: mail/evolution-mail.schemas
===================================================================
RCS file: /cvs/gnome/evolution/mail/evolution-mail.schemas,v
retrieving revision 1.17
diff -u -r1.17 evolution-mail.schemas
--- mail/evolution-mail.schemas	25 Jun 2003 16:20:38 -0000	1.17
+++ mail/evolution-mail.schemas	3 Jul 2003 10:42:25 -0000
@@ -174,6 +174,34 @@
     </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/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/folder-browser-ui.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/folder-browser-ui.c,v
retrieving revision 1.80
diff -u -r1.80 folder-browser-ui.c
--- mail/folder-browser-ui.c	11 Jun 2003 16:19:34 -0000	1.80
+++ mail/folder-browser-ui.c	3 Jul 2003 10:42:29 -0000
@@ -104,6 +104,7 @@
 	BONOBO_UI_UNSAFE_VERB ("ToolsVFolderSubject", vfolder_subject),
 	BONOBO_UI_UNSAFE_VERB ("ViewLoadImages", load_images),
 	/* ViewHeaders stuff is a radio */
+	/* CaretMode is a toggle */
 
 	BONOBO_UI_VERB_END
 };
@@ -238,6 +239,7 @@
 	{ "ViewFullHeaders", IS_0MESSAGE },
 	{ "ViewNormal",      IS_0MESSAGE },
 	{ "ViewSource",      IS_0MESSAGE },
+	{ "CaretMode",       IS_0MESSAGE },
 	
 	{ "AddSenderToAddressbook",   IS_INCOMING_FOLDER | SELECTION_SINGLE | ANY_THREADED | HAS_FLAGS },
 	
@@ -517,6 +519,7 @@
 	FolderBrowserSelectionState prev_state;
 	GConfClient *gconf;
 	int style;
+	gboolean caret_mode;
 	
 	gconf = mail_config_get_gconf_client ();
 	
@@ -527,6 +530,10 @@
 	
 	ui_add (fb, "message", message_verbs, message_pixcache);
 	
+	caret_mode = gconf_client_get_bool (gconf, "/apps/evolution/mail/display/caret_mode", NULL);
+	bonobo_ui_component_set_prop(uic, "/commands/CaretMode", "state", caret_mode?"1":"0", NULL);
+	bonobo_ui_component_add_listener (uic, "CaretMode", folder_browser_toggle_caret_mode, fb);
+
 	/* Display Style */
 	style = gconf_client_get_int (gconf, "/apps/evolution/mail/display/message_style", NULL);
 	style = style >= 0 && style < MAIL_CONFIG_DISPLAY_MAX ? style : 0;
Index: mail/folder-browser.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/folder-browser.c,v
retrieving revision 1.347
diff -u -r1.347 folder-browser.c
--- mail/folder-browser.c	23 Jun 2003 16:56:26 -0000	1.347
+++ mail/folder-browser.c	3 Jul 2003 10:42:37 -0000
@@ -1361,6 +1361,24 @@
 }
 
 void
+folder_browser_toggle_caret_mode(BonoboUIComponent	*component,
+				   const char		* path,
+				   Bonobo_UIComponent_EventType type,
+				   const char		* state,
+				   gpointer		user_data)
+{
+	FolderBrowser *fb = user_data;
+	GConfClient *gconf;
+	
+        if (type != Bonobo_UIComponent_STATE_CHANGED)
+		return;
+
+	gconf = mail_config_get_gconf_client ();
+	gconf_client_set_bool (gconf, "/apps/evolution/mail/display/caret_mode",
+			       atoi(state), NULL);
+}
+
+void
 folder_browser_set_message_display_style (BonoboUIComponent           *component,
 					  const char                  *path,
 					  Bonobo_UIComponent_EventType type,
Index: mail/folder-browser.h
===================================================================
RCS file: /cvs/gnome/evolution/mail/folder-browser.h,v
retrieving revision 1.69
diff -u -r1.69 folder-browser.h
--- mail/folder-browser.h	24 Mar 2003 13:27:32 -0000	1.69
+++ mail/folder-browser.h	3 Jul 2003 10:42:40 -0000
@@ -169,6 +169,12 @@
 					 const char                  *state,
 					 gpointer                     user_data);
 
+void folder_browser_toggle_caret_mode (BonoboUIComponent           *component,
+				       const char                  *path,
+				       Bonobo_UIComponent_EventType type,
+				       const char                  *state,
+				       gpointer                     user_data);
+
 void folder_browser_set_message_display_style (BonoboUIComponent           *component,
 					       const char                  *path,
 					       Bonobo_UIComponent_EventType type,
Index: mail/mail-config.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-config.c,v
retrieving revision 1.284
diff -u -r1.284 mail-config.c
--- mail/mail-config.c	25 Jun 2003 16:54:17 -0000	1.284
+++ mail/mail-config.c	3 Jul 2003 10:42:42 -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;
@@ -441,6 +442,7 @@
 	char *fix_font;
 	char *var_font;
 	gint red = 0xffff, green = 0, blue = 0;
+	gboolean caret_mode;
 	
 	/*
 	 * This is the wrong way to get the path but it needs to 
@@ -463,12 +465,14 @@
 	custom = gconf_client_get_bool (config->gconf, "/apps/evolution/mail/display/fonts/use_custom", NULL);
 	var_font = gconf_client_get_string (config->gconf, "/apps/evolution/mail/display/fonts/variable", NULL);
 	fix_font = gconf_client_get_string (config->gconf, "/apps/evolution/mail/display/fonts/monospace", NULL);
+	caret_mode = gconf_client_get_bool (config->gconf, "/apps/evolution/mail/display/caret_mode", NULL);
 
  	CONFIG_GET_SPELL_VALUE (int, "/spell_error_color_red",   red, (void)0, (int));
  	CONFIG_GET_SPELL_VALUE (int, "/spell_error_color_green", green, (void)0, (int));
  	CONFIG_GET_SPELL_VALUE (int, "/spell_error_color_blue",  blue, (void)0, (int));
 
 	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",
 		 0xff & (red >> 8), 0xff & (green >> 8), 0xff & (blue >> 8));
 
@@ -542,6 +546,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: ui/evolution-mail-message.xml
===================================================================
RCS file: /cvs/gnome/evolution/ui/evolution-mail-message.xml,v
retrieving revision 1.46
diff -u -r1.46 evolution-mail-message.xml
--- ui/evolution-mail-message.xml	28 Feb 2003 17:26:24 -0000	1.46
+++ ui/evolution-mail-message.xml	3 Jul 2003 10:42:49 -0000
@@ -5,6 +5,10 @@
     <cmd name="AddSenderToAddressbook"
      _tip="Add Sender to Addressbook"/>
 
+    <cmd name="CaretMode"
+    _tip="Show a blinking cursor in the body of displayed messages"
+    type = "toggle" state = "0" accel="F7"/>
+
     <cmd name="MailNext"
      _tip="Display the next message"/>
 
@@ -264,6 +268,7 @@
 	</submenu>
         <submenu name="MessageDisplay" _label="_Message Display">
           <menuitem name="ViewLoadImages" verb="" _label="Load _Images"/>
+          <menuitem name="CaretMode" verb="" _label="Caret _Mode"/>
 
 	  <separator f="" name="emaillist"/>
 
? autom4te.cache
? components/html-editor/test_editor
Index: src/gtkhtml.c
===================================================================
RCS file: /cvs/gnome/gtkhtml/src/gtkhtml.c,v
retrieving revision 1.521
diff -u -r1.521 gtkhtml.c
--- src/gtkhtml.c	27 Jun 2003 15:51:06 -0000	1.521
+++ src/gtkhtml.c	3 Jul 2003 13:20:38 -0000
@@ -760,11 +760,35 @@
 	g_free (fixed_name);
 }
 
+static void
+set_caret_mode(HTMLEngine *engine, gboolean caret_mode)
+{
+	if (engine->editable)
+		return;
+
+	engine->caret_mode = caret_mode;
+
+	if (caret_mode)
+		gtk_html_edit_make_cursor_visible(engine->widget);
+
+	/* Normally, blink cursor handler is setup in focus in event.
+	 * However, in the case focus already in this engine, and user
+	 * type F7 to enable cursor, we must setup the handler by
+	 * ourselves.
+	 */
+	if (caret_mode && !engine->blinking_timer_id && engine->have_focus)
+		html_engine_setup_blinking_cursor (engine);
+
+
+	return;
+}
+
 /* GtkWidget methods.  */
 static void
 style_set (GtkWidget *widget, GtkStyle  *previous_style)
 {
 	HTMLEngine *engine = GTK_HTML (widget)->engine;
+	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
@@ -779,6 +803,8 @@
 		}
 	}
 
+	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,
@@ -1485,8 +1511,11 @@
 				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);
+					if (orig_e->caret_mode)
+						html_engine_jump_at (engine, x, y);
+				}
 			}
 			if (html->allow_selection) {
 				if (event->state & GDK_SHIFT_MASK)
@@ -2605,6 +2634,13 @@
 								     _("The color of the spelling error markers"),
 								     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;
@@ -3794,9 +3830,6 @@
 cursor_move (GtkHTML *html, GtkDirectionType dir_type, GtkHTMLCursorSkipType skip)
 {
 	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	3 Jul 2003 13:20:39 -0000
@@ -50,11 +50,21 @@
 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 = html_object_engine(engine->cursor->object, NULL);
+			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 +72,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 = html_object_engine(engine->cursor->object, NULL);
+				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 +290,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;
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	3 Jul 2003 13:20:39 -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.545
diff -u -r1.545 htmlengine.c
--- src/htmlengine.c	25 Jun 2003 18:15:46 -0000	1.545
+++ src/htmlengine.c	3 Jul 2003 13:20:43 -0000
@@ -3583,6 +3583,7 @@
 	engine->allow_frameset = FALSE;
 
 	engine->editable = FALSE;
+	engine->caret_mode = FALSE;
 	engine->clipboard = NULL;
 	engine->clipboard_stack = NULL;
 	engine->selection_stack  = NULL;
@@ -4603,12 +4604,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);
 	}
 }
 
@@ -4640,7 +4643,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)
@@ -4680,7 +4683,7 @@
 
 	g_return_val_if_fail (e != NULL, FALSE);
 
-	if (! e->editable)
+	if (! e->editable && !e->caret_mode)
 		return FALSE;
 
 	if (e->cursor->object == NULL)
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	3 Jul 2003 13:20:43 -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	3 Jul 2003 13:20:44 -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);
 
Index: src/htmlobject.c
===================================================================
RCS file: /cvs/gnome/gtkhtml/src/htmlobject.c,v
retrieving revision 1.160
diff -u -r1.160 htmlobject.c
--- src/htmlobject.c	1 May 2003 16:41:23 -0000	1.160
+++ src/htmlobject.c	3 Jul 2003 13:20:45 -0000
@@ -1080,6 +1080,17 @@
 		*y1 -= (missing >> 1) + ((missing >> 1) & 1);
 		*y2 += missing >> 1;
 	}
+
+	while (self) {
+		if (html_object_is_frame(self)) {
+			*x1 -= HTML_EMBEDDED(self)->abs_x;
+			*x2 -= HTML_EMBEDDED(self)->abs_x;
+			*y1 -= HTML_EMBEDDED(self)->abs_y;
+			*y2 -= HTML_EMBEDDED(self)->abs_y;
+			break;
+		}
+		self = self->parent;
+	}
 }
 
 /* Warning: `calc_size()' must have been called on `self' before this so that


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