summaryrefslogtreecommitdiff
path: root/packages/gtk+/gtk+-2.12.3/entry-cairo.patch
blob: 3313e7f13255d4a978c24cb6b0cf8e6d5bec9fd7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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
     }
 }