diff options
Diffstat (limited to 'widgets/text')
-rw-r--r-- | widgets/text/e-text.c | 45 | ||||
-rw-r--r-- | widgets/text/e-text.h | 6 |
2 files changed, 51 insertions, 0 deletions
diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c index f4d6dddf55..1aef2ded6c 100644 --- a/widgets/text/e-text.c +++ b/widgets/text/e-text.c @@ -311,6 +311,9 @@ e_text_init (EText *text) text->primary_length = 0; text->clipboard_selection = NULL; text->clipboard_length = 0; + + text->pointer_in = FALSE; + text->default_cursor_shown = TRUE; } /* Destroy handler for the text item */ @@ -1031,6 +1034,9 @@ e_text_realize (GnomeCanvasItem *item) (* parent_class->realize) (item); text->gc = gdk_gc_new (item->canvas->layout.bin_window); + + text->i_cursor = gdk_cursor_new (GDK_XTERM); + text->default_cursor = gdk_cursor_new (GDK_LEFT_PTR); } /* Unrealize handler for the text item */ @@ -1044,6 +1050,9 @@ e_text_unrealize (GnomeCanvasItem *item) gdk_gc_unref (text->gc); text->gc = NULL; + gdk_cursor_destroy (text->i_cursor); + gdk_cursor_destroy (text->default_cursor); + if (parent_class->unrealize) (* parent_class->unrealize) (item); } @@ -1700,6 +1709,12 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) if (focus_event->in) { if(!text->editing) { text->editing = TRUE; + if ( text->pointer_in ) { + if ( text->default_cursor_shown ) { + gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor); + text->default_cursor_shown = FALSE; + } + } text->selection_start = 0; text->selection_end = 0; text->select_by_word = FALSE; @@ -1712,6 +1727,10 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) } } else { text->editing = FALSE; + if ( ! text->default_cursor_shown ) { + gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor); + text->default_cursor_shown = TRUE; + } if (text->timeout_id) { g_source_remove(text->timeout_id); text->timeout_id = 0; @@ -1765,6 +1784,14 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) if (event->type == GDK_BUTTON_PRESS && text->timer) { g_timer_reset(text->timer); } + if (event->type == GDK_BUTTON_PRESS) { + gnome_canvas_item_grab (item, + GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, + text->i_cursor, + button.time); + } else { + gnome_canvas_item_ungrab (item, button.time); + } } else if (text->editable && event->type == GDK_BUTTON_RELEASE) { gnome_canvas_item_grab_focus (item); return 1; @@ -1784,6 +1811,24 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) text->last_state = motion.state; } break; + case GDK_ENTER_NOTIFY: + text->pointer_in = TRUE; + if (text->editing) { + if ( text->default_cursor_shown ) { + gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->i_cursor); + text->default_cursor_shown = FALSE; + } + } + break; + case GDK_LEAVE_NOTIFY: + text->pointer_in = FALSE; + if (text->editing) { + if ( ! text->default_cursor_shown ) { + gdk_window_set_cursor(GTK_WIDGET(item->canvas)->window, text->default_cursor); + text->default_cursor_shown = TRUE; + } + } + break; default: break; } diff --git a/widgets/text/e-text.h b/widgets/text/e-text.h index e1f250c678..f4f43a156b 100644 --- a/widgets/text/e-text.h +++ b/widgets/text/e-text.h @@ -167,6 +167,12 @@ struct _EText { gint primary_length; /* Primary selection text length */ gchar *clipboard_selection; /* Clipboard selection text */ gint clipboard_length; /* Clipboard selection text length*/ + + guint pointer_in : 1; + guint default_cursor_shown : 1; + + GdkCursor *default_cursor; + GdkCursor *i_cursor; }; struct _ETextClass { |