+Sun Mar 3 14:26:33 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkstyle.[ch] (_gtk_get_insertion_cursor_gc):
+ Centralize lookup and caching of cursor GC's here.
+
+ * gtk/gtkentry.[ch] gtk/gtktextview.[ch] gtk/gtktextdisplay.c
+ gtk/gtklabel.c: Move to using _gtk_get_insertion_cursor_gc().
+
+ * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
+ under the text, not over the text.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): add
+ a secondary-cursor-color property.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): Decrease
+ the default aspect ratio to 1/25 (0.04).
+
+ * tests/testgtkrc (bell_duration): Comment out
+ cursor color setting.
+
Sun Mar 3 20:48:12 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkmenu.c (gtk_menu_set_submenu_navigation_region): change
required instead of pangox. (Reported by Miles
Lane)
-Sun Mar 3 12:06:02 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
- _under_ the text, not over.
-
-Sun Mar 3 11:26:20 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkwidget.c (gtk_widget_class_init): add
- a secondary-cursor-color property.
-
Sun Mar 3 11:12:16 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextlayout.c (add_cursor): When in split cursor
+Sun Mar 3 14:26:33 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkstyle.[ch] (_gtk_get_insertion_cursor_gc):
+ Centralize lookup and caching of cursor GC's here.
+
+ * gtk/gtkentry.[ch] gtk/gtktextview.[ch] gtk/gtktextdisplay.c
+ gtk/gtklabel.c: Move to using _gtk_get_insertion_cursor_gc().
+
+ * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
+ under the text, not over the text.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): add
+ a secondary-cursor-color property.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): Decrease
+ the default aspect ratio to 1/25 (0.04).
+
+ * tests/testgtkrc (bell_duration): Comment out
+ cursor color setting.
+
Sun Mar 3 20:48:12 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkmenu.c (gtk_menu_set_submenu_navigation_region): change
required instead of pangox. (Reported by Miles
Lane)
-Sun Mar 3 12:06:02 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
- _under_ the text, not over.
-
-Sun Mar 3 11:26:20 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkwidget.c (gtk_widget_class_init): add
- a secondary-cursor-color property.
-
Sun Mar 3 11:12:16 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextlayout.c (add_cursor): When in split cursor
+Sun Mar 3 14:26:33 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkstyle.[ch] (_gtk_get_insertion_cursor_gc):
+ Centralize lookup and caching of cursor GC's here.
+
+ * gtk/gtkentry.[ch] gtk/gtktextview.[ch] gtk/gtktextdisplay.c
+ gtk/gtklabel.c: Move to using _gtk_get_insertion_cursor_gc().
+
+ * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
+ under the text, not over the text.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): add
+ a secondary-cursor-color property.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): Decrease
+ the default aspect ratio to 1/25 (0.04).
+
+ * tests/testgtkrc (bell_duration): Comment out
+ cursor color setting.
+
Sun Mar 3 20:48:12 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkmenu.c (gtk_menu_set_submenu_navigation_region): change
required instead of pangox. (Reported by Miles
Lane)
-Sun Mar 3 12:06:02 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
- _under_ the text, not over.
-
-Sun Mar 3 11:26:20 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkwidget.c (gtk_widget_class_init): add
- a secondary-cursor-color property.
-
Sun Mar 3 11:12:16 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextlayout.c (add_cursor): When in split cursor
+Sun Mar 3 14:26:33 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkstyle.[ch] (_gtk_get_insertion_cursor_gc):
+ Centralize lookup and caching of cursor GC's here.
+
+ * gtk/gtkentry.[ch] gtk/gtktextview.[ch] gtk/gtktextdisplay.c
+ gtk/gtklabel.c: Move to using _gtk_get_insertion_cursor_gc().
+
+ * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
+ under the text, not over the text.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): add
+ a secondary-cursor-color property.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): Decrease
+ the default aspect ratio to 1/25 (0.04).
+
+ * tests/testgtkrc (bell_duration): Comment out
+ cursor color setting.
+
Sun Mar 3 20:48:12 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkmenu.c (gtk_menu_set_submenu_navigation_region): change
required instead of pangox. (Reported by Miles
Lane)
-Sun Mar 3 12:06:02 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
- _under_ the text, not over.
-
-Sun Mar 3 11:26:20 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkwidget.c (gtk_widget_class_init): add
- a secondary-cursor-color property.
-
Sun Mar 3 11:12:16 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextlayout.c (add_cursor): When in split cursor
+Sun Mar 3 14:26:33 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkstyle.[ch] (_gtk_get_insertion_cursor_gc):
+ Centralize lookup and caching of cursor GC's here.
+
+ * gtk/gtkentry.[ch] gtk/gtktextview.[ch] gtk/gtktextdisplay.c
+ gtk/gtklabel.c: Move to using _gtk_get_insertion_cursor_gc().
+
+ * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
+ under the text, not over the text.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): add
+ a secondary-cursor-color property.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): Decrease
+ the default aspect ratio to 1/25 (0.04).
+
+ * tests/testgtkrc (bell_duration): Comment out
+ cursor color setting.
+
Sun Mar 3 20:48:12 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkmenu.c (gtk_menu_set_submenu_navigation_region): change
required instead of pangox. (Reported by Miles
Lane)
-Sun Mar 3 12:06:02 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
- _under_ the text, not over.
-
-Sun Mar 3 11:26:20 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkwidget.c (gtk_widget_class_init): add
- a secondary-cursor-color property.
-
Sun Mar 3 11:12:16 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextlayout.c (add_cursor): When in split cursor
+Sun Mar 3 14:26:33 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkstyle.[ch] (_gtk_get_insertion_cursor_gc):
+ Centralize lookup and caching of cursor GC's here.
+
+ * gtk/gtkentry.[ch] gtk/gtktextview.[ch] gtk/gtktextdisplay.c
+ gtk/gtklabel.c: Move to using _gtk_get_insertion_cursor_gc().
+
+ * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
+ under the text, not over the text.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): add
+ a secondary-cursor-color property.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): Decrease
+ the default aspect ratio to 1/25 (0.04).
+
+ * tests/testgtkrc (bell_duration): Comment out
+ cursor color setting.
+
Sun Mar 3 20:48:12 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkmenu.c (gtk_menu_set_submenu_navigation_region): change
required instead of pangox. (Reported by Miles
Lane)
-Sun Mar 3 12:06:02 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
- _under_ the text, not over.
-
-Sun Mar 3 11:26:20 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkwidget.c (gtk_widget_class_init): add
- a secondary-cursor-color property.
-
Sun Mar 3 11:12:16 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextlayout.c (add_cursor): When in split cursor
+Sun Mar 3 14:26:33 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkstyle.[ch] (_gtk_get_insertion_cursor_gc):
+ Centralize lookup and caching of cursor GC's here.
+
+ * gtk/gtkentry.[ch] gtk/gtktextview.[ch] gtk/gtktextdisplay.c
+ gtk/gtklabel.c: Move to using _gtk_get_insertion_cursor_gc().
+
+ * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
+ under the text, not over the text.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): add
+ a secondary-cursor-color property.
+
+ * gtk/gtkwidget.c (gtk_widget_class_init): Decrease
+ the default aspect ratio to 1/25 (0.04).
+
+ * tests/testgtkrc (bell_duration): Comment out
+ cursor color setting.
+
Sun Mar 3 20:48:12 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkmenu.c (gtk_menu_set_submenu_navigation_region): change
required instead of pangox. (Reported by Miles
Lane)
-Sun Mar 3 12:06:02 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkentry.c (gtk_entry_expose): Draw cursors
- _under_ the text, not over.
-
-Sun Mar 3 11:26:20 2002 Owen Taylor <otaylor@redhat.com>
-
- * gtk/gtkwidget.c (gtk_widget_class_init): add
- a secondary-cursor-color property.
-
Sun Mar 3 11:12:16 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextlayout.c (add_cursor): When in split cursor
G_OBJECT_CLASS (parent_class)->finalize (object);
}
-static void
-gtk_entry_realize_cursor_gc (GtkEntry *entry)
-{
- GdkColor *cursor_color;
- GdkColor red = {0, 0xffff, 0x0000, 0x0000};
-
- if (entry->cursor_gc)
- gdk_gc_unref (entry->cursor_gc);
-
- gtk_widget_style_get (GTK_WIDGET (entry), "cursor-color", &cursor_color, NULL);
- entry->cursor_gc = gdk_gc_new (entry->text_area);
- if (cursor_color)
- gdk_gc_set_rgb_fg_color (entry->cursor_gc, cursor_color);
- else
- gdk_gc_set_rgb_fg_color (entry->cursor_gc, &red);
-}
-
static void
gtk_entry_realize (GtkWidget *widget)
{
widget->style = gtk_style_attach (widget->style, widget->window);
- gtk_entry_realize_cursor_gc (entry);
-
gdk_window_set_background (widget->window, &widget->style->base[GTK_WIDGET_STATE (widget)]);
gdk_window_set_background (entry->text_area, &widget->style->base[GTK_WIDGET_STATE (widget)]);
entry->text_area = NULL;
}
- if (entry->cursor_gc)
- {
- gdk_gc_unref (entry->cursor_gc);
- entry->cursor_gc = NULL;
- }
-
if (entry->popup_menu)
{
gtk_widget_destroy (entry->popup_menu);
gtk_entry_draw_frame (widget);
else if (entry->text_area == event->window)
{
- gtk_entry_draw_text (GTK_ENTRY (widget));
+ gint area_width, area_height;
+ get_text_area_size (entry, NULL, NULL, &area_width, &area_height);
+
+ gtk_paint_flat_box (widget->style, entry->text_area,
+ GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE,
+ NULL, widget, "entry_bg",
+ 0, 0, area_width, area_height);
+
if ((entry->visible || entry->invisible_char != 0) &&
GTK_WIDGET_HAS_FOCUS (widget) &&
entry->selection_bound == entry->current_pos && entry->cursor_visible)
if (entry->dnd_position != -1)
gtk_entry_draw_cursor (GTK_ENTRY (widget), CURSOR_DND);
+
+ gtk_entry_draw_text (GTK_ENTRY (widget));
}
return FALSE;
gdk_window_set_background (widget->window, &widget->style->base[GTK_WIDGET_STATE (widget)]);
gdk_window_set_background (entry->text_area, &widget->style->base[GTK_WIDGET_STATE (widget)]);
-
- gtk_entry_realize_cursor_gc (entry);
}
}
if (GTK_WIDGET_DRAWABLE (entry))
{
PangoLayout *layout = gtk_entry_ensure_layout (entry, TRUE);
- gint area_width, area_height;
gint x, y;
gint start_pos, end_pos;
get_layout_position (entry, &x, &y);
- get_text_area_size (entry, NULL, NULL, &area_width, &area_height);
-
- gtk_paint_flat_box (widget->style, entry->text_area,
- GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE,
- NULL, widget, "entry_bg",
- 0, 0, area_width, area_height);
-
gdk_draw_layout (entry->text_area, widget->style->text_gc [widget->state],
x, y,
layout);
gint xoffset = INNER_BORDER - entry->scroll_offset;
gint strong_x, weak_x;
gint text_area_height;
- GdkGC *gc1 = NULL;
- GdkGC *gc2 = NULL;
GtkTextDirection dir1 = GTK_TEXT_DIR_NONE;
GtkTextDirection dir2 = GTK_TEXT_DIR_NONE;
gint x1 = 0;
gint x2 = 0;
+ GdkGC *gc;
gdk_window_get_size (entry->text_area, NULL, &text_area_height);
if (split_cursor)
{
- gc1 = entry->cursor_gc;
x1 = strong_x;
if (weak_x != strong_x)
{
dir2 = (widget_direction == GTK_TEXT_DIR_LTR) ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
-
- gc2 = widget->style->text_gc[GTK_STATE_NORMAL];
x2 = weak_x;
}
}
else
{
- gc1 = entry->cursor_gc;
-
if (keymap_direction == widget_direction)
x1 = strong_x;
else
cursor_location.y = INNER_BORDER;
cursor_location.width = 0;
cursor_location.height = text_area_height - 2 * INNER_BORDER ;
-
- _gtk_draw_insertion_cursor (widget, entry->text_area, gc1,
+
+ gc = _gtk_get_insertion_cursor_gc (widget, TRUE);
+ _gtk_draw_insertion_cursor (widget, entry->text_area, gc,
&cursor_location, dir1,
dir2 != GTK_TEXT_DIR_NONE);
+ g_object_unref (gc);
if (dir2 != GTK_TEXT_DIR_NONE)
{
cursor_location.x = xoffset + x2;
- _gtk_draw_insertion_cursor (widget, entry->text_area, gc2,
+ gc = _gtk_get_insertion_cursor_gc (widget, FALSE);
+ _gtk_draw_insertion_cursor (widget, entry->text_area, gc,
&cursor_location, dir2,
TRUE);
+ g_object_unref (gc);
}
}
}
gunichar invisible_char;
gint width_chars;
-
- GdkGC *cursor_gc;
};
struct _GtkEntryClass
GdkWindow *window;
gint selection_anchor;
gint selection_end;
- GdkGC *cursor_gc;
GtkWidget *popup_menu;
};
GdkRectangle cursor_location;
GtkTextDirection dir1 = GTK_TEXT_DIR_NONE;
GtkTextDirection dir2 = GTK_TEXT_DIR_NONE;
- GdkGC *gc1 = NULL;
- GdkGC *gc2 = NULL;
+ GdkGC *gc;
keymap_direction =
(gdk_keymap_get_direction (gdk_keymap_get_default ()) == PANGO_DIRECTION_LTR) ?
if (split_cursor)
{
- gc1 = label->select_info->cursor_gc;
cursor1 = &strong_pos;
if (strong_pos.x != weak_pos.x ||
strong_pos.y != weak_pos.y)
{
dir2 = (widget_direction == GTK_TEXT_DIR_LTR) ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
-
- gc2 = widget->style->black_gc;
cursor2 = &weak_pos;
}
}
else
{
- gc1 = label->select_info->cursor_gc;
-
if (keymap_direction == widget_direction)
cursor1 = &strong_pos;
else
cursor_location.y = yoffset + PANGO_PIXELS (cursor1->y);
cursor_location.width = 0;
cursor_location.height = PANGO_PIXELS (cursor1->height);
-
- _gtk_draw_insertion_cursor (widget, widget->window, gc1,
+
+ gc = _gtk_get_insertion_cursor_gc (widget, TRUE);
+ _gtk_draw_insertion_cursor (widget, widget->window, gc,
&cursor_location, dir1,
dir2 != GTK_TEXT_DIR_NONE);
+ g_object_unref (gc);
if (dir2 != GTK_TEXT_DIR_NONE)
{
cursor_location.y = yoffset + PANGO_PIXELS (cursor2->y);
cursor_location.width = 0;
cursor_location.height = PANGO_PIXELS (cursor2->height);
-
- _gtk_draw_insertion_cursor (widget, widget->window, gc2,
+
+ gc = _gtk_get_insertion_cursor_gc (widget, FALSE);
+ _gtk_draw_insertion_cursor (widget, widget->window, gc,
&cursor_location, dir2, TRUE);
+ g_object_unref (gc);
}
}
}
gtk_label_setup_mnemonic (label, last_keyval);
}
-static void
-gtk_label_realize_cursor_gc (GtkLabel *label)
-{
- GdkColor *cursor_color;
- GdkColor red = {0, 0xffff, 0x0000, 0x0000};
-
- if (label->select_info == NULL)
- return;
-
- if (label->select_info->cursor_gc)
- gdk_gc_unref (label->select_info->cursor_gc);
-
- gtk_widget_style_get (GTK_WIDGET (label), "cursor-color", &cursor_color, NULL);
- label->select_info->cursor_gc = gdk_gc_new (GTK_WIDGET (label)->window);
- if (cursor_color)
- gdk_gc_set_rgb_fg_color (label->select_info->cursor_gc, cursor_color);
- else
- gdk_gc_set_rgb_fg_color (label->select_info->cursor_gc, &red);
-}
-
static void
gtk_label_realize (GtkWidget *widget)
{
(* GTK_WIDGET_CLASS (parent_class)->realize) (widget);
if (label->select_info)
- {
- gtk_label_create_window (label);
- gtk_label_realize_cursor_gc (label);
- }
-}
-
-static void
-gtk_label_unrealize_cursor_gc (GtkLabel *label)
-{
- if (label->select_info == NULL)
- return;
-
- if (label->select_info->cursor_gc)
- {
- gdk_gc_unref (label->select_info->cursor_gc);
- label->select_info->cursor_gc = NULL;
- }
+ gtk_label_create_window (label);
}
static void
label = GTK_LABEL (widget);
if (label->select_info)
- {
- gtk_label_unrealize_cursor_gc (label);
- gtk_label_destroy_window (label);
- }
+ gtk_label_destroy_window (label);
(* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
}
GTK_WIDGET_SET_FLAGS (label, GTK_CAN_FOCUS);
if (GTK_WIDGET_REALIZED (label))
- {
- gtk_label_create_window (label);
- gtk_label_realize_cursor_gc (label);
- }
+ gtk_label_create_window (label);
if (GTK_WIDGET_MAPPED (label))
gdk_window_show (label->select_info->window);
/* unselect, to give up the selection */
gtk_label_select_region (label, 0, 0);
- gtk_label_unrealize_cursor_gc (label);
-
if (label->select_info->window)
{
gtk_label_destroy_window (label);
gdouble *l,
gdouble *s);
+static void style_unrealize_cursor_gcs (GtkStyle *style);
/*
* Data for default check and radio buttons
gdk_colormap_free_colors (style->colormap, style->text, 5);
gdk_colormap_free_colors (style->colormap, style->base, 5);
gdk_colormap_free_colors (style->colormap, style->text_aa, 5);
+
+ style_unrealize_cursor_gcs (style);
}
static void
}
}
+typedef struct _CursorInfo CursorInfo;
+
+struct _CursorInfo
+{
+ GType for_type;
+ GdkGC *primary_gc;
+ GdkGC *secondary_gc;
+};
+
+static void
+style_unrealize_cursor_gcs (GtkStyle *style)
+{
+ CursorInfo *
+
+ cursor_info = g_object_get_data (G_OBJECT (style), "gtk-style-cursor-info");
+ if (cursor_info)
+ {
+ if (cursor_info->primary_gc)
+ gtk_gc_release (cursor_info->primary_gc);
+
+ if (cursor_info->secondary_gc)
+ gtk_gc_release (cursor_info->secondary_gc);
+
+ g_free (cursor_info);
+ g_object_set_data (G_OBJECT (style), "gtk-style-cursor-info", NULL);
+ }
+}
+
+static GdkGC *
+make_cursor_gc (GtkWidget *widget,
+ const gchar *property_name,
+ GdkColor *fallback)
+{
+ GdkGCValues gc_values;
+ GdkGCValuesMask gc_values_mask;
+ GdkColor *cursor_color;
+
+ gtk_widget_style_get (widget, property_name, &cursor_color, NULL);
+
+ gc_values_mask = GDK_GC_FOREGROUND;
+ if (cursor_color)
+ {
+ gc_values.foreground = *cursor_color;
+ gdk_color_free (cursor_color);
+ }
+ else
+ gc_values.foreground = *fallback;
+
+ gdk_rgb_find_color (widget->style->colormap, &gc_values.foreground);
+ return gtk_gc_get (widget->style->depth, widget->style->colormap, &gc_values, gc_values_mask);
+}
+
+/**
+ * _gtk_get_insertion_cursor_gc:
+ * @widget: a #GtkWidget
+ * @is_primary: if the cursor should be the primary cursor color.
+ *
+ * Get a GC suitable for drawing the primary or secondary text
+ * cursor.
+ *
+ * Note: the return value is ref'ed because calls to this function
+ * on other widgets could result in this the GC being released
+ * which would be an unexpected side effect. If made public,
+ * this function should possibly be called create_insertion_cursor_gc().
+ *
+ * Return value: an appropriate #GdkGC. Call g_object_unref() on
+ * the gc when you are done with it; this GC may be shared with
+ * other users, so you must not modify the GC except for temporarily
+ * setting the clip before drawing with the GC, and then unsetting the clip
+ * again afterwards.
+ **/
+GdkGC *
+_gtk_get_insertion_cursor_gc (GtkWidget *widget,
+ gboolean is_primary)
+{
+ CursorInfo *cursor_info;
+
+ cursor_info = g_object_get_data (G_OBJECT (widget->style), "gtk-style-cursor-info");
+ if (!cursor_info)
+ {
+ cursor_info = g_new (CursorInfo, 1);
+ g_object_set_data (G_OBJECT (widget->style), "gtk-style-cursor-info", cursor_info);
+ cursor_info->primary_gc = NULL;
+ cursor_info->secondary_gc = NULL;
+ cursor_info->for_type = G_TYPE_INVALID;
+ }
+
+ /* We have to keep track of the type because gtk_widget_style_get()
+ * can return different results when called on the same property and
+ * same style but for different widgets. :-(. That is,
+ * GtkEntry::cursor-color = "red" in a style will modify the cursor
+ * color for entries but not for text view.
+ */
+ if (cursor_info->for_type != G_OBJECT_TYPE (widget))
+ {
+ cursor_info->for_type = G_OBJECT_TYPE (widget);
+ if (cursor_info->primary_gc)
+ {
+ gtk_gc_release (cursor_info->primary_gc);
+ cursor_info->primary_gc = NULL;
+ }
+ if (cursor_info->secondary_gc)
+ {
+ gtk_gc_release (cursor_info->secondary_gc);
+ cursor_info->secondary_gc = NULL;
+ }
+ }
+
+ if (is_primary)
+ {
+ if (!cursor_info->primary_gc)
+ cursor_info->primary_gc = make_cursor_gc (widget,
+ "cursor-color",
+ &widget->style->black);
+
+ return g_object_ref (cursor_info->primary_gc);
+ }
+ else
+ {
+ static GdkColor gray = { 0, 0x8888, 0x8888, 0x8888 };
+
+ if (!cursor_info->secondary_gc)
+ cursor_info->secondary_gc = make_cursor_gc (widget,
+ "secondary-cursor-color",
+ &gray);
+
+ return g_object_ref (cursor_info->secondary_gc);
+ }
+}
+
/**
* _gtk_draw_insertion_cursor:
* @widget: a #GtkWidget
const gchar *string);
#endif /* GTK_DISABLE_DEPRECATED */
-void _gtk_draw_insertion_cursor (GtkWidget *widget,
- GdkDrawable *drawable,
- GdkGC *gc,
- GdkRectangle *location,
- GtkTextDirection direction,
- gboolean draw_arrow);
+GdkGC *_gtk_get_insertion_cursor_gc (GtkWidget *widget,
+ gboolean is_primary);
+void _gtk_draw_insertion_cursor (GtkWidget *widget,
+ GdkDrawable *drawable,
+ GdkGC *gc,
+ GdkRectangle *location,
+ GtkTextDirection direction,
+ gboolean draw_arrow);
#ifdef __cplusplus
}
GtkTextCursorDisplay *cursor = cursor_list->data;
GtkTextDirection dir;
GdkRectangle cursor_location;
-
GdkGC *gc;
- if (cursor->is_strong)
- gc = cursor_gc;
- else
- gc = widget->style->text_gc[GTK_STATE_NORMAL];
-
dir = line_display->direction;
if (have_strong && have_weak)
{
cursor_location.width = 0;
cursor_location.height = cursor->height;
+ gc = _gtk_get_insertion_cursor_gc (widget, cursor->is_strong);
gdk_gc_set_clip_rectangle(gc, &clip);
_gtk_draw_insertion_cursor (widget, drawable, gc, &cursor_location,
dir, have_strong && have_weak);
gdk_gc_set_clip_rectangle (gc, NULL);
+ g_object_unref (gc);
+
cursor_list = cursor_list->next;
}
} /* line_display->height > 0 */
}
}
-static void
-gtk_text_view_realize_cursor_gc (GtkTextView *text_view)
-{
- GdkColor *cursor_color;
- GdkColor red = { 0, 0xffff, 0x0000, 0x0000 };
-
- if (text_view->cursor_gc)
- gdk_gc_unref (text_view->cursor_gc);
-
- gtk_widget_style_get (GTK_WIDGET (text_view), "cursor-color", &cursor_color, NULL);
-
- if (!cursor_color)
- cursor_color = &red;
-
- text_view->cursor_gc = gdk_gc_new (text_view->text_window->bin_window);
- gdk_gc_set_rgb_fg_color (text_view->cursor_gc, cursor_color);
-}
-
static void
gtk_text_view_realize (GtkWidget *widget)
{
text_window_realize (text_view->bottom_window,
widget->window);
- gtk_text_view_realize_cursor_gc (text_view);
-
gtk_text_view_ensure_layout (text_view);
if (text_view->buffer)
gtk_text_buffer_remove_selection_clipboard (text_view->buffer,
gtk_clipboard_get (GDK_SELECTION_PRIMARY));
- if (text_view->cursor_gc)
- {
- gdk_gc_unref (text_view->cursor_gc);
- text_view->cursor_gc = NULL;
- }
-
gtk_text_view_remove_validate_idles (text_view);
if (text_view->popup_menu)
if (text_view->bottom_window)
gdk_window_set_background (text_view->bottom_window->bin_window,
&widget->style->bg[GTK_WIDGET_STATE (widget)]);
-
- gtk_text_view_realize_cursor_gc (text_view);
}
if (text_view->layout && previous_style)
gtk_text_layout_draw (text_view->layout,
widget,
text_view->text_window->bin_window,
- text_view->cursor_gc,
+ NULL,
text_view->xoffset,
text_view->yoffset,
area->x, area->y,
GSList *children;
GtkTextPendingScroll *pending_scroll;
- GdkGC *cursor_gc;
gint pending_place_cursor_button;
};
_("Color with which to draw insertion cursor"),
GDK_TYPE_COLOR,
G_PARAM_READABLE));
+ gtk_widget_class_install_style_property (klass,
+ g_param_spec_boxed ("secondary-cursor-color",
+ _("Secondary cursor color"),
+ _("Color with which to draw the secondary insertion cursor when editing mixed right-to-left and left-to-right text."),
+ GDK_TYPE_COLOR,
+ G_PARAM_READABLE));
gtk_widget_class_install_style_property (klass,
g_param_spec_float ("cursor-aspect-ratio",
_("Cursor line aspect ratio"),
_("Aspect ratio with which to draw insertion cursor"),
- 0.0, 1.0, 0.033,
+ 0.0, 1.0, 0.04,
G_PARAM_READABLE));
}
# xthickness = 20
GtkButton::child_displacement_x = 1
GtkButton::child_displacement_y = 1
- GtkWidget::cursor_color = "#ff0000"
+# GtkWidget::cursor_color = "#ff0000"
GtkToolbar::space_size = 10
GtkToolbar::space_style = line
GtkToolbar::button_relief = none