Implement block-cursor for overwrite mode. (#80378)
2007-06-12 Yevgen Muntyan <muntyan@tamu.edu> * gtk/gtkentry.c (gtk_entry_expose), (gtk_entry_toggle_overwrite), (gtk_entry_draw_cursor): * gtk/gtkstyle.c (_gtk_widget_get_cursor_gc), (_gtk_widget_get_cursor_color): * gtk/gtkstyle.h: * gtk/gtktextdisplay.c (gtk_text_renderer_prepare_run), (gtk_text_renderer_draw_shape), (text_renderer_set_state), (render_para): * gtk/gtktextlayout.c (gtk_text_layout_set_overwrite_mode), (gtk_text_layout_invalidate_cache), (get_block_cursor), (add_cursor), (gtk_text_layout_get_line_display), (_gtk_text_layout_get_block_cursor): * gtk/gtktextlayout.h: * gtk/gtktextutil.c (layout_get_char_width), (_gtk_text_util_get_block_cursor_location): * gtk/gtktextutil.h: * gtk/gtktextview.c (gtk_text_view_set_editable), (gtk_text_view_toggle_overwrite), (gtk_text_view_set_overwrite), (gtk_text_view_ensure_layout), (text_window_invalidate_cursors): Implement block-cursor for overwrite mode. (#80378) svn path=/trunk/; revision=18108
This commit is contained in:
committed by
Behdad Esfahbod
parent
15c6934778
commit
ef1e05f7de
@ -2054,6 +2054,8 @@ gtk_text_view_set_editable (GtkTextView *text_view,
|
||||
|
||||
if (text_view->layout)
|
||||
{
|
||||
gtk_text_layout_set_overwrite_mode (text_view->layout,
|
||||
text_view->overwrite_mode && text_view->editable);
|
||||
text_view->layout->default_style->editable = text_view->editable;
|
||||
gtk_text_layout_default_style_changed (text_view->layout);
|
||||
}
|
||||
@ -5422,7 +5424,20 @@ gtk_text_view_paste_clipboard (GtkTextView *text_view)
|
||||
static void
|
||||
gtk_text_view_toggle_overwrite (GtkTextView *text_view)
|
||||
{
|
||||
if (text_view->text_window)
|
||||
text_window_invalidate_cursors (text_view->text_window);
|
||||
|
||||
text_view->overwrite_mode = !text_view->overwrite_mode;
|
||||
|
||||
if (text_view->layout)
|
||||
gtk_text_layout_set_overwrite_mode (text_view->layout,
|
||||
text_view->overwrite_mode && text_view->editable);
|
||||
|
||||
if (text_view->text_window)
|
||||
text_window_invalidate_cursors (text_view->text_window);
|
||||
|
||||
gtk_text_view_pend_cursor_blink (text_view);
|
||||
|
||||
g_object_notify (G_OBJECT (text_view), "overwrite");
|
||||
}
|
||||
|
||||
@ -5461,11 +5476,7 @@ gtk_text_view_set_overwrite (GtkTextView *text_view,
|
||||
overwrite = overwrite != FALSE;
|
||||
|
||||
if (text_view->overwrite_mode != overwrite)
|
||||
{
|
||||
text_view->overwrite_mode = overwrite;
|
||||
|
||||
g_object_notify (G_OBJECT (text_view), "overwrite");
|
||||
}
|
||||
gtk_text_view_toggle_overwrite (text_view);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -6040,6 +6051,9 @@ gtk_text_view_ensure_layout (GtkTextView *text_view)
|
||||
else
|
||||
gtk_text_layout_set_cursor_visible (text_view->layout, FALSE);
|
||||
|
||||
gtk_text_layout_set_overwrite_mode (text_view->layout,
|
||||
text_view->overwrite_mode && text_view->editable);
|
||||
|
||||
ltr_context = gtk_widget_create_pango_context (GTK_WIDGET (text_view));
|
||||
pango_context_set_base_dir (ltr_context, PANGO_DIRECTION_LTR);
|
||||
rtl_context = gtk_widget_create_pango_context (GTK_WIDGET (text_view));
|
||||
@ -7764,6 +7778,12 @@ text_window_invalidate_cursors (GtkTextWindow *win)
|
||||
gtk_text_buffer_get_iter_at_mark (text_view->buffer, &iter,
|
||||
gtk_text_buffer_get_insert (text_view->buffer));
|
||||
|
||||
if (_gtk_text_layout_get_block_cursor (text_view->layout, &strong))
|
||||
{
|
||||
text_window_invalidate_rect (win, &strong);
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_text_layout_get_cursor_locations (text_view->layout, &iter,
|
||||
&strong, &weak);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user