Upstream-Status: Pending Index: gtk/gtkentry.c =================================================================== RCS file: /cvs/gnome/gtk+/gtk/gtkentry.c,v retrieving revision 1.317 diff -u -r1.317 gtkentry.c --- gtk/gtkentry.c 29 Jun 2006 09:18:05 -0000 1.317 +++ gtk/gtkentry.c 2 Jul 2006 14:14:24 -0000 @@ -3337,7 +3337,9 @@ if (GTK_WIDGET_DRAWABLE (entry)) { PangoLayout *layout = gtk_entry_ensure_layout (entry, TRUE); +#ifdef USE_CAIRO_INTERNALLY cairo_t *cr; +#endif gint x, y; gint start_pos, end_pos; @@ -3345,23 +3347,35 @@ get_layout_position (entry, &x, &y); +#ifdef USE_CAIRO_INTERNALLY cr = gdk_cairo_create (entry->text_area); cairo_move_to (cr, x, y); gdk_cairo_set_source_color (cr, &widget->style->text [widget->state]); pango_cairo_show_layout (cr, layout); +#else + gdk_draw_layout (entry->text_area, widget->style->text_gc [widget->state], + x, y, + layout); +#endif if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start_pos, &end_pos)) { gint *ranges; gint n_ranges, i; PangoRectangle logical_rect; - GdkColor *selection_color, *text_color; GtkBorder inner_border; +#ifdef USE_CAIRO_INTERNALLY + GdkColor *selection_color, *text_color; +#else + GdkGC *selection_gc, *text_gc; + GdkRegion *clip_region; +#endif pango_layout_get_pixel_extents (layout, NULL, &logical_rect); gtk_entry_get_pixel_ranges (entry, &ranges, &n_ranges); +#ifdef USE_CAIRO_INTERNALLY if (GTK_WIDGET_HAS_FOCUS (entry)) { selection_color = &widget->style->base [GTK_STATE_SELECTED]; @@ -3390,11 +3404,46 @@ cairo_move_to (cr, x, y); gdk_cairo_set_source_color (cr, text_color); pango_cairo_show_layout (cr, layout); - +#else + if (GTK_WIDGET_HAS_FOCUS (entry)) + { + selection_gc = widget->style->base_gc [GTK_STATE_SELECTED]; + text_gc = widget->style->text_gc [GTK_STATE_SELECTED]; + } + else + { + selection_gc = widget->style->base_gc [GTK_STATE_ACTIVE]; + text_gc = widget->style->text_gc [GTK_STATE_ACTIVE]; + } + + clip_region = gdk_region_new (); + for (i = 0; i < n_ranges; ++i) + { + GdkRectangle rect; + + rect.x = inner_border.left - entry->scroll_offset + ranges[2 * i]; + rect.y = y; + rect.width = ranges[2 * i + 1]; + rect.height = logical_rect.height; + + gdk_draw_rectangle (entry->text_area, selection_gc, TRUE, + rect.x, rect.y, rect.width, rect.height); + + gdk_region_union_with_rect (clip_region, &rect); + } + + gdk_gc_set_clip_region (text_gc, clip_region); + gdk_draw_layout (entry->text_area, text_gc, + x, y, + layout); + gdk_gc_set_clip_region (text_gc, NULL); + gdk_region_destroy (clip_region); +#endif g_free (ranges); } - +#ifdef USE_CAIRO_INTERNALLY cairo_destroy (cr); +#endif } }