Re: [evolution-patches] Patch to enable cursor and keyboard navigation in mail reader,(v7), menu version, please revoke previous ones
- From: Radek Doulík <rodo ximian com>
- To: yuedong du sun com
- Cc: lewing <lewing ximian com>, Anna Marie Dirks <anna ximian com>, ettore ximian com, Patches <evolution-patches ximian com>, sceri-evolution-acc sun com
- Subject: Re: [evolution-patches] Patch to enable cursor and keyboard navigation in mail reader,(v7), menu version, please revoke previous ones
- Date: 02 Jul 2003 22:59:12 +0200
Hi York,
On Wed, 2003-07-02 at 11:22, yuedong du wrote:
> Hi Radek,
>
> Sorry to be so pushy, :-(,
Ops, I lost track of this patch, I am sorry.
> But if it's possible that this patch can be finished before USA national
> day (7.4)? Because the vacation is long and later patch will depend on
> this patch.
> Index: src/gtkhtml.c
> ===================================================================
> RCS file: /cvs/gnome/gtkhtml/src/gtkhtml.c,v
> retrieving revision 1.520
> diff -u -r1.520 gtkhtml.c
> --- src/gtkhtml.c 26 Jun 2003 15:57:10 -0000 1.520
> +++ src/gtkhtml.c 27 Jun 2003 07:22:29 -0000
> @@ -738,7 +738,7 @@
> fixed_desc = pango_font_description_from_string
> (fixed_name);
> if (pango_font_description_get_family (fixed_desc)) {
> fixed_size = PANGO_PIXELS
> (pango_font_description_get_size (fixed_desc));
> - fixed_family =
> pango_font_description_get_family (fixed_desc);
> + fixed_family =
> g_strdup(pango_font_description_get_family (fixed_desc));
> } else {
> g_free (fixed_name);
> fixed_name = NULL;
> @@ -760,11 +760,30 @@
> g_free (fixed_name);
> }
okie, as Larry said, this is already fixed in CVS
> +static void
> +set_caret_mode(HTMLEngine *engine, gboolean caret_mode)
> +{
> + if (engine->editable) return;
please could you indent this part like this
if (engine->editable)
return;
> +
> + engine->caret_mode = caret_mode;
> +
> + /* 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 +798,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 +1506,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);
I guess you want to do this only when engine->caret_mode is TRUE
> + }
> }
> if (html->allow_selection) {
> if (event->state & GDK_SHIFT_MASK)
> @@ -2605,6 +2628,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 +3824,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 27 Jun 2003 07:22:29 -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;
Larry, please could you check this doesn't break clipping?
> 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;
> + }
I think this could be rather implemented as part of get_cursor of embedded object?
>
> 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 27 Jun 2003 07:22:30 -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;
> + }
nice, this looks like bug I have been looking for some time, great
>
> 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 27 Jun 2003 07:22:35 -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)
> @@ -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;
?
>
> 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 27 Jun 2003 07:22:36 -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 27 Jun 2003 07:22:37 -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]