Re: [evolution-patches] Patch to enable cursor and keyboard navigation in mail reader,(v7), menu version, please revoke previous ones



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]