diff options
author | Richard Purdie <richard@openedhand.com> | 2006-11-02 10:10:55 +0000 |
---|---|---|
committer | Richard Purdie <richard@openedhand.com> | 2006-11-02 10:10:55 +0000 |
commit | 5d6699af12ae61fb4919188c8cd35dbab53d06e2 (patch) | |
tree | a56b78594db1f5d029e79f285dd254f491a81f2d /meta/packages/gtk+ | |
parent | bdc1ab309aaca7900af46569f1727dc4f7a22b8f (diff) | |
download | poky-5d6699af12ae61fb4919188c8cd35dbab53d06e2.tar.gz |
Add gtk+ 2.10.6 from OE
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@850 311d38ba-8fff-0310-9ca6-ca027cbcb966
Diffstat (limited to 'meta/packages/gtk+')
18 files changed, 4227 insertions, 0 deletions
diff --git a/meta/packages/gtk+/gtk+-2.10.6/automake-lossage.patch b/meta/packages/gtk+/gtk+-2.10.6/automake-lossage.patch new file mode 100644 index 0000000000..0d423ddbb9 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/automake-lossage.patch | |||
@@ -0,0 +1,24 @@ | |||
1 | --- gtk+-2.4.1/docs/tutorial/Makefile.am~ 2003-05-06 22:54:20.000000000 +0100 | ||
2 | +++ gtk+-2.4.1/docs/tutorial/Makefile.am 2004-05-08 12:31:41.000000000 +0100 | ||
3 | @@ -52,21 +52,5 @@ | ||
4 | |||
5 | dist-hook: html | ||
6 | cp -Rp $(srcdir)/html $(distdir) | ||
7 | -else | ||
8 | -html: | ||
9 | - echo "***" | ||
10 | - echo "*** Warning: Tutorial not built" | ||
11 | - echo "***" | ||
12 | - | ||
13 | -pdf: | ||
14 | - echo "***" | ||
15 | - echo "*** Warning: Tutorial not built" | ||
16 | - echo "***" | ||
17 | - | ||
18 | -dist-hook: | ||
19 | - echo "***" | ||
20 | - echo "*** Warning: Tutorial not built" | ||
21 | - echo "*** DISTRIBUTION IS INCOMPLETE" | ||
22 | - echo "***" | ||
23 | endif | ||
24 | |||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/disable-print.patch b/meta/packages/gtk+/gtk+-2.10.6/disable-print.patch new file mode 100644 index 0000000000..1067773f12 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/disable-print.patch | |||
@@ -0,0 +1,50 @@ | |||
1 | --- gtk+-2.10.0/configure.in~ 2006-07-05 18:11:44.000000000 +0200 | ||
2 | +++ gtk+-2.10.0/configure.in 2006-07-05 18:11:44.000000000 +0200 | ||
3 | @@ -1539,26 +1539,27 @@ | ||
4 | # Printing system checks | ||
5 | ################################################################ | ||
6 | |||
7 | -AC_PATH_PROG(CUPS_CONFIG, cups-config, no) | ||
8 | -if test "x$CUPS_CONFIG" != "xno"; then | ||
9 | - CUPS_CFLAGS=`cups-config --cflags | sed 's/-O[0-9]*//' | sed 's/-m[^\t]*//g'` | ||
10 | - CUPS_LIBS=`cups-config --libs` | ||
11 | - | ||
12 | - CUPS_API_VERSION=`cups-config --api-version` | ||
13 | - CUPS_API_MAJOR=`echo -n $CUPS_API_VERSION | awk -F. '{print $1}'` | ||
14 | - CUPS_API_MINOR=`echo -n $CUPS_API_VERSION | awk -F. '{print $2}'` | ||
15 | - | ||
16 | - if test $CUPS_API_MAJOR -gt 1 -o \ | ||
17 | - $CUPS_API_MAJOR -eq 1 -a $CUPS_API_MINOR -ge 2; then | ||
18 | - AC_DEFINE(HAVE_CUPS_API_1_2) | ||
19 | - fi | ||
20 | - | ||
21 | - AC_SUBST(CUPS_API_MAJOR) | ||
22 | - AC_SUBST(CUPS_API_MINOR) | ||
23 | - AC_SUBST(CUPS_CFLAGS) | ||
24 | - AC_SUBST(CUPS_LIBS) | ||
25 | -fi | ||
26 | -AM_CONDITIONAL(HAVE_CUPS, test "x$CUPS_CONFIG" != "xno") | ||
27 | +#AC_PATH_PROG(CUPS_CONFIG, cups-config, no) | ||
28 | +#if test "x$CUPS_CONFIG" != "xno"; then | ||
29 | +# CUPS_CFLAGS=`cups-config --cflags | sed 's/-O[0-9]*//' | sed 's/-m[^\t]*//g'` | ||
30 | +# CUPS_LIBS=`cups-config --libs` | ||
31 | +# | ||
32 | +# CUPS_API_VERSION=`cups-config --api-version` | ||
33 | +# CUPS_API_MAJOR=`echo -n $CUPS_API_VERSION | awk -F. '{print $1}'` | ||
34 | +# CUPS_API_MINOR=`echo -n $CUPS_API_VERSION | awk -F. '{print $2}'` | ||
35 | +# | ||
36 | +# if test $CUPS_API_MAJOR -gt 1 -o \ | ||
37 | +# $CUPS_API_MAJOR -eq 1 -a $CUPS_API_MINOR -ge 2; then | ||
38 | +# AC_DEFINE(HAVE_CUPS_API_1_2) | ||
39 | +# fi | ||
40 | +# | ||
41 | +# AC_SUBST(CUPS_API_MAJOR) | ||
42 | +# AC_SUBST(CUPS_API_MINOR) | ||
43 | +# AC_SUBST(CUPS_CFLAGS) | ||
44 | +# AC_SUBST(CUPS_LIBS) | ||
45 | +#fi | ||
46 | +#AM_CONDITIONAL(HAVE_CUPS, test "x$CUPS_CONFIG" != "xno") | ||
47 | +AM_CONDITIONAL(HAVE_CUPS,false) | ||
48 | |||
49 | gtk_save_cppflags="$CPPFLAGS" | ||
50 | CPPFLAGS="$CPPFLAGS $GTK_DEP_CFLAGS" | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/disable-tooltips.patch b/meta/packages/gtk+/gtk+-2.10.6/disable-tooltips.patch new file mode 100644 index 0000000000..d71d839c3c --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/disable-tooltips.patch | |||
@@ -0,0 +1,11 @@ | |||
1 | --- gtk+-2.4.3/gtk/gtktooltips.c.old 2004-07-04 18:52:04.000000000 +0100 | ||
2 | +++ gtk+-2.4.3/gtk/gtktooltips.c 2004-07-04 18:52:08.000000000 +0100 | ||
3 | @@ -118,7 +118,7 @@ | ||
4 | tooltips->tips_data_list = NULL; | ||
5 | |||
6 | tooltips->delay = DEFAULT_DELAY; | ||
7 | - tooltips->enabled = TRUE; | ||
8 | + tooltips->enabled = FALSE; | ||
9 | tooltips->timer_tag = 0; | ||
10 | tooltips->use_sticky_delay = FALSE; | ||
11 | tooltips->last_popdown.tv_sec = -1; | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/gtk+-handhelds.patch b/meta/packages/gtk+/gtk+-2.10.6/gtk+-handhelds.patch new file mode 100644 index 0000000000..20481f059b --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/gtk+-handhelds.patch | |||
@@ -0,0 +1,236 @@ | |||
1 | --- gtk+-2.4.1/gtk/gtkarrow.c 2004-03-13 09:51:13.000000000 +1100 | ||
2 | +++ gtk+-2.4.1/gtk/gtkarrow.c 2004-05-26 14:52:17.000000000 +1000 | ||
3 | @@ -29,7 +29,7 @@ | ||
4 | #include "gtkarrow.h" | ||
5 | #include "gtkintl.h" | ||
6 | |||
7 | -#define MIN_ARROW_SIZE 15 | ||
8 | +#define MIN_ARROW_SIZE 7 | ||
9 | |||
10 | enum { | ||
11 | PROP_0, | ||
12 | @@ -53,6 +53,8 @@ | ||
13 | guint prop_id, | ||
14 | GValue *value, | ||
15 | GParamSpec *pspec); | ||
16 | +static void gtk_arrow_size_request (GtkWidget *arrow, | ||
17 | + GtkRequisition *requisition); | ||
18 | |||
19 | GType | ||
20 | gtk_arrow_get_type (void) | ||
21 | @@ -111,6 +113,7 @@ | ||
22 | G_PARAM_READABLE | G_PARAM_WRITABLE)); | ||
23 | |||
24 | widget_class->expose_event = gtk_arrow_expose; | ||
25 | + widget_class->size_request = gtk_arrow_size_request; | ||
26 | } | ||
27 | |||
28 | static void | ||
29 | @@ -166,13 +169,18 @@ | ||
30 | } | ||
31 | |||
32 | static void | ||
33 | +gtk_arrow_size_request (GtkWidget *arrow, | ||
34 | + GtkRequisition *requisition) | ||
35 | +{ | ||
36 | + requisition->width = MIN_ARROW_SIZE + GTK_MISC (arrow)->xpad * 2; | ||
37 | + requisition->height = MIN_ARROW_SIZE + GTK_MISC (arrow)->ypad * 2; | ||
38 | +} | ||
39 | + | ||
40 | +static void | ||
41 | gtk_arrow_init (GtkArrow *arrow) | ||
42 | { | ||
43 | GTK_WIDGET_SET_FLAGS (arrow, GTK_NO_WINDOW); | ||
44 | |||
45 | - GTK_WIDGET (arrow)->requisition.width = MIN_ARROW_SIZE + GTK_MISC (arrow)->xpad * 2; | ||
46 | - GTK_WIDGET (arrow)->requisition.height = MIN_ARROW_SIZE + GTK_MISC (arrow)->ypad * 2; | ||
47 | - | ||
48 | arrow->arrow_type = GTK_ARROW_RIGHT; | ||
49 | arrow->shadow_type = GTK_SHADOW_OUT; | ||
50 | } | ||
51 | --- gtk+-2.4.1/gtk/gtkcalendar.c 2004-03-06 14:37:26.000000000 +1100 | ||
52 | +++ gtk+-2.4.1/gtk/gtkcalendar.c 2004-05-26 14:58:57.000000000 +1000 | ||
53 | @@ -340,6 +340,9 @@ | ||
54 | static void gtk_calendar_select_and_focus_day (GtkCalendar *calendar, | ||
55 | guint day); | ||
56 | |||
57 | +static void gtk_calendar_do_select_day (GtkCalendar *calendar, | ||
58 | + guint day); | ||
59 | + | ||
60 | static void gtk_calendar_paint_arrow (GtkWidget *widget, | ||
61 | guint arrow); | ||
62 | static void gtk_calendar_paint_day_num (GtkWidget *widget, | ||
63 | @@ -861,13 +864,13 @@ | ||
64 | if (month_len < calendar->selected_day) | ||
65 | { | ||
66 | calendar->selected_day = 0; | ||
67 | - gtk_calendar_select_day (calendar, month_len); | ||
68 | + gtk_calendar_do_select_day (calendar, month_len); | ||
69 | } | ||
70 | else | ||
71 | { | ||
72 | if (calendar->selected_day < 0) | ||
73 | calendar->selected_day = calendar->selected_day + 1 + month_length[leap (calendar->year)][calendar->month + 1]; | ||
74 | - gtk_calendar_select_day (calendar, calendar->selected_day); | ||
75 | + gtk_calendar_do_select_day (calendar, calendar->selected_day); | ||
76 | } | ||
77 | |||
78 | gtk_widget_queue_draw (GTK_WIDGET (calendar)); | ||
79 | @@ -908,10 +911,10 @@ | ||
80 | if (month_len < calendar->selected_day) | ||
81 | { | ||
82 | calendar->selected_day = 0; | ||
83 | - gtk_calendar_select_day (calendar, month_len); | ||
84 | + gtk_calendar_do_select_day (calendar, month_len); | ||
85 | } | ||
86 | else | ||
87 | - gtk_calendar_select_day (calendar, calendar->selected_day); | ||
88 | + gtk_calendar_do_select_day (calendar, calendar->selected_day); | ||
89 | |||
90 | gtk_widget_queue_draw (GTK_WIDGET (calendar)); | ||
91 | gtk_calendar_thaw (calendar); | ||
92 | @@ -939,10 +942,10 @@ | ||
93 | if (month_len < calendar->selected_day) | ||
94 | { | ||
95 | calendar->selected_day = 0; | ||
96 | - gtk_calendar_select_day (calendar, month_len); | ||
97 | + gtk_calendar_do_select_day (calendar, month_len); | ||
98 | } | ||
99 | else | ||
100 | - gtk_calendar_select_day (calendar, calendar->selected_day); | ||
101 | + gtk_calendar_do_select_day (calendar, calendar->selected_day); | ||
102 | |||
103 | gtk_widget_queue_draw (GTK_WIDGET (calendar)); | ||
104 | gtk_calendar_thaw (calendar); | ||
105 | @@ -974,10 +977,10 @@ | ||
106 | if (month_len < calendar->selected_day) | ||
107 | { | ||
108 | calendar->selected_day = 0; | ||
109 | - gtk_calendar_select_day (calendar, month_len); | ||
110 | + gtk_calendar_do_select_day (calendar, month_len); | ||
111 | } | ||
112 | else | ||
113 | - gtk_calendar_select_day (calendar, calendar->selected_day); | ||
114 | + gtk_calendar_do_select_day (calendar, calendar->selected_day); | ||
115 | |||
116 | gtk_widget_queue_draw (GTK_WIDGET (calendar)); | ||
117 | gtk_calendar_thaw (calendar); | ||
118 | @@ -2480,9 +2483,9 @@ | ||
119 | return TRUE; | ||
120 | } | ||
121 | |||
122 | -void | ||
123 | -gtk_calendar_select_day (GtkCalendar *calendar, | ||
124 | - guint day) | ||
125 | +static void | ||
126 | +gtk_calendar_do_select_day (GtkCalendar *calendar, | ||
127 | + guint day) | ||
128 | { | ||
129 | g_return_if_fail (GTK_IS_CALENDAR (calendar)); | ||
130 | g_return_if_fail (day <= 31); | ||
131 | @@ -2499,6 +2502,13 @@ | ||
132 | if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar))) | ||
133 | gtk_calendar_paint_day_num (GTK_WIDGET (calendar), selected_day); | ||
134 | } | ||
135 | +} | ||
136 | + | ||
137 | +void | ||
138 | +gtk_calendar_select_day (GtkCalendar *calendar, | ||
139 | + guint day) | ||
140 | +{ | ||
141 | + gtk_calendar_do_select_day (calendar, day); | ||
142 | |||
143 | calendar->selected_day = day; | ||
144 | |||
145 | --- gtk+-2.4.1/gtk/gtkentry.c 2004-04-22 08:08:08.000000000 +1000 | ||
146 | +++ gtk+-2.4.1/gtk/gtkentry.c 2004-05-26 14:52:17.000000000 +1000 | ||
147 | @@ -557,6 +557,15 @@ | ||
148 | 0.0, | ||
149 | G_PARAM_READABLE | G_PARAM_WRITABLE)); | ||
150 | |||
151 | + gtk_widget_class_install_style_property (widget_class, | ||
152 | + g_param_spec_int ("min_width", | ||
153 | + _("Minimum width"), | ||
154 | + _("Minimum width of the entry field"), | ||
155 | + 0, | ||
156 | + G_MAXINT, | ||
157 | + MIN_ENTRY_WIDTH, | ||
158 | + G_PARAM_READABLE)); | ||
159 | + | ||
160 | signals[POPULATE_POPUP] = | ||
161 | g_signal_new ("populate_popup", | ||
162 | G_OBJECT_CLASS_TYPE (gobject_class), | ||
163 | @@ -1124,7 +1133,7 @@ | ||
164 | { | ||
165 | GtkEntry *entry = GTK_ENTRY (widget); | ||
166 | PangoFontMetrics *metrics; | ||
167 | - gint xborder, yborder; | ||
168 | + gint xborder, yborder, min_width; | ||
169 | PangoContext *context; | ||
170 | |||
171 | gtk_widget_ensure_style (widget); | ||
172 | @@ -1140,9 +1149,11 @@ | ||
173 | |||
174 | xborder += INNER_BORDER; | ||
175 | yborder += INNER_BORDER; | ||
176 | - | ||
177 | + | ||
178 | + gtk_widget_style_get (widget, "min_width", &min_width, NULL); | ||
179 | + | ||
180 | if (entry->width_chars < 0) | ||
181 | - requisition->width = MIN_ENTRY_WIDTH + xborder * 2; | ||
182 | + requisition->width = min_width + xborder * 2; | ||
183 | else | ||
184 | { | ||
185 | gint char_width = pango_font_metrics_get_approximate_char_width (metrics); | ||
186 | --- gtk+-2.4.1/gtk/gtkrange.c 2004-03-06 14:38:08.000000000 +1100 | ||
187 | +++ gtk+-2.4.1/gtk/gtkrange.c 2004-05-26 14:52:17.000000000 +1000 | ||
188 | @@ -180,6 +180,7 @@ | ||
189 | static GtkWidgetClass *parent_class = NULL; | ||
190 | static guint signals[LAST_SIGNAL]; | ||
191 | |||
192 | +static GdkAtom recognize_protocols_atom, atom_atom; | ||
193 | |||
194 | GType | ||
195 | gtk_range_get_type (void) | ||
196 | @@ -220,6 +221,9 @@ | ||
197 | object_class = (GtkObjectClass*) class; | ||
198 | widget_class = (GtkWidgetClass*) class; | ||
199 | |||
200 | + recognize_protocols_atom = gdk_atom_intern ("RECOGNIZE_PROTOCOLS", FALSE); | ||
201 | + atom_atom = gdk_atom_intern ("ATOM", FALSE); | ||
202 | + | ||
203 | parent_class = g_type_class_peek_parent (class); | ||
204 | |||
205 | gobject_class->set_property = gtk_range_set_property; | ||
206 | @@ -815,6 +819,12 @@ | ||
207 | &attributes, attributes_mask); | ||
208 | gdk_window_set_user_data (range->event_window, range); | ||
209 | |||
210 | + gdk_property_change (range->event_window, | ||
211 | + recognize_protocols_atom, | ||
212 | + atom_atom, | ||
213 | + 32, GDK_PROP_MODE_REPLACE, | ||
214 | + NULL, 0); | ||
215 | + | ||
216 | widget->style = gtk_style_attach (widget->style, widget->window); | ||
217 | } | ||
218 | |||
219 | @@ -1186,7 +1196,7 @@ | ||
220 | |||
221 | /* ignore presses when we're already doing something else. */ | ||
222 | if (range->layout->grab_location != MOUSE_OUTSIDE) | ||
223 | - return FALSE; | ||
224 | + return TRUE; | ||
225 | |||
226 | range->layout->mouse_x = event->x; | ||
227 | range->layout->mouse_y = event->y; | ||
228 | @@ -1364,7 +1374,7 @@ | ||
229 | return TRUE; | ||
230 | } | ||
231 | |||
232 | - return FALSE; | ||
233 | + return TRUE; | ||
234 | } | ||
235 | |||
236 | /** | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/gtklabel-resize-patch b/meta/packages/gtk+/gtk+-2.10.6/gtklabel-resize-patch new file mode 100644 index 0000000000..df29656343 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/gtklabel-resize-patch | |||
@@ -0,0 +1,10 @@ | |||
1 | --- gtk+-2.4.3/gtk/gtklabel.c~ 2004-06-11 13:50:34.000000000 +0100 | ||
2 | +++ gtk+-2.4.3/gtk/gtklabel.c 2004-07-05 13:33:57.000000000 +0100 | ||
3 | @@ -1623,6 +1623,7 @@ | ||
4 | |||
5 | /* We have to clear the layout, fonts etc. may have changed */ | ||
6 | gtk_label_clear_layout (label); | ||
7 | + gtk_widget_queue_resize (GTK_WIDGET (label)); | ||
8 | } | ||
9 | |||
10 | static void | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/hardcoded_libtool.patch b/meta/packages/gtk+/gtk+-2.10.6/hardcoded_libtool.patch new file mode 100644 index 0000000000..bdbdb32f97 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/hardcoded_libtool.patch | |||
@@ -0,0 +1,29 @@ | |||
1 | --- gtk+-2.10.0/configure.in.orig 2006-07-07 09:31:34.000000000 +0100 | ||
2 | +++ gtk+-2.10.0/configure.in 2006-07-07 09:32:49.000000000 +0100 | ||
3 | @@ -370,7 +370,7 @@ | ||
4 | AC_MSG_CHECKING([Whether to write dependencies into .pc files]) | ||
5 | case $enable_explicit_deps in | ||
6 | auto) | ||
7 | - deplibs_check_method=`(./libtool --config; echo eval echo \\$deplibs_check_method) | sh` | ||
8 | + deplibs_check_method=`(./$host_alias-libtool --config; echo eval echo \\$deplibs_check_method) | sh` | ||
9 | if test "x$deplibs_check_method" '!=' xpass_all || test "x$enable_static" = xyes ; then | ||
10 | enable_explicit_deps=yes | ||
11 | else | ||
12 | @@ -768,7 +768,7 @@ | ||
13 | dnl Now we check to see if our libtool supports shared lib deps | ||
14 | dnl (in a rather ugly way even) | ||
15 | if $dynworks; then | ||
16 | - pixbuf_libtool_config="${CONFIG_SHELL-/bin/sh} ./libtool --config" | ||
17 | + pixbuf_libtool_config="${CONFIG_SHELL-/bin/sh} ./$host_alias-libtool --config" | ||
18 | pixbuf_deplibs_check=`$pixbuf_libtool_config | \ | ||
19 | grep '^[[a-z_]]*check[[a-z_]]*_method=[['\''"]]' | \ | ||
20 | sed 's/.*[['\''"]]\(.*\)[['\''"]]$/\1/'` | ||
21 | @@ -1600,7 +1600,7 @@ | ||
22 | # | ||
23 | # We are using gmodule-no-export now, but I'm leaving the stripping | ||
24 | # code in place for now, since pango and atk still require gmodule. | ||
25 | -export_dynamic=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` | ||
26 | +export_dynamic=`(./$host_alias-libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` | ||
27 | if test -n "$export_dynamic"; then | ||
28 | GDK_PIXBUF_DEP_LIBS=`echo $GDK_PIXBUF_DEP_LIBS | sed -e "s/$export_dynamic//"` | ||
29 | GDK_PIXBUF_XLIB_DEP_LIBS=`echo $GDK_PIXBUF_XLIB_DEP_LIBS | sed -e "s/$export_dynamic//"` | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/menu-deactivate.patch b/meta/packages/gtk+/gtk+-2.10.6/menu-deactivate.patch new file mode 100644 index 0000000000..cfb8849e9f --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/menu-deactivate.patch | |||
@@ -0,0 +1,51 @@ | |||
1 | --- gtk+-2.10.0/gtk/gtkmenushell.c.orig 2006-07-05 17:17:34.000000000 +0200 | ||
2 | +++ gtk+-2.10.0/gtk/gtkmenushell.c 2006-07-05 17:19:01.000000000 +0200 | ||
3 | @@ -42,7 +42,7 @@ | ||
4 | #include "gtkintl.h" | ||
5 | #include "gtkalias.h" | ||
6 | |||
7 | -#define MENU_SHELL_TIMEOUT 500 | ||
8 | +#define MENU_SHELL_TIMEOUT 2000 | ||
9 | |||
10 | #define PACK_DIRECTION(m) \ | ||
11 | (GTK_IS_MENU_BAR (m) \ | ||
12 | @@ -203,6 +203,8 @@ | ||
13 | |||
14 | G_DEFINE_TYPE (GtkMenuShell, gtk_menu_shell, GTK_TYPE_CONTAINER) | ||
15 | |||
16 | +static int last_crossing_time; | ||
17 | + | ||
18 | static void | ||
19 | gtk_menu_shell_class_init (GtkMenuShellClass *klass) | ||
20 | { | ||
21 | @@ -517,6 +519,7 @@ | ||
22 | gtk_grab_add (GTK_WIDGET (menu_shell)); | ||
23 | menu_shell->have_grab = TRUE; | ||
24 | menu_shell->active = TRUE; | ||
25 | + last_crossing_time = 0; | ||
26 | } | ||
27 | } | ||
28 | |||
29 | @@ -669,6 +672,13 @@ | ||
30 | menu_shell->activate_time = 0; | ||
31 | deactivate = FALSE; | ||
32 | } | ||
33 | + | ||
34 | + if (last_crossing_time != 0 | ||
35 | + && ((event->time - last_crossing_time) < 500)) | ||
36 | + { | ||
37 | + last_crossing_time = 0; | ||
38 | + deactivate = FALSE; | ||
39 | + } | ||
40 | |||
41 | if (deactivate) | ||
42 | { | ||
43 | @@ -716,6 +726,8 @@ | ||
44 | { | ||
45 | menu_item = gtk_get_event_widget ((GdkEvent*) event); | ||
46 | |||
47 | + last_crossing_time = event->time; | ||
48 | + | ||
49 | if (!menu_item || | ||
50 | (GTK_IS_MENU_ITEM (menu_item) && | ||
51 | !_gtk_menu_item_is_selectable (menu_item))) | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/migration.patch b/meta/packages/gtk+/gtk+-2.10.6/migration.patch new file mode 100644 index 0000000000..4ee786e688 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/migration.patch | |||
@@ -0,0 +1,611 @@ | |||
1 | Index: configure.in | ||
2 | =================================================================== | ||
3 | --- configure.in.orig 2006-10-03 17:54:09.000000000 +0100 | ||
4 | +++ configure.in 2006-10-30 12:58:33.000000000 +0000 | ||
5 | @@ -1529,6 +1529,16 @@ | ||
6 | GTK_EXTRA_CFLAGS="$msnative_struct" | ||
7 | fi | ||
8 | |||
9 | +AC_ARG_ENABLE(display-migration, | ||
10 | + [AC_HELP_STRING([--enable-display-migration], | ||
11 | + [include support for GPE_CHANGE_DISPLAY protocol])], | ||
12 | + enable_migration=yes, enable_migration=no) | ||
13 | +if test "$enable_migration" = "yes"; then | ||
14 | + AC_DEFINE([ENABLE_MIGRATION], 1, [Define if display migration is enabled]) | ||
15 | + GTK_DEP_LIBS="$GTK_DEP_LIBS -lgcrypt" | ||
16 | +fi | ||
17 | +AM_CONDITIONAL(ENABLE_MIGRATION, test $enable_migration = "yes") | ||
18 | + | ||
19 | AC_SUBST(GTK_PACKAGES) | ||
20 | AC_SUBST(GTK_EXTRA_LIBS) | ||
21 | AC_SUBST(GTK_EXTRA_CFLAGS) | ||
22 | Index: gtk/Makefile.am | ||
23 | =================================================================== | ||
24 | --- gtk/Makefile.am.orig 2006-10-02 18:27:53.000000000 +0100 | ||
25 | +++ gtk/Makefile.am 2006-10-30 12:59:14.000000000 +0000 | ||
26 | @@ -589,6 +589,11 @@ | ||
27 | gtkwindow-decorate.c \ | ||
28 | gtkwindow.c \ | ||
29 | $(gtk_clipboard_dnd_c_sources) | ||
30 | + | ||
31 | +if ENABLE_MIGRATION | ||
32 | +gtk_base_c_sources += gtkmigration.c | ||
33 | +endif | ||
34 | + | ||
35 | gtk_c_sources = $(gtk_base_c_sources) | ||
36 | gtk_all_c_sources = $(gtk_base_c_sources) | ||
37 | |||
38 | Index: gtk/gtkmain.c | ||
39 | =================================================================== | ||
40 | --- gtk/gtkmain.c.orig 2006-09-03 06:31:21.000000000 +0100 | ||
41 | +++ gtk/gtkmain.c 2006-10-30 12:56:34.000000000 +0000 | ||
42 | @@ -507,6 +507,10 @@ | ||
43 | _gtk_accel_map_init (); | ||
44 | _gtk_rc_init (); | ||
45 | |||
46 | +#ifdef ENABLE_MIGRATION | ||
47 | + gtk_migration_init (); | ||
48 | +#endif | ||
49 | + | ||
50 | /* Set the 'initialized' flag. | ||
51 | */ | ||
52 | gtk_initialized = TRUE; | ||
53 | Index: gtk/gtkmigration.c | ||
54 | =================================================================== | ||
55 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
56 | +++ gtk/gtkmigration.c 2006-10-30 12:56:34.000000000 +0000 | ||
57 | @@ -0,0 +1,529 @@ | ||
58 | +/* | ||
59 | + * Copyright (C) 2003, 2005 Philip Blundell <philb@gnu.org> | ||
60 | + * | ||
61 | + * This program is free software; you can redistribute it and/or | ||
62 | + * modify it under the terms of the GNU General Public License | ||
63 | + * as published by the Free Software Foundation; either version | ||
64 | + * 2 of the License, or (at your option) any later version. | ||
65 | + */ | ||
66 | + | ||
67 | +#include <stdlib.h> | ||
68 | +#include <ctype.h> | ||
69 | +#include <libintl.h> | ||
70 | +#include <string.h> | ||
71 | +#include <assert.h> | ||
72 | + | ||
73 | +#include <X11/X.h> | ||
74 | +#include <X11/Xlib.h> | ||
75 | +#include <X11/Xatom.h> | ||
76 | + | ||
77 | +#include <gcrypt.h> | ||
78 | + | ||
79 | +#include "gtk.h" | ||
80 | +#include "gdk.h" | ||
81 | +#include "x11/gdkx.h" | ||
82 | + | ||
83 | +#define _(x) gettext(x) | ||
84 | + | ||
85 | +static GdkAtom string_gdkatom, display_change_gdkatom; | ||
86 | +static GdkAtom rsa_challenge_gdkatom; | ||
87 | + | ||
88 | +#define DISPLAY_CHANGE_SUCCESS 0 | ||
89 | +#define DISPLAY_CHANGE_UNABLE_TO_CONNECT 1 | ||
90 | +#define DISPLAY_CHANGE_NO_SUCH_SCREEN 2 | ||
91 | +#define DISPLAY_CHANGE_AUTHENTICATION_BAD 3 | ||
92 | +#define DISPLAY_CHANGE_INDETERMINATE_ERROR 4 | ||
93 | + | ||
94 | +static gboolean no_auth; | ||
95 | + | ||
96 | +static GSList *all_widgets; | ||
97 | + | ||
98 | +static gboolean gtk_migration_initialised; | ||
99 | + | ||
100 | +#define CHALLENGE_LEN 64 | ||
101 | + | ||
102 | +gchar *gtk_migration_auth_challenge_string; | ||
103 | + | ||
104 | +static unsigned char challenge_bytes[CHALLENGE_LEN]; | ||
105 | +static unsigned long challenge_seq; | ||
106 | + | ||
107 | +#define hexbyte(x) ((x) >= 10 ? (x) + 'a' - 10 : (x) + '0') | ||
108 | + | ||
109 | +struct rsa_key | ||
110 | +{ | ||
111 | + gcry_mpi_t n, e, d, p, q, u; | ||
112 | +}; | ||
113 | + | ||
114 | +static gcry_mpi_t | ||
115 | +mpi_from_sexp (gcry_sexp_t r, char *tag) | ||
116 | +{ | ||
117 | + gcry_sexp_t s = gcry_sexp_find_token (r, tag, 0); | ||
118 | + return gcry_sexp_nth_mpi (s, 1, GCRYMPI_FMT_USG); | ||
119 | +} | ||
120 | + | ||
121 | +static char * | ||
122 | +hex_from_mpi (gcry_mpi_t m) | ||
123 | +{ | ||
124 | + char *buf; | ||
125 | + gcry_mpi_aprint (GCRYMPI_FMT_HEX, (void *)&buf, NULL, m); | ||
126 | + return buf; | ||
127 | +} | ||
128 | + | ||
129 | +static void | ||
130 | +gtk_migration_crypt_create_hash (char *display, char *challenge, size_t len, char *result) | ||
131 | +{ | ||
132 | + size_t dlen = strlen (display); | ||
133 | + gchar *buf = g_malloc (dlen + 1 + len); | ||
134 | + strcpy (buf, display); | ||
135 | + memcpy (buf + dlen + 1, challenge, len); | ||
136 | + gcry_md_hash_buffer (GCRY_MD_SHA1, result, buf, len + dlen + 1); | ||
137 | + g_free (buf); | ||
138 | +} | ||
139 | + | ||
140 | +static int | ||
141 | +do_encode_md (const unsigned char *digest, size_t digestlen, int algo, | ||
142 | + unsigned int nbits, gcry_mpi_t *r_val) | ||
143 | +{ | ||
144 | + int nframe = (nbits+7) / 8; | ||
145 | + unsigned char *frame; | ||
146 | + int i, n; | ||
147 | + unsigned char asn[100]; | ||
148 | + size_t asnlen; | ||
149 | + | ||
150 | + asnlen = sizeof(asn); | ||
151 | + if (gcry_md_algo_info (algo, GCRYCTL_GET_ASNOID, asn, &asnlen)) | ||
152 | + return -1; | ||
153 | + | ||
154 | + if (digestlen + asnlen + 4 > nframe ) | ||
155 | + return -1; | ||
156 | + | ||
157 | + /* We encode the MD in this way: | ||
158 | + * | ||
159 | + * 0 1 PAD(n bytes) 0 ASN(asnlen bytes) MD(len bytes) | ||
160 | + * | ||
161 | + * PAD consists of FF bytes. | ||
162 | + */ | ||
163 | + frame = g_malloc (nframe); | ||
164 | + n = 0; | ||
165 | + frame[n++] = 0; | ||
166 | + frame[n++] = 1; /* block type */ | ||
167 | + i = nframe - digestlen - asnlen -3 ; | ||
168 | + assert ( i > 1 ); | ||
169 | + memset ( frame+n, 0xff, i ); n += i; | ||
170 | + frame[n++] = 0; | ||
171 | + memcpy ( frame+n, asn, asnlen ); n += asnlen; | ||
172 | + memcpy ( frame+n, digest, digestlen ); n += digestlen; | ||
173 | + assert ( n == nframe ); | ||
174 | + | ||
175 | + gcry_mpi_scan (r_val, GCRYMPI_FMT_USG, frame, nframe, &nframe); | ||
176 | + g_free (frame); | ||
177 | + return 0; | ||
178 | +} | ||
179 | + | ||
180 | +static gboolean | ||
181 | +gtk_migration_crypt_check_signature (struct rsa_key *k, char *hash, char *sigbuf) | ||
182 | +{ | ||
183 | + gcry_mpi_t mpi, mpi2; | ||
184 | + gcry_sexp_t data, sig, key; | ||
185 | + int rc; | ||
186 | + | ||
187 | + do_encode_md (hash, 20, GCRY_MD_SHA1, 1024, &mpi); | ||
188 | + | ||
189 | + gcry_sexp_build (&data, NULL, "(data (value %m))", mpi); | ||
190 | + | ||
191 | + gcry_mpi_release (mpi); | ||
192 | + | ||
193 | + gcry_sexp_build (&key, NULL, "(public-key (rsa (n %m) (e %m)))", k->n, k->e); | ||
194 | + | ||
195 | + if (gcry_mpi_scan (&mpi2, GCRYMPI_FMT_HEX, sigbuf, 0, NULL)) | ||
196 | + { | ||
197 | + gcry_sexp_release (data); | ||
198 | + return FALSE; | ||
199 | + } | ||
200 | + | ||
201 | + gcry_sexp_build (&sig, NULL, "(sig-val (rsa (s %m)))", mpi2); | ||
202 | + | ||
203 | + rc = gcry_pk_verify (sig, data, key); | ||
204 | + | ||
205 | + gcry_sexp_release (data); | ||
206 | + gcry_sexp_release (key); | ||
207 | + gcry_sexp_release (sig); | ||
208 | + gcry_mpi_release (mpi2); | ||
209 | + | ||
210 | + if (rc) | ||
211 | + return FALSE; | ||
212 | + | ||
213 | + return TRUE; | ||
214 | +} | ||
215 | + | ||
216 | +static void | ||
217 | +gtk_migration_auth_update_challenge (void) | ||
218 | +{ | ||
219 | + int i; | ||
220 | + unsigned char *p; | ||
221 | + | ||
222 | + if (gtk_migration_auth_challenge_string == NULL) | ||
223 | + gtk_migration_auth_challenge_string = g_malloc ((CHALLENGE_LEN * 2) + 9); | ||
224 | + | ||
225 | + p = gtk_migration_auth_challenge_string; | ||
226 | + | ||
227 | + for (i = 0; i < CHALLENGE_LEN; i++) | ||
228 | + { | ||
229 | + *p++ = hexbyte (challenge_bytes[i] >> 4); | ||
230 | + *p++ = hexbyte (challenge_bytes[i] & 15); | ||
231 | + } | ||
232 | + | ||
233 | + sprintf (p, "%08lx", challenge_seq++); | ||
234 | +} | ||
235 | + | ||
236 | +static void | ||
237 | +gtk_migration_auth_generate_challenge (void) | ||
238 | +{ | ||
239 | + gcry_randomize (challenge_bytes, sizeof (challenge_bytes), GCRY_STRONG_RANDOM); | ||
240 | + gtk_migration_auth_update_challenge (); | ||
241 | +} | ||
242 | + | ||
243 | +static struct rsa_key * | ||
244 | +parse_pubkey (char *s) | ||
245 | +{ | ||
246 | + struct rsa_key *r; | ||
247 | + gcry_mpi_t n, e; | ||
248 | + gchar *sp; | ||
249 | + | ||
250 | + sp = strtok (s, " \n"); | ||
251 | + gcry_mpi_scan (&e, GCRYMPI_FMT_HEX, sp, 0, NULL); | ||
252 | + sp = strtok (NULL, " \n"); | ||
253 | + gcry_mpi_scan (&n, GCRYMPI_FMT_HEX, sp, 0, NULL); | ||
254 | + | ||
255 | + r = g_malloc0 (sizeof (struct rsa_key)); | ||
256 | + r->e = e; | ||
257 | + r->n = n; | ||
258 | + return r; | ||
259 | +} | ||
260 | + | ||
261 | +static struct rsa_key * | ||
262 | +lookup_pubkey (u_int32_t id) | ||
263 | +{ | ||
264 | + const gchar *home_dir = g_get_home_dir (); | ||
265 | + gchar *filename = g_strdup_printf ("%s/.gpe/migrate/public", home_dir); | ||
266 | + FILE *fp = fopen (filename, "r"); | ||
267 | + struct rsa_key *r = NULL; | ||
268 | + | ||
269 | + if (fp) | ||
270 | + { | ||
271 | + while (!feof (fp)) | ||
272 | + { | ||
273 | + char buffer[4096]; | ||
274 | + if (fgets (buffer, 4096, fp)) | ||
275 | + { | ||
276 | + char *p; | ||
277 | + u_int32_t this_id = strtoul (buffer, &p, 16); | ||
278 | + if (p != buffer && *p == ' ') | ||
279 | + { | ||
280 | +#ifdef DEBUG | ||
281 | + fprintf (stderr, "found id %x\n", this_id); | ||
282 | +#endif | ||
283 | + if (this_id == id) | ||
284 | + { | ||
285 | + r = parse_pubkey (++p); | ||
286 | + break; | ||
287 | + } | ||
288 | + } | ||
289 | + } | ||
290 | + } | ||
291 | + fclose (fp); | ||
292 | + } | ||
293 | + | ||
294 | + g_free (filename); | ||
295 | + return r; | ||
296 | +} | ||
297 | + | ||
298 | +static void | ||
299 | +free_pubkey (struct rsa_key *k) | ||
300 | +{ | ||
301 | + gcry_mpi_release (k->n); | ||
302 | + gcry_mpi_release (k->e); | ||
303 | + | ||
304 | + g_free (k); | ||
305 | +} | ||
306 | + | ||
307 | +static gboolean | ||
308 | +gtk_migration_auth_validate_request (char *display, char *data) | ||
309 | +{ | ||
310 | + u_int32_t key_id; | ||
311 | + char *ep; | ||
312 | + char *p; | ||
313 | + struct rsa_key *k; | ||
314 | + char hash[20]; | ||
315 | + gboolean rc; | ||
316 | + | ||
317 | + p = strchr (data, ' '); | ||
318 | + if (p == NULL) | ||
319 | + return FALSE; | ||
320 | + *p++ = 0; | ||
321 | + | ||
322 | + key_id = strtoul (data, &ep, 16); | ||
323 | + if (*ep) | ||
324 | + return FALSE; | ||
325 | + | ||
326 | + k = lookup_pubkey (key_id); | ||
327 | + if (k == NULL) | ||
328 | + return FALSE; | ||
329 | + | ||
330 | + gtk_migration_crypt_create_hash (display, gtk_migration_auth_challenge_string, | ||
331 | + strlen (gtk_migration_auth_challenge_string), hash); | ||
332 | + | ||
333 | + rc = gtk_migration_crypt_check_signature (k, hash, p); | ||
334 | + | ||
335 | + free_pubkey (k); | ||
336 | + | ||
337 | + return rc; | ||
338 | +} | ||
339 | + | ||
340 | +static int | ||
341 | +do_change_display (GtkWidget *w, char *display_name) | ||
342 | +{ | ||
343 | + GdkDisplay *newdisplay; | ||
344 | + guint screen_nr = 1; | ||
345 | + guint i; | ||
346 | + | ||
347 | + if (display_name[0] == 0) | ||
348 | + return DISPLAY_CHANGE_INDETERMINATE_ERROR; | ||
349 | + | ||
350 | + i = strlen (display_name) - 1; | ||
351 | + while (i > 0 && isdigit (display_name[i])) | ||
352 | + i--; | ||
353 | + | ||
354 | + if (display_name[i] == '.') | ||
355 | + { | ||
356 | + screen_nr = atoi (display_name + i + 1); | ||
357 | + display_name[i] = 0; | ||
358 | + } | ||
359 | + | ||
360 | + newdisplay = gdk_display_open (display_name); | ||
361 | + if (newdisplay) | ||
362 | + { | ||
363 | + GdkScreen *screen = gdk_display_get_screen (newdisplay, screen_nr); | ||
364 | + if (screen) | ||
365 | + { | ||
366 | + gtk_window_set_screen (GTK_WINDOW (w), screen); | ||
367 | + gdk_display_manager_set_default_display (gdk_display_manager_get (), | ||
368 | + newdisplay); | ||
369 | + return DISPLAY_CHANGE_SUCCESS; | ||
370 | + } | ||
371 | + else | ||
372 | + return DISPLAY_CHANGE_NO_SUCH_SCREEN; | ||
373 | + } | ||
374 | + | ||
375 | + return DISPLAY_CHANGE_UNABLE_TO_CONNECT; | ||
376 | +} | ||
377 | + | ||
378 | +static void | ||
379 | +set_challenge_on_window (GdkWindow *window) | ||
380 | +{ | ||
381 | + gdk_property_change (window, rsa_challenge_gdkatom, string_gdkatom, | ||
382 | + 8, GDK_PROP_MODE_REPLACE, gtk_migration_auth_challenge_string, | ||
383 | + strlen (gtk_migration_auth_challenge_string)); | ||
384 | +} | ||
385 | + | ||
386 | +static void | ||
387 | +update_challenge_on_windows (void) | ||
388 | +{ | ||
389 | + GSList *i; | ||
390 | + | ||
391 | + gtk_migration_auth_update_challenge (); | ||
392 | + | ||
393 | + for (i = all_widgets; i; i = i->next) | ||
394 | + { | ||
395 | + GtkWidget *w = GTK_WIDGET (i->data); | ||
396 | + if (w->window) | ||
397 | + set_challenge_on_window (w->window); | ||
398 | + } | ||
399 | +} | ||
400 | + | ||
401 | +static void | ||
402 | +reset_state (GdkWindow *window) | ||
403 | +{ | ||
404 | + gdk_property_change (window, display_change_gdkatom, string_gdkatom, | ||
405 | + 8, GDK_PROP_MODE_REPLACE, NULL, 0); | ||
406 | +} | ||
407 | + | ||
408 | +static void | ||
409 | +generate_response (GdkDisplay *gdisplay, Display *dpy, Window window, int code) | ||
410 | +{ | ||
411 | + XClientMessageEvent ev; | ||
412 | + Atom atom = gdk_x11_atom_to_xatom_for_display (gdisplay, | ||
413 | + display_change_gdkatom); | ||
414 | + | ||
415 | + memset (&ev, 0, sizeof (ev)); | ||
416 | + | ||
417 | + ev.type = ClientMessage; | ||
418 | + ev.window = window; | ||
419 | + ev.message_type = atom; | ||
420 | + ev.format = 32; | ||
421 | + | ||
422 | + ev.data.l[0] = window; | ||
423 | + ev.data.l[1] = code; | ||
424 | + | ||
425 | + XSendEvent (dpy, DefaultRootWindow (dpy), False, SubstructureNotifyMask, (XEvent *)&ev); | ||
426 | +} | ||
427 | + | ||
428 | +static int | ||
429 | +handle_request (GdkWindow *gwindow, char *prop) | ||
430 | +{ | ||
431 | + GtkWidget *widget; | ||
432 | + char *target, *auth_method, *auth_data; | ||
433 | + char *p; | ||
434 | + | ||
435 | + target = prop; | ||
436 | + auth_method = "NULL"; | ||
437 | + auth_data = NULL; | ||
438 | + | ||
439 | + p = strchr (prop, ' '); | ||
440 | + if (p) | ||
441 | + { | ||
442 | + *p = 0; | ||
443 | + auth_method = ++p; | ||
444 | + | ||
445 | + p = strchr (p, ' '); | ||
446 | + if (p) | ||
447 | + { | ||
448 | + *p = 0; | ||
449 | + auth_data = ++p; | ||
450 | + } | ||
451 | + } | ||
452 | + | ||
453 | + if (no_auth == FALSE) | ||
454 | + { | ||
455 | + if (!strcasecmp (auth_method, "null")) | ||
456 | + return DISPLAY_CHANGE_AUTHENTICATION_BAD; | ||
457 | + else if (!strcasecmp (auth_method, "rsa-sig")) | ||
458 | + { | ||
459 | + if (gtk_migration_auth_validate_request (target, auth_data) == FALSE) | ||
460 | + return DISPLAY_CHANGE_AUTHENTICATION_BAD; | ||
461 | + } | ||
462 | + else | ||
463 | + return DISPLAY_CHANGE_AUTHENTICATION_BAD; | ||
464 | + } | ||
465 | + | ||
466 | + gdk_window_get_user_data (gwindow, (gpointer*) &widget); | ||
467 | + | ||
468 | + if (widget) | ||
469 | + return do_change_display (widget, target); | ||
470 | + | ||
471 | + return DISPLAY_CHANGE_INDETERMINATE_ERROR; | ||
472 | +} | ||
473 | + | ||
474 | +static GdkFilterReturn | ||
475 | +filter_func (GdkXEvent *xevp, GdkEvent *ev, gpointer p) | ||
476 | +{ | ||
477 | + XPropertyEvent *xev = (XPropertyEvent *)xevp; | ||
478 | + | ||
479 | + if (xev->type == PropertyNotify) | ||
480 | + { | ||
481 | + GdkDisplay *gdisplay; | ||
482 | + Atom atom; | ||
483 | + | ||
484 | + gdisplay = gdk_x11_lookup_xdisplay (xev->display); | ||
485 | + if (gdisplay) | ||
486 | + { | ||
487 | + atom = gdk_x11_atom_to_xatom_for_display (gdisplay, display_change_gdkatom); | ||
488 | + | ||
489 | + if (xev->atom == atom) | ||
490 | + { | ||
491 | + GdkWindow *gwindow; | ||
492 | + | ||
493 | + gwindow = gdk_window_lookup_for_display (gdisplay, xev->window); | ||
494 | + | ||
495 | + if (gwindow) | ||
496 | + { | ||
497 | + GdkAtom actual_type; | ||
498 | + gint actual_format; | ||
499 | + gint actual_length; | ||
500 | + unsigned char *prop = NULL; | ||
501 | + | ||
502 | + if (gdk_property_get (gwindow, display_change_gdkatom, string_gdkatom, | ||
503 | + 0, G_MAXLONG, FALSE, &actual_type, &actual_format, | ||
504 | + &actual_length, &prop)) | ||
505 | + { | ||
506 | + if (actual_length != 0) | ||
507 | + { | ||
508 | + if (actual_type == string_gdkatom && actual_length > 8) | ||
509 | + { | ||
510 | + gchar *buf = g_malloc (actual_length + 1); | ||
511 | + int rc; | ||
512 | + | ||
513 | + memcpy (buf, prop, actual_length); | ||
514 | + buf[actual_length] = 0; | ||
515 | + | ||
516 | + rc = handle_request (gwindow, buf); | ||
517 | + | ||
518 | + g_free (buf); | ||
519 | + generate_response (gdisplay, xev->display, xev->window, rc); | ||
520 | + | ||
521 | + if (rc == DISPLAY_CHANGE_SUCCESS) | ||
522 | + update_challenge_on_windows (); | ||
523 | + } | ||
524 | + | ||
525 | + reset_state (gwindow); | ||
526 | + } | ||
527 | + } | ||
528 | + | ||
529 | + if (prop) | ||
530 | + g_free (prop); | ||
531 | + } | ||
532 | + } | ||
533 | + | ||
534 | + return GDK_FILTER_REMOVE; | ||
535 | + } | ||
536 | + } | ||
537 | + | ||
538 | + return GDK_FILTER_CONTINUE; | ||
539 | +} | ||
540 | + | ||
541 | +static void | ||
542 | +unrealize_window (GtkWidget *w) | ||
543 | +{ | ||
544 | + all_widgets = g_slist_remove (all_widgets, w); | ||
545 | +} | ||
546 | + | ||
547 | +void | ||
548 | +gtk_migration_mark_window (GtkWidget *w) | ||
549 | +{ | ||
550 | + if (! gtk_migration_initialised) | ||
551 | + { | ||
552 | + g_warning ("gtk_migration not initialised yet"); | ||
553 | + return; | ||
554 | + } | ||
555 | + | ||
556 | + if (GTK_WIDGET_REALIZED (w)) | ||
557 | + { | ||
558 | + GdkWindow *window = w->window; | ||
559 | + | ||
560 | + gdk_window_add_filter (window, filter_func, NULL); | ||
561 | + | ||
562 | + reset_state (window); | ||
563 | + set_challenge_on_window (window); | ||
564 | + | ||
565 | + all_widgets = g_slist_append (all_widgets, w); | ||
566 | + | ||
567 | + g_signal_connect (G_OBJECT (w), "unrealize", G_CALLBACK (unrealize_window), NULL); | ||
568 | + } | ||
569 | + else | ||
570 | + g_signal_connect (G_OBJECT (w), "realize", G_CALLBACK (gtk_migration_mark_window), NULL); | ||
571 | +} | ||
572 | + | ||
573 | +void | ||
574 | +gtk_migration_init (void) | ||
575 | +{ | ||
576 | + if (getenv ("GPE_DISPLAY_MIGRATION_NO_AUTH") != NULL) | ||
577 | + no_auth = TRUE; | ||
578 | + | ||
579 | + string_gdkatom = gdk_atom_intern ("STRING", FALSE); | ||
580 | + display_change_gdkatom = gdk_atom_intern ("_GPE_DISPLAY_CHANGE", FALSE); | ||
581 | + rsa_challenge_gdkatom = gdk_atom_intern ("_GPE_DISPLAY_CHANGE_RSA_CHALLENGE", FALSE); | ||
582 | + | ||
583 | + gtk_migration_auth_generate_challenge (); | ||
584 | + | ||
585 | + gtk_migration_initialised = TRUE; | ||
586 | +} | ||
587 | Index: gtk/gtkwindow.c | ||
588 | =================================================================== | ||
589 | --- gtk/gtkwindow.c.orig 2006-10-03 16:51:46.000000000 +0100 | ||
590 | +++ gtk/gtkwindow.c 2006-10-30 12:56:34.000000000 +0000 | ||
591 | @@ -50,6 +50,9 @@ | ||
592 | #include "x11/gdkx.h" | ||
593 | #endif | ||
594 | |||
595 | +extern void gtk_migration_mark_window (GtkWidget *w); | ||
596 | + | ||
597 | + | ||
598 | enum { | ||
599 | SET_FOCUS, | ||
600 | FRAME_EVENT, | ||
601 | @@ -823,6 +826,10 @@ | ||
602 | |||
603 | g_signal_connect (window->screen, "composited_changed", | ||
604 | G_CALLBACK (gtk_window_on_composited_changed), window); | ||
605 | + | ||
606 | +#ifdef ENABLE_MIGRATION | ||
607 | + gtk_migration_mark_window (window); | ||
608 | +#endif | ||
609 | } | ||
610 | |||
611 | static void | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/no-demos.patch b/meta/packages/gtk+/gtk+-2.10.6/no-demos.patch new file mode 100644 index 0000000000..0fc4c48d1a --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/no-demos.patch | |||
@@ -0,0 +1,10 @@ | |||
1 | --- gtk+-2.10.1/Makefile.am.orig 2006-08-08 12:37:30.000000000 +0100 | ||
2 | +++ gtk+-2.10.1/Makefile.am 2006-08-08 12:37:48.000000000 +0100 | ||
3 | @@ -1,6 +1,6 @@ | ||
4 | ## Makefile.am for GTK+ | ||
5 | |||
6 | -SRC_SUBDIRS = gdk-pixbuf gdk gtk modules demos tests perf contrib | ||
7 | +SRC_SUBDIRS = gdk-pixbuf gdk gtk modules tests perf contrib | ||
8 | SUBDIRS = po po-properties $(SRC_SUBDIRS) docs m4macros | ||
9 | |||
10 | # require automake 1.4 | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/no-xwc.patch b/meta/packages/gtk+/gtk+-2.10.6/no-xwc.patch new file mode 100644 index 0000000000..affb4a303e --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/no-xwc.patch | |||
@@ -0,0 +1,151 @@ | |||
1 | diff -urNd ../gtk+-2.6.0-r2/gtk+-2.6.0/gdk/x11/gdkdrawable-x11.c gtk+-2.6.0/gdk/x11/gdkdrawable-x11.c | ||
2 | --- ../gtk+-2.6.0-r2/gtk+-2.6.0/gdk/x11/gdkdrawable-x11.c 2004-11-30 14:57:14 +00:00 | ||
3 | +++ gtk+-2.6.0/gdk/x11/gdkdrawable-x11.c 2005-01-02 15:38:06 +00:00 | ||
4 | @@ -576,12 +576,14 @@ | ||
5 | GDK_GC_GET_XGC (gc), x, y, (XChar2b *) text, text_length / 2); | ||
6 | } | ||
7 | } | ||
8 | +#ifdef HAVE_XWC | ||
9 | else if (font->type == GDK_FONT_FONTSET) | ||
10 | { | ||
11 | XFontSet fontset = (XFontSet) GDK_FONT_XFONT (font); | ||
12 | XmbDrawString (xdisplay, impl->xid, | ||
13 | fontset, GDK_GC_GET_XGC (gc), x, y, text, text_length); | ||
14 | } | ||
15 | +#endif | ||
16 | else | ||
17 | g_error("undefined font type\n"); | ||
18 | } | ||
19 | @@ -613,6 +615,7 @@ | ||
20 | GDK_GC_GET_XGC (gc), x, y, text_8bit, text_length); | ||
21 | g_free (text_8bit); | ||
22 | } | ||
23 | +#ifdef HAVE_XWC | ||
24 | else if (font->type == GDK_FONT_FONTSET) | ||
25 | { | ||
26 | if (sizeof(GdkWChar) == sizeof(wchar_t)) | ||
27 | @@ -633,6 +636,7 @@ | ||
28 | g_free (text_wchar); | ||
29 | } | ||
30 | } | ||
31 | +#endif | ||
32 | else | ||
33 | g_error("undefined font type\n"); | ||
34 | } | ||
35 | diff -urNd ../gtk+-2.6.0-r2/gtk+-2.6.0/gdk/x11/gdkfont-x11.c gtk+-2.6.0/gdk/x11/gdkfont-x11.c | ||
36 | --- ../gtk+-2.6.0-r2/gtk+-2.6.0/gdk/x11/gdkfont-x11.c 2004-08-26 01:23:46 +01:00 | ||
37 | +++ gtk+-2.6.0/gdk/x11/gdkfont-x11.c 2005-01-02 15:45:39 +00:00 | ||
38 | @@ -525,10 +525,12 @@ | ||
39 | width = XTextWidth16 (xfont, (XChar2b *) text, text_length / 2); | ||
40 | } | ||
41 | break; | ||
42 | +#ifdef HAVE_XWC | ||
43 | case GDK_FONT_FONTSET: | ||
44 | fontset = (XFontSet) private->xfont; | ||
45 | width = XmbTextEscapement (fontset, text, text_length); | ||
46 | break; | ||
47 | +#endif | ||
48 | default: | ||
49 | width = 0; | ||
50 | } | ||
51 | @@ -578,6 +580,7 @@ | ||
52 | width = 0; | ||
53 | } | ||
54 | break; | ||
55 | +#ifdef HAVE_XWC | ||
56 | case GDK_FONT_FONTSET: | ||
57 | if (sizeof(GdkWChar) == sizeof(wchar_t)) | ||
58 | { | ||
59 | @@ -595,6 +598,7 @@ | ||
60 | g_free (text_wchar); | ||
61 | } | ||
62 | break; | ||
63 | +#endif | ||
64 | default: | ||
65 | width = 0; | ||
66 | } | ||
67 | @@ -667,6 +671,7 @@ | ||
68 | if (descent) | ||
69 | *descent = overall.descent; | ||
70 | break; | ||
71 | +#ifdef HAVE_XWC | ||
72 | case GDK_FONT_FONTSET: | ||
73 | fontset = (XFontSet) private->xfont; | ||
74 | XmbTextExtents (fontset, text, text_length, &ink, &logical); | ||
75 | @@ -681,6 +686,7 @@ | ||
76 | if (descent) | ||
77 | *descent = ink.y + ink.height; | ||
78 | break; | ||
79 | +#endif | ||
80 | } | ||
81 | |||
82 | } | ||
83 | @@ -753,6 +759,7 @@ | ||
84 | *descent = overall.descent; | ||
85 | break; | ||
86 | } | ||
87 | +#ifdef HAVE_XWC | ||
88 | case GDK_FONT_FONTSET: | ||
89 | fontset = (XFontSet) private->xfont; | ||
90 | |||
91 | @@ -780,6 +787,7 @@ | ||
92 | if (descent) | ||
93 | *descent = ink.y + ink.height; | ||
94 | break; | ||
95 | +#endif | ||
96 | } | ||
97 | |||
98 | } | ||
99 | diff -urNd ../gtk+-2.6.0-r2/gtk+-2.6.0/gdk/x11/gdkim-x11.c gtk+-2.6.0/gdk/x11/gdkim-x11.c | ||
100 | --- ../gtk+-2.6.0-r2/gtk+-2.6.0/gdk/x11/gdkim-x11.c 2004-11-17 00:55:10 +00:00 | ||
101 | +++ gtk+-2.6.0/gdk/x11/gdkim-x11.c 2005-01-02 15:42:04 +00:00 | ||
102 | @@ -48,6 +48,7 @@ | ||
103 | void | ||
104 | _gdk_x11_initialize_locale (void) | ||
105 | { | ||
106 | +#ifdef HAVE_XWC | ||
107 | wchar_t result; | ||
108 | gchar *current_locale; | ||
109 | static char *last_locale = NULL; | ||
110 | @@ -93,7 +94,8 @@ | ||
111 | GDK_NOTE (XIM, | ||
112 | g_message ("%s multi-byte string functions.", | ||
113 | gdk_use_mb ? "Using" : "Not using")); | ||
114 | - | ||
115 | +#endif | ||
116 | + | ||
117 | return; | ||
118 | } | ||
119 | |||
120 | @@ -136,6 +138,7 @@ | ||
121 | { | ||
122 | gchar *mbstr; | ||
123 | |||
124 | +#ifdef HAVE_XWC | ||
125 | if (gdk_use_mb) | ||
126 | { | ||
127 | GdkDisplay *display = find_a_display (); | ||
128 | @@ -178,6 +181,7 @@ | ||
129 | XFree (tpr.value); | ||
130 | } | ||
131 | else | ||
132 | +#endif | ||
133 | { | ||
134 | gint length = 0; | ||
135 | gint i; | ||
136 | @@ -210,6 +214,7 @@ | ||
137 | gint | ||
138 | gdk_mbstowcs (GdkWChar *dest, const gchar *src, gint dest_max) | ||
139 | { | ||
140 | +#ifdef HAVE_XWC | ||
141 | if (gdk_use_mb) | ||
142 | { | ||
143 | GdkDisplay *display = find_a_display (); | ||
144 | @@ -242,6 +247,7 @@ | ||
145 | return len_cpy; | ||
146 | } | ||
147 | else | ||
148 | +#endif | ||
149 | { | ||
150 | gint i; | ||
151 | |||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/pangoxft2.10.6.diff b/meta/packages/gtk+/gtk+-2.10.6/pangoxft2.10.6.diff new file mode 100644 index 0000000000..142a9a8e88 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/pangoxft2.10.6.diff | |||
@@ -0,0 +1,2443 @@ | |||
1 | http://mail.gnome.org/archives/performance-list/2006-October/msg00063.html | ||
2 | |||
3 | From: Xan Lópe | ||
4 | To: ext Matt Hoosier | ||
5 | Cc: performance-list gnome org | ||
6 | Subject: Re: [patch] Remove pangocairo from Gtk+ 2.8.20 | ||
7 | Date: Mon, 30 Oct 2006 14:31:56 +0200 | ||
8 | Hi, | ||
9 | |||
10 | I've upgraded your patch against GTK+ 2.10.6, and we are getting great | ||
11 | performance figures compared to GTK+ 2.10.6 with pangocairo too | ||
12 | (basically at the level of GTK+ 2.6.10 again). Right now I'm working on | ||
13 | a python/cairo script to get some nice graphics from a torture test | ||
14 | session with several GTK+s, hope to get it ready soon. | ||
15 | |||
16 | Index: gtk+-2.10.6/configure.in | ||
17 | =================================================================== | ||
18 | --- gtk+-2.10.6.orig/configure.in 2006-10-30 12:59:28.000000000 +0000 | ||
19 | +++ gtk+-2.10.6/configure.in 2006-10-30 12:59:30.000000000 +0000 | ||
20 | @@ -1435,7 +1435,7 @@ | ||
21 | if test "x$gdktarget" = "xwin32"; then | ||
22 | PANGO_PACKAGES="pangowin32 pangocairo" | ||
23 | else | ||
24 | - PANGO_PACKAGES="pango pangocairo" | ||
25 | + PANGO_PACKAGES="pango pangocairo pangoxft" | ||
26 | fi | ||
27 | |||
28 | AC_MSG_CHECKING(Pango flags) | ||
29 | Index: gtk+-2.10.6/gdk/gdkaliasdef.c | ||
30 | =================================================================== | ||
31 | --- gtk+-2.10.6.orig/gdk/gdkaliasdef.c 2006-10-30 12:58:29.000000000 +0000 | ||
32 | +++ gtk+-2.10.6/gdk/gdkaliasdef.c 2006-10-30 12:59:30.000000000 +0000 | ||
33 | @@ -1799,9 +1799,6 @@ | ||
34 | #undef gdk_pango_context_get | ||
35 | extern __typeof (gdk_pango_context_get) gdk_pango_context_get __attribute((alias("IA__gdk_pango_context_get"), visibility("default"))); | ||
36 | |||
37 | -#undef gdk_pango_context_get_for_screen | ||
38 | -extern __typeof (gdk_pango_context_get_for_screen) gdk_pango_context_get_for_screen __attribute((alias("IA__gdk_pango_context_get_for_screen"), visibility("default"))); | ||
39 | - | ||
40 | #ifndef GDK_DISABLE_DEPRECATED | ||
41 | #undef gdk_pango_context_set_colormap | ||
42 | extern __typeof (gdk_pango_context_set_colormap) gdk_pango_context_set_colormap __attribute((alias("IA__gdk_pango_context_set_colormap"), visibility("default"))); | ||
43 | @@ -1836,6 +1833,13 @@ | ||
44 | |||
45 | #endif | ||
46 | #endif | ||
47 | +#if IN_HEADER(__GDK_PANGO_H__) | ||
48 | +#if IN_FILE(__GDK_PANGO_X11_C__) | ||
49 | +#undef gdk_pango_context_get_for_screen | ||
50 | +extern __typeof (gdk_pango_context_get_for_screen) gdk_pango_context_get_for_screen __attribute((alias("IA__gdk_pango_context_get_for_screen"), visibility("default"))); | ||
51 | + | ||
52 | +#endif | ||
53 | +#endif | ||
54 | #if IN_HEADER(__GDK_PIXBUF_H__) | ||
55 | #if IN_FILE(__GDK_PIXBUF_DRAWABLE_C__) | ||
56 | #undef gdk_pixbuf_get_from_drawable | ||
57 | Index: gtk+-2.10.6/gdk/gdkalias.h | ||
58 | =================================================================== | ||
59 | --- gtk+-2.10.6.orig/gdk/gdkalias.h 2006-10-30 12:58:29.000000000 +0000 | ||
60 | +++ gtk+-2.10.6/gdk/gdkalias.h 2006-10-30 12:59:30.000000000 +0000 | ||
61 | @@ -1796,9 +1796,6 @@ | ||
62 | extern __typeof (gdk_pango_context_get) IA__gdk_pango_context_get __attribute((visibility("hidden"))); | ||
63 | #define gdk_pango_context_get IA__gdk_pango_context_get | ||
64 | |||
65 | -extern __typeof (gdk_pango_context_get_for_screen) IA__gdk_pango_context_get_for_screen __attribute((visibility("hidden"))); | ||
66 | -#define gdk_pango_context_get_for_screen IA__gdk_pango_context_get_for_screen | ||
67 | - | ||
68 | #ifndef GDK_DISABLE_DEPRECATED | ||
69 | extern __typeof (gdk_pango_context_set_colormap) IA__gdk_pango_context_set_colormap __attribute((visibility("hidden"))); | ||
70 | #define gdk_pango_context_set_colormap IA__gdk_pango_context_set_colormap | ||
71 | @@ -1833,6 +1830,13 @@ | ||
72 | |||
73 | #endif | ||
74 | #endif | ||
75 | +#if IN_HEADER(__GDK_PANGO_H__) | ||
76 | +#if IN_FILE(__GDK_PANGO_X11_C__) | ||
77 | +extern __typeof (gdk_pango_context_get_for_screen) IA__gdk_pango_context_get_for_screen __attribute((visibility("hidden"))); | ||
78 | +#define gdk_pango_context_get_for_screen IA__gdk_pango_context_get_for_screen | ||
79 | + | ||
80 | +#endif | ||
81 | +#endif | ||
82 | #if IN_HEADER(__GDK_PIXBUF_H__) | ||
83 | #if IN_FILE(__GDK_PIXBUF_DRAWABLE_C__) | ||
84 | extern __typeof (gdk_pixbuf_get_from_drawable) IA__gdk_pixbuf_get_from_drawable __attribute((visibility("hidden"))); | ||
85 | Index: gtk+-2.10.6/gdk/gdkdraw.c | ||
86 | =================================================================== | ||
87 | --- gtk+-2.10.6.orig/gdk/gdkdraw.c 2006-10-30 12:58:29.000000000 +0000 | ||
88 | +++ gtk+-2.10.6/gdk/gdkdraw.c 2006-10-30 12:59:30.000000000 +0000 | ||
89 | @@ -909,9 +909,9 @@ | ||
90 | { | ||
91 | g_return_if_fail (GDK_IS_DRAWABLE (drawable)); | ||
92 | g_return_if_fail (GDK_IS_GC (gc)); | ||
93 | - | ||
94 | - real_draw_glyphs (drawable, gc, NULL, font, | ||
95 | - x, y, glyphs); | ||
96 | + | ||
97 | + | ||
98 | + GDK_DRAWABLE_GET_CLASS (drawable)->draw_glyphs (drawable, gc, font, x, y, glyphs); | ||
99 | } | ||
100 | |||
101 | /** | ||
102 | @@ -949,8 +949,9 @@ | ||
103 | g_return_if_fail (GDK_IS_DRAWABLE (drawable)); | ||
104 | g_return_if_fail (GDK_IS_GC (gc)); | ||
105 | |||
106 | - real_draw_glyphs (drawable, gc, matrix, font, | ||
107 | - x / PANGO_SCALE, y / PANGO_SCALE, glyphs); | ||
108 | + if (GDK_DRAWABLE_GET_CLASS (drawable)->draw_glyphs_transformed) | ||
109 | + GDK_DRAWABLE_GET_CLASS (drawable)->draw_glyphs_transformed (drawable, gc, matrix, | ||
110 | + font, x, y, glyphs); | ||
111 | } | ||
112 | |||
113 | /** | ||
114 | @@ -974,28 +975,12 @@ | ||
115 | GdkTrapezoid *trapezoids, | ||
116 | gint n_trapezoids) | ||
117 | { | ||
118 | - cairo_t *cr; | ||
119 | - int i; | ||
120 | - | ||
121 | g_return_if_fail (GDK_IS_DRAWABLE (drawable)); | ||
122 | g_return_if_fail (GDK_IS_GC (gc)); | ||
123 | g_return_if_fail (n_trapezoids == 0 || trapezoids != NULL); | ||
124 | |||
125 | - cr = gdk_cairo_create (drawable); | ||
126 | - _gdk_gc_update_context (gc, cr, NULL, NULL, TRUE); | ||
127 | - | ||
128 | - for (i = 0; i < n_trapezoids; i++) | ||
129 | - { | ||
130 | - cairo_move_to (cr, trapezoids[i].x11, trapezoids[i].y1); | ||
131 | - cairo_line_to (cr, trapezoids[i].x21, trapezoids[i].y1); | ||
132 | - cairo_line_to (cr, trapezoids[i].x22, trapezoids[i].y2); | ||
133 | - cairo_line_to (cr, trapezoids[i].x21, trapezoids[i].y2); | ||
134 | - cairo_close_path (cr); | ||
135 | - } | ||
136 | - | ||
137 | - cairo_fill (cr); | ||
138 | - | ||
139 | - cairo_destroy (cr); | ||
140 | + GDK_DRAWABLE_GET_CLASS (drawable)->draw_trapezoids (drawable, gc, | ||
141 | + trapezoids, n_trapezoids); | ||
142 | } | ||
143 | |||
144 | /** | ||
145 | Index: gtk+-2.10.6/gdk/gdkpango.c | ||
146 | =================================================================== | ||
147 | --- gtk+-2.10.6.orig/gdk/gdkpango.c 2006-10-30 12:58:29.000000000 +0000 | ||
148 | +++ gtk+-2.10.6/gdk/gdkpango.c 2006-10-30 12:59:30.000000000 +0000 | ||
149 | @@ -50,19 +50,34 @@ | ||
150 | GdkBitmap *stipple[MAX_RENDER_PART + 1]; | ||
151 | gboolean embossed; | ||
152 | |||
153 | - cairo_t *cr; | ||
154 | - PangoRenderPart last_part; | ||
155 | + /* When switching between the normal and shadow copies when | ||
156 | + * drawing shadows we can get unexpected recursion into the | ||
157 | + * drawing functions; the 'in_emboss' flag guards against that. | ||
158 | + */ | ||
159 | + gboolean in_emboss; | ||
160 | |||
161 | /* Current target */ | ||
162 | GdkDrawable *drawable; | ||
163 | GdkGC *base_gc; | ||
164 | |||
165 | gboolean gc_changed; | ||
166 | + | ||
167 | + /* Cached GC, derived from base_gc */ | ||
168 | + GdkGC *gc; | ||
169 | + PangoColor gc_color; | ||
170 | + gboolean gc_color_set; | ||
171 | + GdkBitmap *gc_stipple; | ||
172 | + | ||
173 | + /* we accumulate trapezoids for the same PangoRenderPart */ | ||
174 | + GArray *trapezoids; | ||
175 | + PangoRenderPart trapezoid_part; | ||
176 | }; | ||
177 | |||
178 | static PangoAttrType gdk_pango_attr_stipple_type; | ||
179 | static PangoAttrType gdk_pango_attr_embossed_type; | ||
180 | |||
181 | +static void flush_trapezoids (GdkPangoRenderer *gdk_renderer); | ||
182 | + | ||
183 | enum { | ||
184 | PROP_0, | ||
185 | PROP_SCREEN | ||
186 | @@ -77,6 +92,10 @@ | ||
187 | GdkPangoRendererPrivate *priv = gdk_renderer->priv; | ||
188 | int i; | ||
189 | |||
190 | + if (priv->gc) | ||
191 | + g_object_unref (priv->gc); | ||
192 | + if (priv->gc_stipple) | ||
193 | + g_object_unref (priv->gc_stipple); | ||
194 | if (priv->base_gc) | ||
195 | g_object_unref (priv->base_gc); | ||
196 | if (priv->drawable) | ||
197 | @@ -86,6 +105,8 @@ | ||
198 | if (priv->stipple[i]) | ||
199 | g_object_unref (priv->stipple[i]); | ||
200 | |||
201 | + g_array_free (priv->trapezoids, TRUE); | ||
202 | + | ||
203 | G_OBJECT_CLASS (gdk_pango_renderer_parent_class)->finalize (object); | ||
204 | } | ||
205 | |||
206 | @@ -112,25 +133,6 @@ | ||
207 | return object; | ||
208 | } | ||
209 | |||
210 | -/* Adjusts matrix and color for the renderer to draw the secondary | ||
211 | - * "shadow" copy for embossed text */ | ||
212 | -static void | ||
213 | -emboss_context (cairo_t *cr) | ||
214 | -{ | ||
215 | - cairo_matrix_t tmp_matrix; | ||
216 | - | ||
217 | - /* The gymnastics here to adjust the matrix are because we want | ||
218 | - * to offset by +1,+1 in device-space, not in user-space, | ||
219 | - * so we can't just draw the layout at x + 1, y + 1 | ||
220 | - */ | ||
221 | - cairo_get_matrix (cr, &tmp_matrix); | ||
222 | - tmp_matrix.x0 += 1.0; | ||
223 | - tmp_matrix.y0 += 1.0; | ||
224 | - cairo_set_matrix (cr, &tmp_matrix); | ||
225 | - | ||
226 | - cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); | ||
227 | -} | ||
228 | - | ||
229 | static inline gboolean | ||
230 | color_equal (PangoColor *c1, PangoColor *c2) | ||
231 | { | ||
232 | @@ -146,74 +148,154 @@ | ||
233 | return FALSE; | ||
234 | } | ||
235 | |||
236 | -static cairo_t * | ||
237 | -get_cairo_context (GdkPangoRenderer *gdk_renderer, | ||
238 | - PangoRenderPart part) | ||
239 | +/* Adjusts matrix and color for the renderer to draw the secondar | ||
240 | + * "shadow" copy for embossed text */ | ||
241 | +static void | ||
242 | +emboss_renderer (PangoRenderer *renderer, | ||
243 | + PangoRenderPart part, | ||
244 | + PangoMatrix **save_matrix, | ||
245 | + PangoColor **save_color) | ||
246 | +{ | ||
247 | + GdkPangoRendererPrivate *priv = GDK_PANGO_RENDERER(renderer)->priv; | ||
248 | + static const PangoColor white = { 0xffff, 0xffff, 0xffff }; | ||
249 | + PangoMatrix tmp_matrix = PANGO_MATRIX_INIT; | ||
250 | + | ||
251 | + priv->in_emboss = TRUE; | ||
252 | + | ||
253 | + *save_color = pango_renderer_get_color (renderer, part); | ||
254 | + if (*save_color) | ||
255 | + *save_color = pango_color_copy (*save_color); | ||
256 | + | ||
257 | + *save_matrix = renderer->matrix; | ||
258 | + if (*save_matrix) | ||
259 | + { | ||
260 | + *save_matrix = pango_matrix_copy (*save_matrix); | ||
261 | + tmp_matrix = **save_matrix; | ||
262 | + } | ||
263 | + | ||
264 | + /* The gymnastics here to adjust the matrix are because we want | ||
265 | + * to offset by +1,+1 in device-space, not in user-space, | ||
266 | + * so we can't just draw the layout at x + 1, y + 1 | ||
267 | + */ | ||
268 | + tmp_matrix.x0 += 1; | ||
269 | + tmp_matrix.y0 += 1; | ||
270 | + | ||
271 | + pango_renderer_set_matrix (renderer, &tmp_matrix); | ||
272 | + pango_renderer_set_color (renderer, part, &white); | ||
273 | +} | ||
274 | + | ||
275 | +/* Restores from emboss_renderer() */ | ||
276 | +static void | ||
277 | +unemboss_renderer (PangoRenderer *renderer, | ||
278 | + PangoRenderPart part, | ||
279 | + PangoMatrix **save_matrix, | ||
280 | + PangoColor **save_color) | ||
281 | +{ | ||
282 | + GdkPangoRendererPrivate *priv = GDK_PANGO_RENDERER(renderer)->priv; | ||
283 | + pango_renderer_set_matrix (renderer, *save_matrix); | ||
284 | + pango_renderer_set_color (renderer, part, *save_color); | ||
285 | + | ||
286 | + if (*save_matrix) | ||
287 | + pango_matrix_free (*save_matrix); | ||
288 | + if (*save_color) | ||
289 | + pango_color_free (*save_color); | ||
290 | + | ||
291 | + priv->in_emboss = FALSE; | ||
292 | +} | ||
293 | + | ||
294 | +/* Gets the GC for drawing @part. This make involve copying the base GC | ||
295 | + * for the renderer, in which case we keep a one-GC cache. */ | ||
296 | +static GdkGC * | ||
297 | +get_gc (GdkPangoRenderer *gdk_renderer, | ||
298 | + PangoRenderPart part) | ||
299 | { | ||
300 | PangoRenderer *renderer = PANGO_RENDERER (gdk_renderer); | ||
301 | + PangoColor *color; | ||
302 | + GdkBitmap *stipple; | ||
303 | GdkPangoRendererPrivate *priv = gdk_renderer->priv; | ||
304 | |||
305 | - if (!priv->cr) | ||
306 | + color = pango_renderer_get_color (renderer, part); | ||
307 | + | ||
308 | + if (part <= MAX_RENDER_PART) | ||
309 | + stipple = priv->stipple[part]; | ||
310 | + else | ||
311 | + stipple = NULL; | ||
312 | + | ||
313 | + if (!color && !stipple) /* nothing override, use base_gc */ | ||
314 | + return priv->base_gc; | ||
315 | + else | ||
316 | { | ||
317 | - const PangoMatrix *matrix; | ||
318 | + gboolean new_stipple = FALSE; | ||
319 | + gboolean new_color = FALSE; | ||
320 | |||
321 | - priv->cr = gdk_cairo_create (priv->drawable); | ||
322 | + if (stipple != priv->gc_stipple) | ||
323 | + new_stipple = TRUE; | ||
324 | |||
325 | - matrix = pango_renderer_get_matrix (renderer); | ||
326 | - if (matrix) | ||
327 | + if ((priv->gc_color_set && !color) || | ||
328 | + (!priv->gc_color_set && color) || | ||
329 | + priv->gc_color.red != color->red || | ||
330 | + priv->gc_color.green != color->green || | ||
331 | + priv->gc_color.blue != color->blue) | ||
332 | + new_color = TRUE; | ||
333 | + | ||
334 | + if (!priv->gc) | ||
335 | { | ||
336 | - cairo_matrix_t cairo_matrix; | ||
337 | - | ||
338 | - cairo_matrix_init (&cairo_matrix, | ||
339 | - matrix->xx, matrix->yx, | ||
340 | - matrix->xy, matrix->yy, | ||
341 | - matrix->x0, matrix->y0); | ||
342 | - cairo_set_matrix (priv->cr, &cairo_matrix); | ||
343 | + priv->gc = gdk_gc_new (priv->drawable); | ||
344 | + gdk_gc_copy (priv->gc, priv->base_gc); | ||
345 | + } | ||
346 | + else if (new_color && priv->gc_color_set && !color) | ||
347 | + { | ||
348 | + /* We have to recopy the original GC onto the cached GC | ||
349 | + * to get the default color */ | ||
350 | + new_stipple = TRUE; | ||
351 | + gdk_gc_copy (priv->gc, priv->base_gc); | ||
352 | + } | ||
353 | + else if (new_stipple && priv->gc_stipple && !stipple) | ||
354 | + { | ||
355 | + /* Similarly, we need to make a new copy to restore to the | ||
356 | + * default stipple state (the caller may have set a stipple | ||
357 | + * on the GC, and even if not, gdk_gc_set_stipple (gc, NULL) | ||
358 | + * doesn't work currently to restore to the default X stipple) */ | ||
359 | + new_color = TRUE; | ||
360 | + gdk_gc_copy (priv->gc, priv->base_gc); | ||
361 | } | ||
362 | - } | ||
363 | - | ||
364 | - if (part != priv->last_part) | ||
365 | - { | ||
366 | - PangoColor *pango_color; | ||
367 | - GdkColor *color; | ||
368 | - GdkColor tmp_color; | ||
369 | - gboolean changed; | ||
370 | |||
371 | - pango_color = pango_renderer_get_color (renderer, part); | ||
372 | - | ||
373 | - if (priv->last_part != -1) | ||
374 | - changed = priv->gc_changed || | ||
375 | - priv->stipple[priv->last_part] != priv->stipple[part] || | ||
376 | - !color_equal (pango_color, | ||
377 | - pango_renderer_get_color (renderer, priv->last_part)); | ||
378 | - else | ||
379 | - changed = TRUE; | ||
380 | - | ||
381 | - if (changed) | ||
382 | + if (new_color) | ||
383 | { | ||
384 | - if (pango_color) | ||
385 | + if (color) | ||
386 | { | ||
387 | - tmp_color.red = pango_color->red; | ||
388 | - tmp_color.green = pango_color->green; | ||
389 | - tmp_color.blue = pango_color->blue; | ||
390 | + GdkColor gdk_color; | ||
391 | + | ||
392 | + gdk_color.red = color->red; | ||
393 | + gdk_color.green = color->green; | ||
394 | + gdk_color.blue = color->blue; | ||
395 | |||
396 | - color = &tmp_color; | ||
397 | + gdk_gc_set_rgb_fg_color (priv->gc, &gdk_color); | ||
398 | + | ||
399 | + priv->gc_color = *color; | ||
400 | + priv->gc_color_set = TRUE; | ||
401 | } | ||
402 | else | ||
403 | - color = NULL; | ||
404 | + priv->gc_color_set = FALSE; | ||
405 | + } | ||
406 | |||
407 | - _gdk_gc_update_context (priv->base_gc, | ||
408 | - priv->cr, | ||
409 | - color, | ||
410 | - priv->stipple[part], | ||
411 | - priv->gc_changed); | ||
412 | + if (new_stipple) | ||
413 | + { | ||
414 | + if (priv->gc_stipple) | ||
415 | + g_object_unref (priv->gc_stipple); | ||
416 | + | ||
417 | + if (stipple) | ||
418 | + { | ||
419 | + gdk_gc_set_stipple (priv->gc, stipple); | ||
420 | + gdk_gc_set_fill (priv->gc, GDK_STIPPLED); | ||
421 | + priv->gc_stipple = g_object_ref (stipple); | ||
422 | + } | ||
423 | + else | ||
424 | + priv->gc_stipple = NULL; | ||
425 | } | ||
426 | |||
427 | - priv->last_part = part; | ||
428 | - priv->gc_changed = FALSE; | ||
429 | + return priv->gc; | ||
430 | } | ||
431 | - | ||
432 | - return priv->cr; | ||
433 | } | ||
434 | |||
435 | static void | ||
436 | @@ -225,133 +307,78 @@ | ||
437 | { | ||
438 | GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer); | ||
439 | GdkPangoRendererPrivate *priv = gdk_renderer->priv; | ||
440 | - cairo_t *cr; | ||
441 | |||
442 | - cr = get_cairo_context (gdk_renderer, | ||
443 | - PANGO_RENDER_PART_FOREGROUND); | ||
444 | + flush_trapezoids (gdk_renderer); | ||
445 | |||
446 | - if (priv->embossed) | ||
447 | + if (!priv->in_emboss && priv->embossed) | ||
448 | { | ||
449 | - cairo_save (cr); | ||
450 | - emboss_context (cr); | ||
451 | - cairo_move_to (cr, (double)x / PANGO_SCALE, (double)y / PANGO_SCALE); | ||
452 | - pango_cairo_show_glyph_string (cr, font, glyphs); | ||
453 | - cairo_restore (cr); | ||
454 | - } | ||
455 | - | ||
456 | - cairo_move_to (cr, (double)x / PANGO_SCALE, (double)y / PANGO_SCALE); | ||
457 | - pango_cairo_show_glyph_string (cr, font, glyphs); | ||
458 | -} | ||
459 | - | ||
460 | -/* Draws an error underline that looks like one of: | ||
461 | - * H E H | ||
462 | - * /\ /\ /\ /\ /\ - | ||
463 | - * A/ \ / \ / \ A/ \ / \ | | ||
464 | - * \ \ / \ / /D \ \ / \ | | ||
465 | - * \ \/ C \/ / \ \/ C \ | height = HEIGHT_SQUARES * square | ||
466 | - * \ /\ F / \ F /\ \ | | ||
467 | - * \ / \ / \ / \ \G | | ||
468 | - * \ / \ / \ / \ / | | ||
469 | - * \/ \/ \/ \/ - | ||
470 | - * B B | ||
471 | - * |----| | ||
472 | - * unit_width = (HEIGHT_SQUARES - 1) * square | ||
473 | - * | ||
474 | - * The x, y, width, height passed in give the desired bounding box; | ||
475 | - * x/width are adjusted to make the underline a integer number of units | ||
476 | - * wide. | ||
477 | - */ | ||
478 | -#define HEIGHT_SQUARES 2.5 | ||
479 | + PangoMatrix *save_matrix; | ||
480 | + PangoColor *save_color; | ||
481 | |||
482 | -/* Cut-and-pasted between here and pango/pango/pangocairo-render.c */ | ||
483 | + emboss_renderer (renderer, PANGO_RENDER_PART_FOREGROUND, &save_matrix, &save_color); | ||
484 | + gdk_draw_glyphs_transformed (priv->drawable, | ||
485 | + get_gc (gdk_renderer, PANGO_RENDER_PART_FOREGROUND), | ||
486 | + renderer->matrix, font, x, y, glyphs); | ||
487 | + unemboss_renderer (renderer, PANGO_RENDER_PART_FOREGROUND, &save_matrix, &save_color); | ||
488 | + } | ||
489 | + | ||
490 | + gdk_draw_glyphs_transformed (priv->drawable, | ||
491 | + get_gc (gdk_renderer, PANGO_RENDER_PART_FOREGROUND), | ||
492 | + renderer->matrix, font, x, y, glyphs); | ||
493 | +} | ||
494 | + | ||
495 | +/* Outputs any pending trapezoids, we do this when the part or | ||
496 | + * part color changes, when we are about to draw text, etc. */ | ||
497 | static void | ||
498 | -draw_error_underline (cairo_t *cr, | ||
499 | - double x, | ||
500 | - double y, | ||
501 | - double width, | ||
502 | - double height) | ||
503 | -{ | ||
504 | - double square = height / HEIGHT_SQUARES; | ||
505 | - double unit_width = (HEIGHT_SQUARES - 1) * square; | ||
506 | - int width_units = (width + unit_width / 2) / unit_width; | ||
507 | - double y_top, y_bottom; | ||
508 | - int i; | ||
509 | +flush_trapezoids (GdkPangoRenderer *gdk_renderer) | ||
510 | +{ | ||
511 | + GdkPangoRendererPrivate *priv = gdk_renderer->priv; | ||
512 | |||
513 | - x += (width - width_units * unit_width) / 2; | ||
514 | - width = width_units * unit_width; | ||
515 | + if (!priv->trapezoids || priv->trapezoids->len == 0) | ||
516 | + return; | ||
517 | |||
518 | - y_top = y; | ||
519 | - y_bottom = y + height; | ||
520 | - | ||
521 | - /* Bottom of squiggle */ | ||
522 | - cairo_move_to (cr, x - square / 2, y_top + square / 2); /* A */ | ||
523 | - for (i = 0; i < width_units; i += 2) | ||
524 | - { | ||
525 | - double x_middle = x + (i + 1) * unit_width; | ||
526 | - double x_right = x + (i + 2) * unit_width; | ||
527 | - | ||
528 | - cairo_line_to (cr, x_middle, y_bottom); /* B */ | ||
529 | - | ||
530 | - if (i + 1 == width_units) | ||
531 | - /* Nothing */; | ||
532 | - else if (i + 2 == width_units) | ||
533 | - cairo_line_to (cr, x_right + square / 2, y_top + square / 2); /* D */ | ||
534 | - else | ||
535 | - cairo_line_to (cr, x_right, y_top + square); /* C */ | ||
536 | - } | ||
537 | - | ||
538 | - /* Top of squiggle */ | ||
539 | - for (i -= 2; i >= 0; i -= 2) | ||
540 | - { | ||
541 | - double x_left = x + i * unit_width; | ||
542 | - double x_middle = x + (i + 1) * unit_width; | ||
543 | - double x_right = x + (i + 2) * unit_width; | ||
544 | - | ||
545 | - if (i + 1 == width_units) | ||
546 | - cairo_line_to (cr, x_middle + square / 2, y_bottom - square / 2); /* G */ | ||
547 | - else { | ||
548 | - if (i + 2 == width_units) | ||
549 | - cairo_line_to (cr, x_right, y_top); /* E */ | ||
550 | - cairo_line_to (cr, x_middle, y_bottom - square); /* F */ | ||
551 | - } | ||
552 | - | ||
553 | - cairo_line_to (cr, x_left, y_top); /* H */ | ||
554 | - } | ||
555 | + gdk_draw_trapezoids (priv->drawable, | ||
556 | + get_gc (gdk_renderer, priv->trapezoid_part), | ||
557 | + (GdkTrapezoid *)priv->trapezoids->data, | ||
558 | + priv->trapezoids->len); | ||
559 | |||
560 | - cairo_close_path (cr); | ||
561 | - cairo_fill (cr); | ||
562 | + g_array_set_size (priv->trapezoids, 0); | ||
563 | } | ||
564 | |||
565 | +/* Draws a single trapezoid ... we don't draw it immediately, but rather | ||
566 | + * cache it to join together with other trapezoids that form part of the | ||
567 | + * same logical shape */ | ||
568 | static void | ||
569 | -gdk_pango_renderer_draw_rectangle (PangoRenderer *renderer, | ||
570 | - PangoRenderPart part, | ||
571 | - int x, | ||
572 | - int y, | ||
573 | - int width, | ||
574 | - int height) | ||
575 | +gdk_pango_renderer_draw_trapezoid (PangoRenderer *renderer, | ||
576 | + PangoRenderPart part, | ||
577 | + double y1, | ||
578 | + double x11, | ||
579 | + double x21, | ||
580 | + double y2, | ||
581 | + double x12, | ||
582 | + double x22) | ||
583 | { | ||
584 | GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer); | ||
585 | - GdkPangoRendererPrivate *priv = gdk_renderer->priv; | ||
586 | - cairo_t *cr; | ||
587 | - | ||
588 | - cr = get_cairo_context (gdk_renderer, part); | ||
589 | - | ||
590 | - if (priv->embossed && part != PANGO_RENDER_PART_BACKGROUND) | ||
591 | - { | ||
592 | - cairo_save (cr); | ||
593 | - emboss_context (cr); | ||
594 | - cairo_rectangle (cr, | ||
595 | - (double)x / PANGO_SCALE, (double)y / PANGO_SCALE, | ||
596 | - (double)width / PANGO_SCALE, (double)height / PANGO_SCALE); | ||
597 | + GdkTrapezoid trap; | ||
598 | |||
599 | - cairo_fill (cr); | ||
600 | - cairo_restore (cr); | ||
601 | - } | ||
602 | + if (!gdk_renderer->priv->trapezoids) | ||
603 | + gdk_renderer->priv->trapezoids = g_array_new (FALSE, FALSE, | ||
604 | + sizeof (GdkTrapezoid)); | ||
605 | + | ||
606 | + if (gdk_renderer->priv->trapezoids->len > 0 && | ||
607 | + gdk_renderer->priv->trapezoid_part != part) | ||
608 | + flush_trapezoids (gdk_renderer); | ||
609 | + | ||
610 | + gdk_renderer->priv->trapezoid_part = part; | ||
611 | + | ||
612 | + trap.y1 = y1; | ||
613 | + trap.x11 = x11 / 2; | ||
614 | + trap.x21 = x21; | ||
615 | + trap.y2 = y2; | ||
616 | + trap.x12 = x12; | ||
617 | + trap.x22 = x22; | ||
618 | |||
619 | - cairo_rectangle (cr, | ||
620 | - (double)x / PANGO_SCALE, (double)y / PANGO_SCALE, | ||
621 | - (double)width / PANGO_SCALE, (double)height / PANGO_SCALE); | ||
622 | - cairo_fill (cr); | ||
623 | + g_array_append_val (gdk_renderer->priv->trapezoids, trap); | ||
624 | } | ||
625 | |||
626 | static void | ||
627 | @@ -363,23 +390,51 @@ | ||
628 | { | ||
629 | GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer); | ||
630 | GdkPangoRendererPrivate *priv = gdk_renderer->priv; | ||
631 | - cairo_t *cr; | ||
632 | - | ||
633 | - cr = get_cairo_context (gdk_renderer, PANGO_RENDER_PART_UNDERLINE); | ||
634 | - | ||
635 | - if (priv->embossed) | ||
636 | + | ||
637 | + if (!priv->in_emboss && priv->embossed) | ||
638 | { | ||
639 | - cairo_save (cr); | ||
640 | - emboss_context (cr); | ||
641 | - draw_error_underline (cr, | ||
642 | - (double)x / PANGO_SCALE, (double)y / PANGO_SCALE, | ||
643 | - (double)width / PANGO_SCALE, (double)height / PANGO_SCALE); | ||
644 | - cairo_restore (cr); | ||
645 | + PangoMatrix *save_matrix; | ||
646 | + PangoColor *save_color; | ||
647 | + | ||
648 | + emboss_renderer (renderer, PANGO_RENDER_PART_UNDERLINE, &save_matrix, &save_color); | ||
649 | + PANGO_RENDERER_CLASS (gdk_pango_renderer_parent_class)->draw_error_underline (renderer, | ||
650 | + x, y, width, height); | ||
651 | + unemboss_renderer (renderer, PANGO_RENDER_PART_UNDERLINE, &save_matrix, &save_color); | ||
652 | } | ||
653 | |||
654 | - draw_error_underline (cr, | ||
655 | - (double)x / PANGO_SCALE, (double)y / PANGO_SCALE, | ||
656 | - (double)width / PANGO_SCALE, (double)height / PANGO_SCALE); | ||
657 | + PANGO_RENDERER_CLASS (gdk_pango_renderer_parent_class)->draw_error_underline (renderer, | ||
658 | + x, y, width, height); | ||
659 | +} | ||
660 | + | ||
661 | +/* We can't handle embossing at the level of trapezoids, because when an | ||
662 | + * underline is split into multiple trapezoids, the normal and shadow | ||
663 | + * trapezoids will be drawn mixed together. Instead, we have to emboss | ||
664 | + * and entire rectangle or error underline | ||
665 | + */ | ||
666 | +static void | ||
667 | +gdk_pango_renderer_draw_rectangle (PangoRenderer *renderer, | ||
668 | + PangoRenderPart part, | ||
669 | + int x, | ||
670 | + int y, | ||
671 | + int width, | ||
672 | + int height) | ||
673 | +{ | ||
674 | + GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer); | ||
675 | + GdkPangoRendererPrivate *priv = gdk_renderer->priv; | ||
676 | + | ||
677 | + if (!priv->in_emboss && priv->embossed && part != PANGO_RENDER_PART_BACKGROUND) | ||
678 | + { | ||
679 | + PangoMatrix *save_matrix; | ||
680 | + PangoColor *save_color; | ||
681 | + | ||
682 | + emboss_renderer (renderer, part, &save_matrix, &save_color); | ||
683 | + PANGO_RENDERER_CLASS (gdk_pango_renderer_parent_class)->draw_rectangle (renderer, part, | ||
684 | + x, y, width, height); | ||
685 | + unemboss_renderer (renderer, part, &save_matrix, &save_color); | ||
686 | + } | ||
687 | + | ||
688 | + PANGO_RENDERER_CLASS (gdk_pango_renderer_parent_class)->draw_rectangle (renderer, part, | ||
689 | + x, y, width, height); | ||
690 | } | ||
691 | |||
692 | static void | ||
693 | @@ -388,8 +443,8 @@ | ||
694 | { | ||
695 | GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer); | ||
696 | |||
697 | - if (gdk_renderer->priv->last_part == part) | ||
698 | - gdk_renderer->priv->last_part = (PangoRenderPart)-1; | ||
699 | + if (part == gdk_renderer->priv->trapezoid_part) | ||
700 | + flush_trapezoids (gdk_renderer); | ||
701 | } | ||
702 | |||
703 | static void | ||
704 | @@ -410,13 +465,8 @@ | ||
705 | { | ||
706 | GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer); | ||
707 | GdkPangoRendererPrivate *priv = gdk_renderer->priv; | ||
708 | - | ||
709 | - if (priv->cr) | ||
710 | - { | ||
711 | - cairo_destroy (priv->cr); | ||
712 | - priv->cr = NULL; | ||
713 | - } | ||
714 | - priv->last_part = (PangoRenderPart)-1; | ||
715 | + | ||
716 | + flush_trapezoids (gdk_renderer); | ||
717 | } | ||
718 | |||
719 | static void | ||
720 | @@ -515,7 +565,6 @@ | ||
721 | GDK_TYPE_PANGO_RENDERER, | ||
722 | GdkPangoRendererPrivate); | ||
723 | |||
724 | - renderer->priv->last_part = (PangoRenderPart)-1; | ||
725 | renderer->priv->gc_changed = TRUE; | ||
726 | } | ||
727 | |||
728 | @@ -527,6 +576,7 @@ | ||
729 | PangoRendererClass *renderer_class = PANGO_RENDERER_CLASS (klass); | ||
730 | |||
731 | renderer_class->draw_glyphs = gdk_pango_renderer_draw_glyphs; | ||
732 | + renderer_class->draw_trapezoid = gdk_pango_renderer_draw_trapezoid; | ||
733 | renderer_class->draw_rectangle = gdk_pango_renderer_draw_rectangle; | ||
734 | renderer_class->draw_error_underline = gdk_pango_renderer_draw_error_underline; | ||
735 | renderer_class->part_changed = gdk_pango_renderer_part_changed; | ||
736 | @@ -647,6 +697,8 @@ | ||
737 | |||
738 | priv = gdk_renderer->priv; | ||
739 | |||
740 | + flush_trapezoids (gdk_renderer); | ||
741 | + | ||
742 | if (priv->drawable != drawable) | ||
743 | { | ||
744 | if (priv->drawable) | ||
745 | @@ -681,6 +733,8 @@ | ||
746 | |||
747 | priv = gdk_renderer->priv; | ||
748 | |||
749 | + flush_trapezoids (gdk_renderer); | ||
750 | + | ||
751 | if (priv->base_gc != gc) | ||
752 | { | ||
753 | if (priv->base_gc) | ||
754 | @@ -689,6 +743,20 @@ | ||
755 | if (priv->base_gc) | ||
756 | g_object_ref (priv->base_gc); | ||
757 | |||
758 | + if (priv->gc) | ||
759 | + { | ||
760 | + g_object_unref (priv->gc); | ||
761 | + priv->gc = NULL; | ||
762 | + } | ||
763 | + | ||
764 | + priv->gc_color_set = FALSE; | ||
765 | + | ||
766 | + if (priv->gc_stipple) | ||
767 | + { | ||
768 | + g_object_unref (priv->gc_stipple); | ||
769 | + priv->gc_stipple = NULL; | ||
770 | + } | ||
771 | + | ||
772 | priv->gc_changed = TRUE; | ||
773 | } | ||
774 | } | ||
775 | @@ -1414,50 +1482,5 @@ | ||
776 | return gdk_pango_context_get_for_screen (gdk_screen_get_default ()); | ||
777 | } | ||
778 | |||
779 | -/** | ||
780 | - * gdk_pango_context_get_for_screen: | ||
781 | - * @screen: the #GdkScreen for which the context is to be created. | ||
782 | - * | ||
783 | - * Creates a #PangoContext for @screen. | ||
784 | - * | ||
785 | - * The context must be freed when you're finished with it. | ||
786 | - * | ||
787 | - * When using GTK+, normally you should use gtk_widget_get_pango_context() | ||
788 | - * instead of this function, to get the appropriate context for | ||
789 | - * the widget you intend to render text onto. | ||
790 | - * | ||
791 | - * The newly created context will have the default font options | ||
792 | - * (see #cairo_font_options_t) for the screen; if these options | ||
793 | - * change it will not be updated. Using gtk_widget_get_pango_context() | ||
794 | - * is more convenient if you want to keep a context around and track | ||
795 | - * changes to the screen's font rendering settings. | ||
796 | - * | ||
797 | - * Return value: a new #PangoContext for @screen | ||
798 | - * | ||
799 | - * Since: 2.2 | ||
800 | - **/ | ||
801 | -PangoContext * | ||
802 | -gdk_pango_context_get_for_screen (GdkScreen *screen) | ||
803 | -{ | ||
804 | - PangoFontMap *fontmap; | ||
805 | - PangoContext *context; | ||
806 | - const cairo_font_options_t *options; | ||
807 | - double dpi; | ||
808 | - | ||
809 | - g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); | ||
810 | - | ||
811 | - fontmap = pango_cairo_font_map_get_default (); | ||
812 | - | ||
813 | - context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap)); | ||
814 | - | ||
815 | - options = gdk_screen_get_font_options (screen); | ||
816 | - pango_cairo_context_set_font_options (context, options); | ||
817 | - | ||
818 | - dpi = gdk_screen_get_resolution (screen); | ||
819 | - pango_cairo_context_set_resolution (context, dpi); | ||
820 | - | ||
821 | - return context; | ||
822 | -} | ||
823 | - | ||
824 | #define __GDK_PANGO_C__ | ||
825 | #include "gdkaliasdef.c" | ||
826 | Index: gtk+-2.10.6/gdk/gdk.symbols | ||
827 | =================================================================== | ||
828 | --- gtk+-2.10.6.orig/gdk/gdk.symbols 2006-10-30 12:58:29.000000000 +0000 | ||
829 | +++ gtk+-2.10.6/gdk/gdk.symbols 2006-10-30 12:59:30.000000000 +0000 | ||
830 | @@ -861,7 +861,6 @@ | ||
831 | gdk_pango_attr_embossed_new | ||
832 | gdk_pango_attr_stipple_new | ||
833 | gdk_pango_context_get | ||
834 | -gdk_pango_context_get_for_screen | ||
835 | #ifndef GDK_DISABLE_DEPRECATED | ||
836 | gdk_pango_context_set_colormap | ||
837 | #endif | ||
838 | @@ -877,6 +876,12 @@ | ||
839 | #endif | ||
840 | #endif | ||
841 | |||
842 | +#if IN_HEADER(__GDK_PANGO_H__) | ||
843 | +#if IN_FILE(__GDK_PANGO_X11_C__) | ||
844 | +gdk_pango_context_get_for_screen | ||
845 | +#endif | ||
846 | +#endif | ||
847 | + | ||
848 | #if IN_HEADER(__GDK_PIXBUF_H__) | ||
849 | #if IN_FILE(__GDK_PIXBUF_DRAWABLE_C__) | ||
850 | gdk_pixbuf_get_from_drawable | ||
851 | Index: gtk+-2.10.6/gdk/gdkwindow.c | ||
852 | =================================================================== | ||
853 | --- gtk+-2.10.6.orig/gdk/gdkwindow.c 2006-10-30 12:58:29.000000000 +0000 | ||
854 | +++ gtk+-2.10.6/gdk/gdkwindow.c 2006-10-30 12:59:30.000000000 +0000 | ||
855 | @@ -1834,9 +1834,14 @@ | ||
856 | } | ||
857 | else | ||
858 | { | ||
859 | - method->cr = cairo_create (paint->surface); | ||
860 | + /*method->cr = cairo_create (paint->surface); | ||
861 | |||
862 | - gdk_cairo_set_source_color (method->cr, &private->bg_color); | ||
863 | + gdk_cairo_set_source_color (method->cr, &private->bg_color);*/ | ||
864 | + GdkGC *gc = _gdk_drawable_get_scratch_gc (paint->pixmap, FALSE); | ||
865 | + | ||
866 | + gdk_gc_set_foreground (gc, &(private->bg_color)); | ||
867 | + | ||
868 | + method->gc = g_object_ref (gc); | ||
869 | } | ||
870 | } | ||
871 | |||
872 | Index: gtk+-2.10.6/gdk/x11/gdkdisplay-x11.c | ||
873 | =================================================================== | ||
874 | --- gtk+-2.10.6.orig/gdk/x11/gdkdisplay-x11.c 2006-10-30 12:58:29.000000000 +0000 | ||
875 | +++ gtk+-2.10.6/gdk/x11/gdkdisplay-x11.c 2006-10-30 12:59:30.000000000 +0000 | ||
876 | @@ -190,7 +190,8 @@ | ||
877 | display_x11->leader_window_title_set = FALSE; | ||
878 | |||
879 | display_x11->have_render = GDK_UNKNOWN; | ||
880 | - | ||
881 | + display_x11->have_render_with_trapezoids = GDK_UNKNOWN; | ||
882 | + | ||
883 | #ifdef HAVE_XFIXES | ||
884 | if (XFixesQueryExtension (display_x11->xdisplay, | ||
885 | &display_x11->xfixes_event_base, | ||
886 | Index: gtk+-2.10.6/gdk/x11/gdkdisplay-x11.h | ||
887 | =================================================================== | ||
888 | --- gtk+-2.10.6.orig/gdk/x11/gdkdisplay-x11.h 2006-10-30 12:58:29.000000000 +0000 | ||
889 | +++ gtk+-2.10.6/gdk/x11/gdkdisplay-x11.h 2006-10-30 12:59:30.000000000 +0000 | ||
890 | @@ -78,6 +78,7 @@ | ||
891 | gboolean use_xshm; | ||
892 | gboolean have_shm_pixmaps; | ||
893 | GdkTristate have_render; | ||
894 | + GdkTristate have_render_with_trapezoids; | ||
895 | gboolean have_xfixes; | ||
896 | gint xfixes_event_base; | ||
897 | |||
898 | Index: gtk+-2.10.6/gdk/x11/gdkdrawable-x11.c | ||
899 | =================================================================== | ||
900 | --- gtk+-2.10.6.orig/gdk/x11/gdkdrawable-x11.c 2006-10-30 12:58:30.000000000 +0000 | ||
901 | +++ gtk+-2.10.6/gdk/x11/gdkdrawable-x11.c 2006-10-30 12:59:30.000000000 +0000 | ||
902 | @@ -26,6 +26,8 @@ | ||
903 | |||
904 | #include <config.h> | ||
905 | |||
906 | +#include <pango/pangoxft.h> | ||
907 | + | ||
908 | #include "gdkx.h" | ||
909 | #include "gdkregion-generic.h" | ||
910 | |||
911 | @@ -106,7 +108,21 @@ | ||
912 | GdkGC *gc, | ||
913 | GdkPoint *points, | ||
914 | gint npoints); | ||
915 | - | ||
916 | + | ||
917 | +static void gdk_x11_draw_glyphs (GdkDrawable *drawable, | ||
918 | + GdkGC *gc, | ||
919 | + PangoFont *font, | ||
920 | + gint x, | ||
921 | + gint y, | ||
922 | + PangoGlyphString *glyphs); | ||
923 | +static void gdk_x11_draw_glyphs_transformed (GdkDrawable *drawable, | ||
924 | + GdkGC *gc, | ||
925 | + PangoMatrix *matrix, | ||
926 | + PangoFont *font, | ||
927 | + gint x, | ||
928 | + gint y, | ||
929 | + PangoGlyphString *glyphs); | ||
930 | + | ||
931 | static void gdk_x11_draw_image (GdkDrawable *drawable, | ||
932 | GdkGC *gc, | ||
933 | GdkImage *image, | ||
934 | @@ -129,6 +145,11 @@ | ||
935 | gint x_dither, | ||
936 | gint y_dither); | ||
937 | |||
938 | +static void gdk_x11_draw_trapezoids (GdkDrawable *drawable, | ||
939 | + GdkGC *gc, | ||
940 | + GdkTrapezoid *trapezoids, | ||
941 | + gint n_trapezoids); | ||
942 | + | ||
943 | static cairo_surface_t *gdk_x11_ref_cairo_surface (GdkDrawable *drawable); | ||
944 | |||
945 | static void gdk_x11_set_colormap (GdkDrawable *drawable, | ||
946 | @@ -163,8 +184,11 @@ | ||
947 | drawable_class->draw_points = gdk_x11_draw_points; | ||
948 | drawable_class->draw_segments = gdk_x11_draw_segments; | ||
949 | drawable_class->draw_lines = gdk_x11_draw_lines; | ||
950 | + drawable_class->draw_glyphs = gdk_x11_draw_glyphs; | ||
951 | + drawable_class->draw_glyphs_transformed = gdk_x11_draw_glyphs_transformed; | ||
952 | drawable_class->draw_image = gdk_x11_draw_image; | ||
953 | drawable_class->draw_pixbuf = gdk_x11_draw_pixbuf; | ||
954 | + drawable_class->draw_trapezoids = gdk_x11_draw_trapezoids; | ||
955 | |||
956 | drawable_class->ref_cairo_surface = gdk_x11_ref_cairo_surface; | ||
957 | |||
958 | @@ -327,6 +351,72 @@ | ||
959 | return x11display->have_render == GDK_YES; | ||
960 | } | ||
961 | |||
962 | +gboolean | ||
963 | +_gdk_x11_have_render_with_trapezoids (GdkDisplay *display) | ||
964 | +{ | ||
965 | + Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); | ||
966 | + GdkDisplayX11 *x11display = GDK_DISPLAY_X11 (display); | ||
967 | + | ||
968 | + if (x11display->have_render_with_trapezoids == GDK_UNKNOWN) | ||
969 | + { | ||
970 | + x11display->have_render_with_trapezoids = GDK_NO; | ||
971 | + if (_gdk_x11_have_render (display)) | ||
972 | + { | ||
973 | + /* | ||
974 | + * Require protocol >= 0.4 for CompositeTrapezoids support. | ||
975 | + */ | ||
976 | + int major_version, minor_version; | ||
977 | + | ||
978 | +#define XRENDER_TETRAPEZOIDS_MAJOR 0 | ||
979 | +#define XRENDER_TETRAPEZOIDS_MINOR 4 | ||
980 | + | ||
981 | + if (XRenderQueryVersion (xdisplay, &major_version, | ||
982 | + &minor_version)) | ||
983 | + if ((major_version == XRENDER_TETRAPEZOIDS_MAJOR) && | ||
984 | + (minor_version >= XRENDER_TETRAPEZOIDS_MINOR)) | ||
985 | + x11display->have_render_with_trapezoids = GDK_YES; | ||
986 | + } | ||
987 | + } | ||
988 | + | ||
989 | + return x11display->have_render_with_trapezoids == GDK_YES; | ||
990 | +} | ||
991 | + | ||
992 | +static XftDraw * | ||
993 | +gdk_x11_drawable_get_xft_draw (GdkDrawable *drawable) | ||
994 | +{ | ||
995 | + GdkDrawableImplX11 *impl = GDK_DRAWABLE_IMPL_X11 (drawable); | ||
996 | + | ||
997 | + if (impl->xft_draw == NULL) | ||
998 | + { | ||
999 | + GdkColormap *colormap = gdk_drawable_get_colormap (drawable); | ||
1000 | + | ||
1001 | + if (colormap) | ||
1002 | + { | ||
1003 | + GdkVisual *visual; | ||
1004 | + | ||
1005 | + visual = gdk_colormap_get_visual (colormap); | ||
1006 | + | ||
1007 | + impl->xft_draw = XftDrawCreate (GDK_SCREEN_XDISPLAY (impl->screen), impl->xid, | ||
1008 | + GDK_VISUAL_XVISUAL (visual), GDK_COLORMAP_XCOLORMAP (colormap)); | ||
1009 | + } | ||
1010 | + else if (gdk_drawable_get_depth (drawable) == 1) | ||
1011 | + { | ||
1012 | + impl->xft_draw = XftDrawCreateBitmap (GDK_SCREEN_XDISPLAY (impl->screen), impl->xid); | ||
1013 | + } | ||
1014 | + else | ||
1015 | + { | ||
1016 | + g_warning ("Using Xft rendering requires the drawable argument to\n" | ||
1017 | + "have a specified colormap. All windows have a colormap,\n" | ||
1018 | + "however, pixmaps only have colormap by default if they\n" | ||
1019 | + "were created with a non-NULL window argument. Otherwise\n" | ||
1020 | + "a colormap must be set on them with gdk_drawable_set_colormap"); | ||
1021 | + return NULL; | ||
1022 | + } | ||
1023 | + } | ||
1024 | + | ||
1025 | + return impl->xft_draw; | ||
1026 | +} | ||
1027 | + | ||
1028 | static Picture | ||
1029 | gdk_x11_drawable_get_picture (GdkDrawable *drawable) | ||
1030 | { | ||
1031 | @@ -393,6 +483,57 @@ | ||
1032 | } | ||
1033 | } | ||
1034 | |||
1035 | +static void | ||
1036 | +gdk_x11_drawable_update_xft_clip (GdkDrawable *drawable, | ||
1037 | + GdkGC *gc) | ||
1038 | +{ | ||
1039 | + XftDraw *xft_draw = gdk_x11_drawable_get_xft_draw (drawable); | ||
1040 | + GdkRegion *clip_region = _gdk_gc_get_clip_region (gc); | ||
1041 | + | ||
1042 | + if (gc && clip_region) | ||
1043 | + { | ||
1044 | + GdkRegionBox *boxes = clip_region->rects; | ||
1045 | + gint n_boxes = clip_region->numRects; | ||
1046 | +#if 0 /* Until XftDrawSetClipRectangles is there */ | ||
1047 | + XRectangle *rects = g_new (XRectangle, n_boxes); | ||
1048 | + int i; | ||
1049 | + | ||
1050 | + for (i=0; i < n_boxes; i++) | ||
1051 | + { | ||
1052 | + rects[i].x = CLAMP (boxes[i].x1 + gc->clip_x_origin, G_MINSHORT, G_MAXSHORT); | ||
1053 | + rects[i].y = CLAMP (boxes[i].y1 + gc->clip_y_origin, G_MINSHORT, G_MAXSHORT); | ||
1054 | + rects[i].width = CLAMP (boxes[i].x2 + gc->clip_x_origin, G_MINSHORT, G_MAXSHORT) - rects[i].x; | ||
1055 | + rects[i].height = CLAMP (boxes[i].y2 + gc->clip_y_origin, G_MINSHORT, G_MAXSHORT) - rects[i].y; | ||
1056 | + } | ||
1057 | + XftDrawSetClipRectangles (xft_draw, 0, 0, rects, n_boxes); | ||
1058 | + | ||
1059 | + g_free (rects); | ||
1060 | +#else | ||
1061 | + Region xregion = XCreateRegion (); | ||
1062 | + int i; | ||
1063 | + | ||
1064 | + for (i=0; i < n_boxes; i++) | ||
1065 | + { | ||
1066 | + XRectangle rect; | ||
1067 | + | ||
1068 | + rect.x = CLAMP (boxes[i].x1 + gc->clip_x_origin, G_MINSHORT, G_MAXSHORT); | ||
1069 | + rect.y = CLAMP (boxes[i].y1 + gc->clip_y_origin, G_MINSHORT, G_MAXSHORT); | ||
1070 | + rect.width = CLAMP (boxes[i].x2 + gc->clip_x_origin, G_MINSHORT, G_MAXSHORT) - rect.x; | ||
1071 | + rect.height = CLAMP (boxes[i].y2 + gc->clip_y_origin, G_MINSHORT, G_MAXSHORT) - rect.y; | ||
1072 | + | ||
1073 | + XUnionRectWithRegion (&rect, xregion, xregion); | ||
1074 | + } | ||
1075 | + | ||
1076 | + XftDrawSetClip (xft_draw, xregion); | ||
1077 | + XDestroyRegion (xregion); | ||
1078 | +#endif | ||
1079 | + } | ||
1080 | + else | ||
1081 | + { | ||
1082 | + XftDrawSetClip (xft_draw, NULL); | ||
1083 | + } | ||
1084 | +} | ||
1085 | + | ||
1086 | /***************************************************** | ||
1087 | * X11 specific implementations of generic functions * | ||
1088 | *****************************************************/ | ||
1089 | @@ -780,6 +921,45 @@ | ||
1090 | } | ||
1091 | |||
1092 | static void | ||
1093 | +gdk_x11_draw_glyphs (GdkDrawable *drawable, | ||
1094 | + GdkGC *gc, | ||
1095 | + PangoFont *font, | ||
1096 | + gint x, | ||
1097 | + gint y, | ||
1098 | + PangoGlyphString *glyphs) | ||
1099 | +{ | ||
1100 | + gdk_x11_draw_glyphs_transformed (drawable, gc, NULL, | ||
1101 | + font, | ||
1102 | + x * PANGO_SCALE, | ||
1103 | + y * PANGO_SCALE, | ||
1104 | + glyphs); | ||
1105 | +} | ||
1106 | + | ||
1107 | +static void | ||
1108 | +gdk_x11_draw_glyphs_transformed (GdkDrawable *drawable, | ||
1109 | + GdkGC *gc, | ||
1110 | + PangoMatrix *matrix, | ||
1111 | + PangoFont *font, | ||
1112 | + gint x, | ||
1113 | + gint y, | ||
1114 | + PangoGlyphString *glyphs) | ||
1115 | +{ | ||
1116 | + GdkDrawableImplX11 *impl; | ||
1117 | + PangoRenderer *renderer; | ||
1118 | + | ||
1119 | + impl = GDK_DRAWABLE_IMPL_X11 (drawable); | ||
1120 | + | ||
1121 | + g_return_if_fail (PANGO_XFT_IS_FONT (font)); | ||
1122 | + | ||
1123 | + renderer = _gdk_x11_renderer_get (drawable, gc); | ||
1124 | + if (matrix) | ||
1125 | + pango_renderer_set_matrix (renderer, matrix); | ||
1126 | + pango_renderer_draw_glyphs (renderer, font, glyphs, x, y); | ||
1127 | + if (matrix) | ||
1128 | + pango_renderer_set_matrix (renderer, NULL); | ||
1129 | +} | ||
1130 | + | ||
1131 | +static void | ||
1132 | gdk_x11_draw_image (GdkDrawable *drawable, | ||
1133 | GdkGC *gc, | ||
1134 | GdkImage *image, | ||
1135 | @@ -1444,6 +1624,47 @@ | ||
1136 | } | ||
1137 | |||
1138 | static void | ||
1139 | +gdk_x11_draw_trapezoids (GdkDrawable *drawable, | ||
1140 | + GdkGC *gc, | ||
1141 | + GdkTrapezoid *trapezoids, | ||
1142 | + gint n_trapezoids) | ||
1143 | +{ | ||
1144 | + GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen; | ||
1145 | + GdkDisplay *display = gdk_screen_get_display (screen); | ||
1146 | + XTrapezoid *xtrapezoids; | ||
1147 | + gint i; | ||
1148 | + | ||
1149 | + if (!_gdk_x11_have_render_with_trapezoids (display)) | ||
1150 | + { | ||
1151 | + GdkDrawable *wrapper = GDK_DRAWABLE_IMPL_X11 (drawable)->wrapper; | ||
1152 | + GDK_DRAWABLE_CLASS (_gdk_drawable_impl_x11_parent_class)->draw_trapezoids (wrapper, gc, | ||
1153 | + trapezoids, n_trapezoids); | ||
1154 | + return; | ||
1155 | + } | ||
1156 | + | ||
1157 | + xtrapezoids = g_new (XTrapezoid, n_trapezoids); | ||
1158 | + | ||
1159 | + for (i = 0; i < n_trapezoids; i++) | ||
1160 | + { | ||
1161 | + xtrapezoids[i].top = XDoubleToFixed (trapezoids[i].y1); | ||
1162 | + xtrapezoids[i].bottom = XDoubleToFixed (trapezoids[i].y2); | ||
1163 | + xtrapezoids[i].left.p1.x = XDoubleToFixed (trapezoids[i].x11); | ||
1164 | + xtrapezoids[i].left.p1.y = XDoubleToFixed (trapezoids[i].y1); | ||
1165 | + xtrapezoids[i].left.p2.x = XDoubleToFixed (trapezoids[i].x12); | ||
1166 | + xtrapezoids[i].left.p2.y = XDoubleToFixed (trapezoids[i].y2); | ||
1167 | + xtrapezoids[i].right.p1.x = XDoubleToFixed (trapezoids[i].x21); | ||
1168 | + xtrapezoids[i].right.p1.y = XDoubleToFixed (trapezoids[i].y1); | ||
1169 | + xtrapezoids[i].right.p2.x = XDoubleToFixed (trapezoids[i].x22); | ||
1170 | + xtrapezoids[i].right.p2.y = XDoubleToFixed (trapezoids[i].y2); | ||
1171 | + } | ||
1172 | + | ||
1173 | + _gdk_x11_drawable_draw_xtrapezoids (drawable, gc, | ||
1174 | + xtrapezoids, n_trapezoids); | ||
1175 | + | ||
1176 | + g_free (xtrapezoids); | ||
1177 | +} | ||
1178 | + | ||
1179 | +static void | ||
1180 | gdk_x11_cairo_surface_destroy (void *data) | ||
1181 | { | ||
1182 | GdkDrawableImplX11 *impl = data; | ||
1183 | @@ -1498,5 +1719,89 @@ | ||
1184 | return impl->cairo_surface; | ||
1185 | } | ||
1186 | |||
1187 | +void | ||
1188 | +_gdk_x11_drawable_draw_xtrapezoids (GdkDrawable *drawable, | ||
1189 | + GdkGC *gc, | ||
1190 | + XTrapezoid *xtrapezoids, | ||
1191 | + int n_trapezoids) | ||
1192 | +{ | ||
1193 | + GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen; | ||
1194 | + GdkDisplay *display = gdk_screen_get_display (screen); | ||
1195 | + GdkDisplayX11 *x11display = GDK_DISPLAY_X11 (display); | ||
1196 | + | ||
1197 | + XftDraw *draw; | ||
1198 | + | ||
1199 | + if (!_gdk_x11_have_render_with_trapezoids (display)) | ||
1200 | + { | ||
1201 | + /* This is the case of drawing the borders of the unknown glyph box | ||
1202 | + * without render on the display, we need to feed it back to | ||
1203 | + * fallback code. Not efficient, but doesn't matter. | ||
1204 | + */ | ||
1205 | + GdkTrapezoid *trapezoids = g_new (GdkTrapezoid, n_trapezoids); | ||
1206 | + int i; | ||
1207 | + | ||
1208 | + for (i = 0; i < n_trapezoids; i++) | ||
1209 | + { | ||
1210 | + trapezoids[i].y1 = XFixedToDouble (xtrapezoids[i].top); | ||
1211 | + trapezoids[i].y2 = XFixedToDouble (xtrapezoids[i].bottom); | ||
1212 | + trapezoids[i].x11 = XFixedToDouble (xtrapezoids[i].left.p1.x); | ||
1213 | + trapezoids[i].x12 = XFixedToDouble (xtrapezoids[i].left.p2.x); | ||
1214 | + trapezoids[i].x21 = XFixedToDouble (xtrapezoids[i].right.p1.x); | ||
1215 | + trapezoids[i].x22 = XFixedToDouble (xtrapezoids[i].right.p2.x); | ||
1216 | + } | ||
1217 | + | ||
1218 | + gdk_x11_draw_trapezoids (drawable, gc, trapezoids, n_trapezoids); | ||
1219 | + g_free (trapezoids); | ||
1220 | + | ||
1221 | + return; | ||
1222 | + } | ||
1223 | + | ||
1224 | + gdk_x11_drawable_update_xft_clip (drawable, gc); | ||
1225 | + draw = gdk_x11_drawable_get_xft_draw (drawable); | ||
1226 | + | ||
1227 | + if (!x11display->mask_format) | ||
1228 | + x11display->mask_format = XRenderFindStandardFormat (x11display->xdisplay, | ||
1229 | + PictStandardA8); | ||
1230 | + | ||
1231 | + XRenderCompositeTrapezoids (x11display->xdisplay, PictOpOver, | ||
1232 | + _gdk_x11_gc_get_fg_picture (gc), | ||
1233 | + XftDrawPicture (draw), | ||
1234 | + x11display->mask_format, | ||
1235 | + - gc->ts_x_origin, - gc->ts_y_origin, | ||
1236 | + xtrapezoids, n_trapezoids); | ||
1237 | +} | ||
1238 | + | ||
1239 | +void | ||
1240 | +_gdk_x11_drawable_draw_xft_glyphs (GdkDrawable *drawable, | ||
1241 | + GdkGC *gc, | ||
1242 | + XftFont *xft_font, | ||
1243 | + XftGlyphSpec *glyphs, | ||
1244 | + gint n_glyphs) | ||
1245 | +{ | ||
1246 | + GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen; | ||
1247 | + GdkDisplay *display = gdk_screen_get_display (screen); | ||
1248 | + GdkDisplayX11 *x11display = GDK_DISPLAY_X11 (display); | ||
1249 | + XftDraw *draw; | ||
1250 | + | ||
1251 | + gdk_x11_drawable_update_xft_clip (drawable, gc); | ||
1252 | + draw = gdk_x11_drawable_get_xft_draw (drawable); | ||
1253 | + | ||
1254 | + if (_gdk_x11_have_render (display)) | ||
1255 | + { | ||
1256 | + XftGlyphSpecRender (x11display->xdisplay, PictOpOver, | ||
1257 | + _gdk_x11_gc_get_fg_picture (gc), | ||
1258 | + xft_font, | ||
1259 | + XftDrawPicture (draw), | ||
1260 | + - gc->ts_x_origin, - gc->ts_y_origin, | ||
1261 | + glyphs, n_glyphs); | ||
1262 | + } | ||
1263 | + else | ||
1264 | + { | ||
1265 | + XftColor color; | ||
1266 | + | ||
1267 | + _gdk_gc_x11_get_fg_xft_color (gc, &color); | ||
1268 | + XftDrawGlyphSpec (draw, &color, xft_font, glyphs, n_glyphs); | ||
1269 | + } | ||
1270 | +} | ||
1271 | #define __GDK_DRAWABLE_X11_C__ | ||
1272 | #include "gdkaliasdef.c" | ||
1273 | Index: gtk+-2.10.6/gdk/x11/gdkdrawable-x11.h | ||
1274 | =================================================================== | ||
1275 | --- gtk+-2.10.6.orig/gdk/x11/gdkdrawable-x11.h 2006-10-30 12:58:30.000000000 +0000 | ||
1276 | +++ gtk+-2.10.6/gdk/x11/gdkdrawable-x11.h 2006-10-30 12:59:30.000000000 +0000 | ||
1277 | @@ -33,6 +33,7 @@ | ||
1278 | |||
1279 | #include <X11/Xlib.h> | ||
1280 | #include <X11/extensions/Xrender.h> | ||
1281 | +#include <X11/Xft/Xft.h> | ||
1282 | |||
1283 | G_BEGIN_DECLS | ||
1284 | |||
1285 | @@ -68,6 +69,8 @@ | ||
1286 | Window xid; | ||
1287 | GdkScreen *screen; | ||
1288 | |||
1289 | + XftDraw *xft_draw; | ||
1290 | + | ||
1291 | Picture picture; | ||
1292 | cairo_surface_t *cairo_surface; | ||
1293 | }; | ||
1294 | @@ -92,7 +95,15 @@ | ||
1295 | /* Note that the following take GdkDrawableImplX11, not the wrapper drawable */ | ||
1296 | void _gdk_x11_drawable_finish (GdkDrawable *drawable); | ||
1297 | void _gdk_x11_drawable_update_size (GdkDrawable *drawable); | ||
1298 | - | ||
1299 | +void _gdk_x11_drawable_draw_xtrapezoids (GdkDrawable *drawable, | ||
1300 | + GdkGC *gc, | ||
1301 | + XTrapezoid *xtrapezoids, | ||
1302 | + int n_trapezoids); | ||
1303 | +void _gdk_x11_drawable_draw_xft_glyphs (GdkDrawable *drawable, | ||
1304 | + GdkGC *gc, | ||
1305 | + XftFont *xft_font, | ||
1306 | + XftGlyphSpec *glyphs, | ||
1307 | + gint n_glyphs); | ||
1308 | G_END_DECLS | ||
1309 | |||
1310 | #endif /* __GDK_DRAWABLE_X11_H__ */ | ||
1311 | Index: gtk+-2.10.6/gdk/x11/gdkgc-x11.c | ||
1312 | =================================================================== | ||
1313 | --- gtk+-2.10.6.orig/gdk/x11/gdkgc-x11.c 2006-10-30 12:58:30.000000000 +0000 | ||
1314 | +++ gtk+-2.10.6/gdk/x11/gdkgc-x11.c 2006-10-30 12:59:30.000000000 +0000 | ||
1315 | @@ -80,7 +80,10 @@ | ||
1316 | gdk_gc_x11_finalize (GObject *object) | ||
1317 | { | ||
1318 | GdkGCX11 *x11_gc = GDK_GC_X11 (object); | ||
1319 | - | ||
1320 | + | ||
1321 | + if (x11_gc->fg_picture != None) | ||
1322 | + XRenderFreePicture (GDK_GC_XDISPLAY (x11_gc), x11_gc->fg_picture); | ||
1323 | + | ||
1324 | XFreeGC (GDK_GC_XDISPLAY (x11_gc), GDK_GC_XGC (x11_gc)); | ||
1325 | |||
1326 | G_OBJECT_CLASS (_gdk_gc_x11_parent_class)->finalize (object); | ||
1327 | @@ -110,7 +113,7 @@ | ||
1328 | |||
1329 | private->dirty_mask = 0; | ||
1330 | private->have_clip_mask = FALSE; | ||
1331 | - | ||
1332 | + | ||
1333 | private->screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen; | ||
1334 | |||
1335 | private->depth = gdk_drawable_get_depth (drawable); | ||
1336 | @@ -339,6 +342,18 @@ | ||
1337 | } | ||
1338 | |||
1339 | static void | ||
1340 | +clear_fg_picture (GdkGC *gc) | ||
1341 | +{ | ||
1342 | + GdkGCX11 *x11_gc = GDK_GC_X11 (gc); | ||
1343 | + | ||
1344 | + if (x11_gc->fg_picture != None) | ||
1345 | + { | ||
1346 | + XRenderFreePicture (GDK_GC_XDISPLAY (x11_gc), x11_gc->fg_picture); | ||
1347 | + x11_gc->fg_picture = None; | ||
1348 | + } | ||
1349 | +} | ||
1350 | + | ||
1351 | +static void | ||
1352 | gdk_x11_gc_set_values (GdkGC *gc, | ||
1353 | GdkGCValues *values, | ||
1354 | GdkGCValuesMask values_mask) | ||
1355 | @@ -367,6 +382,29 @@ | ||
1356 | x11_gc->have_clip_mask = values->clip_mask != NULL; | ||
1357 | } | ||
1358 | |||
1359 | + if (values_mask & GDK_GC_BACKGROUND) | ||
1360 | + { | ||
1361 | + if (_gdk_gc_get_fill (gc) == GDK_OPAQUE_STIPPLED) | ||
1362 | + clear_fg_picture (gc); | ||
1363 | + } | ||
1364 | + | ||
1365 | + if (values_mask & GDK_GC_FILL) | ||
1366 | + { | ||
1367 | + clear_fg_picture (gc); | ||
1368 | + } | ||
1369 | + | ||
1370 | + if (values_mask & GDK_GC_STIPPLE) | ||
1371 | + { | ||
1372 | + if (_gdk_gc_get_fill (gc) == GDK_STIPPLED || _gdk_gc_get_fill (gc) == GDK_OPAQUE_STIPPLED) | ||
1373 | + clear_fg_picture (gc); | ||
1374 | + } | ||
1375 | + | ||
1376 | + if (values_mask & GDK_GC_TILE) | ||
1377 | + { | ||
1378 | + if (_gdk_gc_get_fill (gc) == GDK_TILED) | ||
1379 | + clear_fg_picture (gc); | ||
1380 | + } | ||
1381 | + | ||
1382 | gdk_x11_gc_values_to_xvalues (values, values_mask, &xvalues, &xvalues_mask); | ||
1383 | |||
1384 | XChangeGC (GDK_GC_XDISPLAY (gc), | ||
1385 | @@ -642,6 +680,8 @@ | ||
1386 | x11_dst_gc->dirty_mask = x11_src_gc->dirty_mask; | ||
1387 | x11_dst_gc->have_clip_region = x11_src_gc->have_clip_region; | ||
1388 | x11_dst_gc->have_clip_mask = x11_src_gc->have_clip_mask; | ||
1389 | + | ||
1390 | + clear_fg_picture (dst_gc); | ||
1391 | } | ||
1392 | |||
1393 | /** | ||
1394 | @@ -701,5 +741,359 @@ | ||
1395 | return gc_x11->xgc; | ||
1396 | } | ||
1397 | |||
1398 | +/* Various bits of the below are roughly cribbed from XFree86 | ||
1399 | + * lib/Xft/xftdraw.c, Copyright 2000, Keith Packard | ||
1400 | + */ | ||
1401 | + | ||
1402 | +static XRenderPictFormat * | ||
1403 | +foreground_format (GdkGC *gc) | ||
1404 | +{ | ||
1405 | + XRenderPictFormat pf; | ||
1406 | + | ||
1407 | + pf.type = PictTypeDirect; | ||
1408 | + pf.depth = 32; | ||
1409 | + pf.direct.redMask = 0xff; | ||
1410 | + pf.direct.greenMask = 0xff; | ||
1411 | + pf.direct.blueMask = 0xff; | ||
1412 | + pf.direct.alphaMask = 0xff; | ||
1413 | + | ||
1414 | + return XRenderFindFormat (GDK_GC_XDISPLAY (gc), | ||
1415 | + (PictFormatType | | ||
1416 | + PictFormatDepth | | ||
1417 | + PictFormatRedMask | | ||
1418 | + PictFormatGreenMask | | ||
1419 | + PictFormatBlueMask | | ||
1420 | + PictFormatAlphaMask), | ||
1421 | + &pf, | ||
1422 | + 0); | ||
1423 | +} | ||
1424 | + | ||
1425 | +static Picture | ||
1426 | +make_fg_tile_picture (GdkGC *gc) | ||
1427 | +{ | ||
1428 | + GdkGCX11 *x11_gc = GDK_GC_X11 (gc); | ||
1429 | + GdkVisual *visual = gdk_drawable_get_visual (_gdk_gc_get_tile (gc)); | ||
1430 | + XRenderPictFormat *format = NULL; | ||
1431 | + | ||
1432 | + if (visual) | ||
1433 | + { | ||
1434 | + format = XRenderFindVisualFormat (GDK_GC_XDISPLAY (gc), | ||
1435 | + GDK_VISUAL_XVISUAL (visual)); | ||
1436 | + } | ||
1437 | + else if (x11_gc->depth == 1) | ||
1438 | + { | ||
1439 | + format = XRenderFindStandardFormat (GDK_GC_XDISPLAY (gc), | ||
1440 | + PictStandardA1); | ||
1441 | + } | ||
1442 | + | ||
1443 | + if (format) | ||
1444 | + { | ||
1445 | + XRenderPictureAttributes pa; | ||
1446 | + pa.repeat = True; | ||
1447 | + | ||
1448 | + return XRenderCreatePicture (GDK_GC_XDISPLAY (gc), | ||
1449 | + GDK_PIXMAP_XID (_gdk_gc_get_tile (gc)), | ||
1450 | + format, | ||
1451 | + CPRepeat, &pa); | ||
1452 | + } | ||
1453 | + | ||
1454 | + return None; | ||
1455 | +} | ||
1456 | + | ||
1457 | +static Picture | ||
1458 | +make_stipple_picture (GdkGC *gc) | ||
1459 | +{ | ||
1460 | + XRenderPictFormat *format = NULL; | ||
1461 | + XRenderPictureAttributes pa; | ||
1462 | + | ||
1463 | + format = XRenderFindStandardFormat (GDK_GC_XDISPLAY (gc), | ||
1464 | + PictStandardA1); | ||
1465 | + | ||
1466 | + pa.repeat = True; | ||
1467 | + return XRenderCreatePicture (GDK_GC_XDISPLAY (gc), | ||
1468 | + GDK_PIXMAP_XID (_gdk_gc_get_stipple (gc)), | ||
1469 | + format, | ||
1470 | + CPRepeat, &pa); | ||
1471 | +} | ||
1472 | + | ||
1473 | +static Picture | ||
1474 | +make_color_picture (GdkGC *gc, | ||
1475 | + XRenderColor *color) | ||
1476 | +{ | ||
1477 | + GdkGCX11 *x11_gc = GDK_GC_X11 (gc); | ||
1478 | + XRenderPictureAttributes pa; | ||
1479 | + XRenderPictFormat *pix_format = foreground_format (gc); | ||
1480 | + Pixmap pix; | ||
1481 | + Picture picture; | ||
1482 | + | ||
1483 | + if (!pix_format) | ||
1484 | + return None; | ||
1485 | + | ||
1486 | + pix = XCreatePixmap (GDK_GC_XDISPLAY (gc), | ||
1487 | + GDK_SCREEN_XROOTWIN (x11_gc->screen), | ||
1488 | + 1, 1, pix_format->depth); | ||
1489 | + pa.repeat = True; | ||
1490 | + picture = XRenderCreatePicture (GDK_GC_XDISPLAY (gc), | ||
1491 | + pix, | ||
1492 | + pix_format, | ||
1493 | + CPRepeat, &pa); | ||
1494 | + XFreePixmap (GDK_GC_XDISPLAY (gc), pix); | ||
1495 | + | ||
1496 | + XRenderFillRectangle (GDK_GC_XDISPLAY (gc), PictOpSrc, | ||
1497 | + picture, color, | ||
1498 | + 0, 0, 1, 1); | ||
1499 | + | ||
1500 | + return picture; | ||
1501 | +} | ||
1502 | + | ||
1503 | +static void | ||
1504 | +get_bg_color (GdkGC *gc, | ||
1505 | + XRenderColor *render_color) | ||
1506 | +{ | ||
1507 | + GdkColormap *cmap; | ||
1508 | + | ||
1509 | + cmap = gdk_gc_get_colormap (gc); | ||
1510 | + | ||
1511 | + if (cmap) | ||
1512 | + { | ||
1513 | + GdkColor color; | ||
1514 | + | ||
1515 | + gdk_colormap_query_color (cmap, _gdk_gc_get_bg_pixel (gc), &color); | ||
1516 | + | ||
1517 | + render_color->alpha = 0xffff; | ||
1518 | + render_color->red = color.red; | ||
1519 | + render_color->green = color.green; | ||
1520 | + render_color->blue = color.blue; | ||
1521 | + } | ||
1522 | + else /* Not worth warning, just use black */ | ||
1523 | + { | ||
1524 | + render_color->alpha = 0xffff; | ||
1525 | + render_color->red = 0; | ||
1526 | + render_color->green = 0; | ||
1527 | + render_color->blue = 0; | ||
1528 | + } | ||
1529 | +} | ||
1530 | + | ||
1531 | +/** | ||
1532 | + * _gdk_x11_gc_get_fg_picture: | ||
1533 | + * @gc: a #GdkGC | ||
1534 | + * | ||
1535 | + * Gets a Xrender Picture object suitable for being the source | ||
1536 | + * drawable for drawing with the foreground the graphics context. | ||
1537 | + * | ||
1538 | + * Return value: a Picture, owned by the GC; this cannot be | ||
1539 | + * used over subsequent modification of the GC. | ||
1540 | + **/ | ||
1541 | +Picture | ||
1542 | +_gdk_x11_gc_get_fg_picture (GdkGC *gc) | ||
1543 | +{ | ||
1544 | + GdkGCX11 *x11_gc; | ||
1545 | + gboolean new = FALSE; | ||
1546 | + XftColor xftcolor; | ||
1547 | + GdkFill fill; | ||
1548 | + int width, height; | ||
1549 | + | ||
1550 | + g_return_val_if_fail (GDK_IS_GC_X11 (gc), None); | ||
1551 | + | ||
1552 | + if (!_gdk_x11_have_render (GDK_GC_DISPLAY (gc))) | ||
1553 | + return None; | ||
1554 | + | ||
1555 | + x11_gc = GDK_GC_X11 (gc); | ||
1556 | + | ||
1557 | + fill = GDK_SOLID; | ||
1558 | + width = 1; | ||
1559 | + height = 1; | ||
1560 | + | ||
1561 | + switch (_gdk_gc_get_fill (gc)) | ||
1562 | + { | ||
1563 | + case GDK_SOLID: | ||
1564 | + break; | ||
1565 | + case GDK_TILED: | ||
1566 | + if (_gdk_gc_get_tile (gc)) | ||
1567 | + { | ||
1568 | + if (!x11_gc->fg_picture) | ||
1569 | + x11_gc->fg_picture = make_fg_tile_picture (gc); | ||
1570 | + | ||
1571 | + if (x11_gc->fg_picture != None) | ||
1572 | + return x11_gc->fg_picture; | ||
1573 | + } | ||
1574 | + break; | ||
1575 | + case GDK_STIPPLED: | ||
1576 | + case GDK_OPAQUE_STIPPLED: | ||
1577 | + if (_gdk_gc_get_stipple (gc)) | ||
1578 | + { | ||
1579 | + gdk_drawable_get_size (_gdk_gc_get_stipple (gc), &width, &height); | ||
1580 | + fill = _gdk_gc_get_fill (gc); | ||
1581 | + } | ||
1582 | + break; | ||
1583 | + } | ||
1584 | + | ||
1585 | + if (x11_gc->fg_picture == None) | ||
1586 | + { | ||
1587 | + XRenderPictureAttributes pa; | ||
1588 | + XRenderPictFormat *pix_format = foreground_format (gc); | ||
1589 | + Pixmap pix; | ||
1590 | + | ||
1591 | + if (!pix_format) | ||
1592 | + return None; | ||
1593 | + | ||
1594 | + pix = XCreatePixmap (GDK_GC_XDISPLAY (gc), | ||
1595 | + GDK_SCREEN_XROOTWIN (x11_gc->screen), | ||
1596 | + width, height, pix_format->depth); | ||
1597 | + pa.repeat = True; | ||
1598 | + x11_gc->fg_picture = XRenderCreatePicture (GDK_GC_XDISPLAY (gc), | ||
1599 | + pix, | ||
1600 | + pix_format, | ||
1601 | + CPRepeat, &pa); | ||
1602 | + XFreePixmap (GDK_GC_XDISPLAY (gc), pix); | ||
1603 | + | ||
1604 | + new = TRUE; | ||
1605 | + } | ||
1606 | + | ||
1607 | + _gdk_gc_x11_get_fg_xft_color (gc, &xftcolor); | ||
1608 | + | ||
1609 | + if (x11_gc->fg_picture_color.alpha != 0xffff || | ||
1610 | + x11_gc->fg_picture_color.red != xftcolor.color.red || | ||
1611 | + x11_gc->fg_picture_color.green != xftcolor.color.green || | ||
1612 | + x11_gc->fg_picture_color.blue != xftcolor.color.blue) | ||
1613 | + { | ||
1614 | + x11_gc->fg_picture_color.alpha = 0xffff; | ||
1615 | + x11_gc->fg_picture_color.red = xftcolor.color.red; | ||
1616 | + x11_gc->fg_picture_color.green = xftcolor.color.green; | ||
1617 | + x11_gc->fg_picture_color.blue = xftcolor.color.blue; | ||
1618 | + | ||
1619 | + new = TRUE; | ||
1620 | + } | ||
1621 | + | ||
1622 | + switch (fill) | ||
1623 | + { | ||
1624 | + case GDK_SOLID: | ||
1625 | + XRenderFillRectangle (GDK_GC_XDISPLAY (gc), PictOpSrc, | ||
1626 | + x11_gc->fg_picture, &x11_gc->fg_picture_color, | ||
1627 | + 0, 0, width, height); | ||
1628 | + break; | ||
1629 | + case GDK_STIPPLED: | ||
1630 | + { | ||
1631 | + Picture stipple_picture = make_stipple_picture (gc); | ||
1632 | + | ||
1633 | + XRenderFillRectangle (GDK_GC_XDISPLAY (gc), PictOpSrc, | ||
1634 | + x11_gc->fg_picture, &x11_gc->fg_picture_color, | ||
1635 | + 0, 0, width, height); | ||
1636 | + XRenderComposite (GDK_GC_XDISPLAY (gc), | ||
1637 | + PictOpInReverse, | ||
1638 | + stipple_picture, None, x11_gc->fg_picture, | ||
1639 | + 0, 0, 0, 0, 0, 0, width, height); | ||
1640 | + | ||
1641 | + XRenderFreePicture (GDK_GC_XDISPLAY (x11_gc), stipple_picture); | ||
1642 | + } | ||
1643 | + break; | ||
1644 | + case GDK_OPAQUE_STIPPLED: | ||
1645 | + { | ||
1646 | + XRenderColor bg_color; | ||
1647 | + | ||
1648 | + Picture stipple_picture = make_stipple_picture (gc); | ||
1649 | + Picture fg_picture = make_color_picture (gc, &x11_gc->fg_picture_color); | ||
1650 | + | ||
1651 | + get_bg_color (gc, &bg_color); | ||
1652 | + | ||
1653 | + XRenderFillRectangle (GDK_GC_XDISPLAY (gc), PictOpSrc, | ||
1654 | + x11_gc->fg_picture, &bg_color, | ||
1655 | + 0, 0, width, height); | ||
1656 | + XRenderComposite (GDK_GC_XDISPLAY (gc), | ||
1657 | + PictOpOver, | ||
1658 | + fg_picture, stipple_picture, x11_gc->fg_picture, | ||
1659 | + 0, 0, 0, 0, 0, 0, width, height); | ||
1660 | + | ||
1661 | + XRenderFreePicture (GDK_GC_XDISPLAY (x11_gc), stipple_picture); | ||
1662 | + XRenderFreePicture (GDK_GC_XDISPLAY (x11_gc), fg_picture); | ||
1663 | + } | ||
1664 | + break; | ||
1665 | + case GDK_TILED: | ||
1666 | + g_assert_not_reached (); /* handled above */ | ||
1667 | + break; | ||
1668 | + } | ||
1669 | + | ||
1670 | + return x11_gc->fg_picture; | ||
1671 | +} | ||
1672 | + | ||
1673 | +/** | ||
1674 | + * _gdk_gc_x11_get_fg_xft_color: | ||
1675 | + * @gc: a #GdkGC | ||
1676 | + * @xftcolor: location to store the color | ||
1677 | + * | ||
1678 | + * Gets the foreground color of the GC as a XftColor. | ||
1679 | + **/ | ||
1680 | +void | ||
1681 | +_gdk_gc_x11_get_fg_xft_color (GdkGC *gc, | ||
1682 | + XftColor *xftcolor) | ||
1683 | +{ | ||
1684 | + GdkGCX11 *x11_gc; | ||
1685 | + GdkColormap *cmap; | ||
1686 | + GdkColor color; | ||
1687 | + | ||
1688 | + g_return_if_fail (GDK_IS_GC_X11 (gc)); | ||
1689 | + | ||
1690 | + x11_gc = GDK_GC_X11 (gc); | ||
1691 | + | ||
1692 | + cmap = gdk_gc_get_colormap (gc); | ||
1693 | + | ||
1694 | + xftcolor->pixel = _gdk_gc_get_fg_pixel (gc); | ||
1695 | + | ||
1696 | + if (cmap) | ||
1697 | + { | ||
1698 | + gdk_colormap_query_color (cmap, xftcolor->pixel, &color); | ||
1699 | + xftcolor->color.alpha = 0xffff; | ||
1700 | + xftcolor->color.red = color.red; | ||
1701 | + xftcolor->color.green = color.green; | ||
1702 | + xftcolor->color.blue = color.blue; | ||
1703 | + } | ||
1704 | + else if (x11_gc->depth == 1) | ||
1705 | + { | ||
1706 | + /* Drawing with Xft on a bitmap is a bit bizzare; it | ||
1707 | + * takes alpha >= 0x8000 to mean 'set to 1' and | ||
1708 | + * alpha < 0x8000 to mean 'set to 0'. | ||
1709 | + */ | ||
1710 | + if (xftcolor->pixel) | ||
1711 | + { | ||
1712 | + xftcolor->color.red = 0xffff; | ||
1713 | + xftcolor->color.green = 0xffff; | ||
1714 | + xftcolor->color.blue = 0xffff; | ||
1715 | + xftcolor->color.alpha = 0xffff; | ||
1716 | + } | ||
1717 | + else | ||
1718 | + { | ||
1719 | + xftcolor->color.red = 0; | ||
1720 | + xftcolor->color.green = 0; | ||
1721 | + xftcolor->color.blue = 0; | ||
1722 | + xftcolor->color.alpha = 0; | ||
1723 | + } | ||
1724 | + } | ||
1725 | + else | ||
1726 | + { | ||
1727 | + g_warning ("Using Xft rendering requires the GC argument to have a\n" | ||
1728 | + "specified colormap. If the GC was created for a drawable\n" | ||
1729 | + "with a colormap, the colormap will be set on the GC\n" | ||
1730 | + "automatically. Otherwise, a colormap must be set on it with" | ||
1731 | + "gdk_gc_set_colormap"); | ||
1732 | + } | ||
1733 | +} | ||
1734 | + | ||
1735 | +void | ||
1736 | +_gdk_windowing_gc_get_foreground (GdkGC *gc, | ||
1737 | + GdkColor *color) | ||
1738 | +{ | ||
1739 | + GdkColormap *cmap; | ||
1740 | + | ||
1741 | + g_return_if_fail (GDK_IS_GC_X11 (gc)); | ||
1742 | + | ||
1743 | + color->pixel = _gdk_gc_get_fg_pixel (gc); | ||
1744 | + | ||
1745 | + cmap = gdk_gc_get_colormap (gc); | ||
1746 | + | ||
1747 | + if (cmap) | ||
1748 | + gdk_colormap_query_color (cmap, _gdk_gc_get_fg_pixel (gc), color); | ||
1749 | + else | ||
1750 | + g_warning ("No colormap in _gdk_windowing_gc_get_foreground"); | ||
1751 | +} | ||
1752 | #define __GDK_GC_X11_C__ | ||
1753 | #include "gdkaliasdef.c" | ||
1754 | Index: gtk+-2.10.6/gdk/x11/gdkprivate-x11.h | ||
1755 | =================================================================== | ||
1756 | --- gtk+-2.10.6.orig/gdk/x11/gdkprivate-x11.h 2006-10-30 12:58:30.000000000 +0000 | ||
1757 | +++ gtk+-2.10.6/gdk/x11/gdkprivate-x11.h 2006-10-30 12:59:30.000000000 +0000 | ||
1758 | @@ -63,6 +63,9 @@ | ||
1759 | guint have_clip_region : 1; | ||
1760 | guint have_clip_mask : 1; | ||
1761 | guint depth : 8; | ||
1762 | + | ||
1763 | + Picture fg_picture; | ||
1764 | + XRenderColor fg_picture_color; | ||
1765 | }; | ||
1766 | |||
1767 | struct _GdkGCX11Class | ||
1768 | @@ -102,6 +105,11 @@ | ||
1769 | GType _gdk_gc_x11_get_type (void); | ||
1770 | |||
1771 | gboolean _gdk_x11_have_render (GdkDisplay *display); | ||
1772 | +gboolean _gdk_x11_have_render_with_trapezoids (GdkDisplay *display); | ||
1773 | + | ||
1774 | +Picture _gdk_x11_gc_get_fg_picture (GdkGC *gc); | ||
1775 | +void _gdk_gc_x11_get_fg_xft_color (GdkGC *gc, | ||
1776 | + XftColor *xftcolor); | ||
1777 | |||
1778 | GdkGC *_gdk_x11_gc_new (GdkDrawable *drawable, | ||
1779 | GdkGCValues *values, | ||
1780 | Index: gtk+-2.10.6/gdk/x11/gdkwindow-x11.c | ||
1781 | =================================================================== | ||
1782 | --- gtk+-2.10.6.orig/gdk/x11/gdkwindow-x11.c 2006-10-30 12:58:30.000000000 +0000 | ||
1783 | +++ gtk+-2.10.6/gdk/x11/gdkwindow-x11.c 2006-10-30 12:59:30.000000000 +0000 | ||
1784 | @@ -1114,7 +1114,8 @@ | ||
1785 | { | ||
1786 | GdkWindowObject *private = (GdkWindowObject *)window; | ||
1787 | GdkToplevelX11 *toplevel; | ||
1788 | - | ||
1789 | + GdkDrawableImplX11 *draw_impl; | ||
1790 | + | ||
1791 | g_return_if_fail (GDK_IS_WINDOW (window)); | ||
1792 | |||
1793 | _gdk_selection_window_destroyed (window); | ||
1794 | @@ -1126,6 +1127,11 @@ | ||
1795 | if (toplevel) | ||
1796 | gdk_toplevel_x11_free_contents (GDK_WINDOW_DISPLAY (window), toplevel); | ||
1797 | |||
1798 | + draw_impl = GDK_DRAWABLE_IMPL_X11 (private->impl); | ||
1799 | + | ||
1800 | + if (draw_impl->xft_draw) | ||
1801 | + XftDrawDestroy (draw_impl->xft_draw); | ||
1802 | + | ||
1803 | _gdk_x11_drawable_finish (private->impl); | ||
1804 | |||
1805 | if (!recursing && !foreign_destroy) | ||
1806 | Index: gtk+-2.10.6/gdk/x11/Makefile.am | ||
1807 | =================================================================== | ||
1808 | --- gtk+-2.10.6.orig/gdk/x11/Makefile.am 2006-10-30 12:58:30.000000000 +0000 | ||
1809 | +++ gtk+-2.10.6/gdk/x11/Makefile.am 2006-10-30 12:59:30.000000000 +0000 | ||
1810 | @@ -37,6 +37,7 @@ | ||
1811 | gdkinput.c \ | ||
1812 | gdkkeys-x11.c \ | ||
1813 | gdkmain-x11.c \ | ||
1814 | + gdkpango-x11.c \ | ||
1815 | gdkpixmap-x11.c \ | ||
1816 | gdkpixmap-x11.h \ | ||
1817 | gdkproperty-x11.c \ | ||
1818 | Index: gtk+-2.10.6/gtk/gtkcalendar.c | ||
1819 | =================================================================== | ||
1820 | --- gtk+-2.10.6.orig/gtk/gtkcalendar.c 2006-10-30 12:58:30.000000000 +0000 | ||
1821 | +++ gtk+-2.10.6/gtk/gtkcalendar.c 2006-10-30 12:59:30.000000000 +0000 | ||
1822 | @@ -1821,7 +1821,7 @@ | ||
1823 | } | ||
1824 | } | ||
1825 | |||
1826 | - | ||
1827 | + | ||
1828 | /**************************************** | ||
1829 | * Repainting * | ||
1830 | ****************************************/ | ||
1831 | @@ -1831,7 +1831,7 @@ | ||
1832 | { | ||
1833 | GtkWidget *widget = GTK_WIDGET (calendar); | ||
1834 | GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (calendar); | ||
1835 | - cairo_t *cr; | ||
1836 | + GdkGC *gc; | ||
1837 | char buffer[255]; | ||
1838 | int x, y; | ||
1839 | gint header_width; | ||
1840 | @@ -1849,7 +1849,7 @@ | ||
1841 | else | ||
1842 | year_left = !priv->year_before; | ||
1843 | |||
1844 | - cr = gdk_cairo_create (priv->header_win); | ||
1845 | + gc = calendar->gc; | ||
1846 | |||
1847 | header_width = widget->allocation.width - 2 * widget->style->xthickness; | ||
1848 | |||
1849 | @@ -1902,9 +1902,9 @@ | ||
1850 | - (max_year_width - logical_rect.width)/2); | ||
1851 | |||
1852 | |||
1853 | - gdk_cairo_set_source_color (cr, HEADER_FG_COLOR (GTK_WIDGET (calendar))); | ||
1854 | - cairo_move_to (cr, x, y); | ||
1855 | - pango_cairo_show_layout (cr, layout); | ||
1856 | + gdk_gc_set_foreground (gc, HEADER_FG_COLOR (GTK_WIDGET (calendar))); | ||
1857 | + gdk_draw_layout (priv->header_win, gc, x, y, layout); | ||
1858 | + | ||
1859 | |||
1860 | /* Draw month */ | ||
1861 | g_snprintf (buffer, sizeof (buffer), "%s", default_monthname[calendar->month]); | ||
1862 | @@ -1924,19 +1924,19 @@ | ||
1863 | else | ||
1864 | x = 3 + priv->arrow_width + (max_month_width - logical_rect.width)/2; | ||
1865 | |||
1866 | - cairo_move_to (cr, x, y); | ||
1867 | - pango_cairo_show_layout (cr, layout); | ||
1868 | - | ||
1869 | + gdk_draw_layout (priv->header_win, gc, x, y, layout); | ||
1870 | + | ||
1871 | + gdk_gc_set_foreground (gc, BACKGROUND_COLOR (GTK_WIDGET (calendar))); | ||
1872 | + | ||
1873 | g_object_unref (layout); | ||
1874 | - cairo_destroy (cr); | ||
1875 | } | ||
1876 | |||
1877 | static void | ||
1878 | calendar_paint_day_names (GtkCalendar *calendar) | ||
1879 | { | ||
1880 | GtkWidget *widget = GTK_WIDGET (calendar); | ||
1881 | + GdkGC *gc; | ||
1882 | GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (calendar); | ||
1883 | - cairo_t *cr; | ||
1884 | char buffer[255]; | ||
1885 | int day,i; | ||
1886 | int day_width, cal_width; | ||
1887 | @@ -1946,8 +1946,7 @@ | ||
1888 | gint focus_padding; | ||
1889 | gint focus_width; | ||
1890 | |||
1891 | - cr = gdk_cairo_create (priv->day_name_win); | ||
1892 | - | ||
1893 | + gc = calendar->gc; | ||
1894 | gtk_widget_style_get (GTK_WIDGET (widget), | ||
1895 | "focus-line-width", &focus_width, | ||
1896 | "focus-padding", &focus_padding, | ||
1897 | @@ -1961,22 +1960,19 @@ | ||
1898 | * Draw rectangles as inverted background for the labels. | ||
1899 | */ | ||
1900 | |||
1901 | - gdk_cairo_set_source_color (cr, SELECTED_BG_COLOR (widget)); | ||
1902 | - cairo_rectangle (cr, | ||
1903 | - CALENDAR_MARGIN, CALENDAR_MARGIN, | ||
1904 | - cal_width-CALENDAR_MARGIN * 2, | ||
1905 | - priv->day_name_h - CALENDAR_MARGIN); | ||
1906 | - cairo_fill (cr); | ||
1907 | - | ||
1908 | + gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (widget)); | ||
1909 | + gdk_draw_rectangle (priv->day_name_win, gc, TRUE, | ||
1910 | + CALENDAR_MARGIN, CALENDAR_MARGIN, | ||
1911 | + cal_width-CALENDAR_MARGIN * 2, | ||
1912 | + priv->day_name_h - CALENDAR_MARGIN); | ||
1913 | + | ||
1914 | if (calendar->display_flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS) | ||
1915 | - { | ||
1916 | - cairo_rectangle (cr, | ||
1917 | - CALENDAR_MARGIN, | ||
1918 | - priv->day_name_h - CALENDAR_YSEP, | ||
1919 | - priv->week_width - CALENDAR_YSEP - CALENDAR_MARGIN, | ||
1920 | - CALENDAR_YSEP); | ||
1921 | - cairo_fill (cr); | ||
1922 | - } | ||
1923 | + gdk_draw_rectangle (priv->day_name_win, gc, TRUE, | ||
1924 | + CALENDAR_MARGIN, | ||
1925 | + priv->day_name_h - CALENDAR_YSEP, | ||
1926 | + priv->week_width - CALENDAR_YSEP - CALENDAR_MARGIN, | ||
1927 | + CALENDAR_YSEP); | ||
1928 | + | ||
1929 | |||
1930 | /* | ||
1931 | * Write the labels | ||
1932 | @@ -1984,7 +1980,7 @@ | ||
1933 | |||
1934 | layout = gtk_widget_create_pango_layout (widget, NULL); | ||
1935 | |||
1936 | - gdk_cairo_set_source_color (cr, SELECTED_FG_COLOR (widget)); | ||
1937 | + gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (widget)); | ||
1938 | for (i = 0; i < 7; i++) | ||
1939 | { | ||
1940 | if (gtk_widget_get_direction (GTK_WIDGET (calendar)) == GTK_TEXT_DIR_RTL) | ||
1941 | @@ -1997,19 +1993,18 @@ | ||
1942 | pango_layout_set_text (layout, buffer, -1); | ||
1943 | pango_layout_get_pixel_extents (layout, NULL, &logical_rect); | ||
1944 | |||
1945 | - cairo_move_to (cr, | ||
1946 | - (CALENDAR_MARGIN + | ||
1947 | - + (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ? | ||
1948 | - (priv->week_width + (priv->week_width ? CALENDAR_XSEP : 0)) | ||
1949 | - : 0) | ||
1950 | - + day_wid_sep * i | ||
1951 | - + (day_width - logical_rect.width)/2), | ||
1952 | - CALENDAR_MARGIN + focus_width + focus_padding + logical_rect.y); | ||
1953 | - pango_cairo_show_layout (cr, layout); | ||
1954 | + gdk_draw_layout (priv->day_name_win, gc, | ||
1955 | + (CALENDAR_MARGIN + | ||
1956 | + + (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ? | ||
1957 | + (priv->week_width + (priv->week_width ? CALENDAR_XSEP : 0)) | ||
1958 | + : 0) | ||
1959 | + + day_wid_sep * i | ||
1960 | + + (day_width - logical_rect.width)/2), | ||
1961 | + CALENDAR_MARGIN + focus_width + focus_padding + logical_rect.y, | ||
1962 | + layout); | ||
1963 | } | ||
1964 | |||
1965 | g_object_unref (layout); | ||
1966 | - cairo_destroy (cr); | ||
1967 | } | ||
1968 | |||
1969 | static void | ||
1970 | @@ -2017,7 +2012,7 @@ | ||
1971 | { | ||
1972 | GtkWidget *widget = GTK_WIDGET (calendar); | ||
1973 | GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (calendar); | ||
1974 | - cairo_t *cr; | ||
1975 | + GdkGC *gc; | ||
1976 | gint row, week = 0, year; | ||
1977 | gint x_loc; | ||
1978 | char buffer[32]; | ||
1979 | @@ -2027,7 +2022,7 @@ | ||
1980 | gint focus_padding; | ||
1981 | gint focus_width; | ||
1982 | |||
1983 | - cr = gdk_cairo_create (priv->week_win); | ||
1984 | + gc = calendar->gc; | ||
1985 | |||
1986 | gtk_widget_style_get (GTK_WIDGET (widget), | ||
1987 | "focus-line-width", &focus_width, | ||
1988 | @@ -2038,20 +2033,20 @@ | ||
1989 | * Draw a rectangle as inverted background for the labels. | ||
1990 | */ | ||
1991 | |||
1992 | - gdk_cairo_set_source_color (cr, SELECTED_BG_COLOR (widget)); | ||
1993 | + gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (widget)); | ||
1994 | if (priv->day_name_win) | ||
1995 | - cairo_rectangle (cr, | ||
1996 | - CALENDAR_MARGIN, | ||
1997 | - 0, | ||
1998 | - priv->week_width - CALENDAR_MARGIN, | ||
1999 | - priv->main_h - CALENDAR_MARGIN); | ||
2000 | + gdk_draw_rectangle (priv->week_win, gc, TRUE, | ||
2001 | + CALENDAR_MARGIN, | ||
2002 | + 0, | ||
2003 | + priv->week_width - CALENDAR_MARGIN, | ||
2004 | + priv->main_h - CALENDAR_MARGIN); | ||
2005 | else | ||
2006 | - cairo_rectangle (cr, | ||
2007 | - CALENDAR_MARGIN, | ||
2008 | - CALENDAR_MARGIN, | ||
2009 | - priv->week_width - CALENDAR_MARGIN, | ||
2010 | - priv->main_h - 2 * CALENDAR_MARGIN); | ||
2011 | - cairo_fill (cr); | ||
2012 | + gdk_draw_rectangle (priv->week_win, gc, TRUE, | ||
2013 | + CALENDAR_MARGIN, | ||
2014 | + CALENDAR_MARGIN, | ||
2015 | + priv->week_width - CALENDAR_MARGIN, | ||
2016 | + priv->main_h - 2 * CALENDAR_MARGIN); | ||
2017 | + | ||
2018 | |||
2019 | /* | ||
2020 | * Write the labels | ||
2021 | @@ -2059,7 +2054,7 @@ | ||
2022 | |||
2023 | layout = gtk_widget_create_pango_layout (widget, NULL); | ||
2024 | |||
2025 | - gdk_cairo_set_source_color (cr, SELECTED_FG_COLOR (widget)); | ||
2026 | + gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (widget)); | ||
2027 | day_height = calendar_row_height (calendar); | ||
2028 | for (row = 0; row < 6; row++) | ||
2029 | { | ||
2030 | @@ -2095,12 +2090,10 @@ | ||
2031 | - logical_rect.width | ||
2032 | - CALENDAR_XSEP - focus_padding - focus_width); | ||
2033 | |||
2034 | - cairo_move_to (cr, x_loc, y_loc); | ||
2035 | - pango_cairo_show_layout (cr, layout); | ||
2036 | + gdk_draw_layout (priv->week_win, gc, x_loc, y_loc, layout); | ||
2037 | } | ||
2038 | |||
2039 | g_object_unref (layout); | ||
2040 | - cairo_destroy (cr); | ||
2041 | } | ||
2042 | |||
2043 | static void | ||
2044 | @@ -2149,7 +2142,7 @@ | ||
2045 | { | ||
2046 | GtkWidget *widget = GTK_WIDGET (calendar); | ||
2047 | GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (calendar); | ||
2048 | - cairo_t *cr; | ||
2049 | + GdkGC *gc; | ||
2050 | GdkColor *text_color; | ||
2051 | gchar buffer[32]; | ||
2052 | gint day; | ||
2053 | @@ -2162,7 +2155,7 @@ | ||
2054 | g_return_if_fail (row < 6); | ||
2055 | g_return_if_fail (col < 7); | ||
2056 | |||
2057 | - cr = gdk_cairo_create (priv->main_win); | ||
2058 | + gc = calendar->gc; | ||
2059 | |||
2060 | day = calendar->day[row][col]; | ||
2061 | |||
2062 | @@ -2170,11 +2163,11 @@ | ||
2063 | |||
2064 | if (calendar->day_month[row][col] == MONTH_PREV) | ||
2065 | { | ||
2066 | - text_color = PREV_MONTH_COLOR (widget); | ||
2067 | + gdk_gc_set_foreground (gc, PREV_MONTH_COLOR (GTK_WIDGET (calendar))); | ||
2068 | } | ||
2069 | else if (calendar->day_month[row][col] == MONTH_NEXT) | ||
2070 | { | ||
2071 | - text_color = NEXT_MONTH_COLOR (widget); | ||
2072 | + gdk_gc_set_foreground (gc, NEXT_MONTH_COLOR (GTK_WIDGET (calendar))); | ||
2073 | } | ||
2074 | else | ||
2075 | { | ||
2076 | @@ -2188,16 +2181,16 @@ | ||
2077 | #endif | ||
2078 | if (calendar->selected_day == day) | ||
2079 | { | ||
2080 | - gdk_cairo_set_source_color (cr, SELECTED_BG_COLOR (widget)); | ||
2081 | - gdk_cairo_rectangle (cr, &day_rect); | ||
2082 | - cairo_fill (cr); | ||
2083 | + gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (GTK_WIDGET (calendar))); | ||
2084 | + gdk_draw_rectangle (priv->main_win, gc, TRUE, day_rect.x, day_rect.y, | ||
2085 | + day_rect.width, day_rect.height); | ||
2086 | } | ||
2087 | if (calendar->selected_day == day) | ||
2088 | - text_color = SELECTED_FG_COLOR (widget); | ||
2089 | + gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (GTK_WIDGET (calendar))); | ||
2090 | else if (calendar->marked_date[day-1]) | ||
2091 | - text_color = MARKED_COLOR (widget); | ||
2092 | + gdk_gc_set_foreground (gc, MARKED_COLOR (GTK_WIDGET (calendar))); | ||
2093 | else | ||
2094 | - text_color = NORMAL_DAY_COLOR (widget); | ||
2095 | + gdk_gc_set_foreground (gc, NORMAL_DAY_COLOR (GTK_WIDGET (calendar))); | ||
2096 | } | ||
2097 | |||
2098 | /* Translators: this defines whether the day numbers should use | ||
2099 | @@ -2219,16 +2212,13 @@ | ||
2100 | x_loc -= logical_rect.width; | ||
2101 | y_loc = day_rect.y + (day_rect.height - logical_rect.height) / 2; | ||
2102 | |||
2103 | - gdk_cairo_set_source_color (cr, text_color); | ||
2104 | - cairo_move_to (cr, x_loc, y_loc); | ||
2105 | - pango_cairo_show_layout (cr, layout); | ||
2106 | + gdk_draw_layout (priv->main_win, gc, | ||
2107 | + x_loc, y_loc, layout); | ||
2108 | |||
2109 | if (calendar->marked_date[day-1] | ||
2110 | && calendar->day_month[row][col] == MONTH_CURRENT) | ||
2111 | - { | ||
2112 | - cairo_move_to (cr, x_loc - 1, y_loc); | ||
2113 | - pango_cairo_show_layout (cr, layout); | ||
2114 | - } | ||
2115 | + gdk_draw_layout (priv->main_win, gc, | ||
2116 | + x_loc-1, y_loc, layout); | ||
2117 | |||
2118 | if (GTK_WIDGET_HAS_FOCUS (calendar) | ||
2119 | && calendar->focus_row == row && calendar->focus_col == col) | ||
2120 | @@ -2253,7 +2243,6 @@ | ||
2121 | } | ||
2122 | |||
2123 | g_object_unref (layout); | ||
2124 | - cairo_destroy (cr); | ||
2125 | } | ||
2126 | |||
2127 | static void | ||
2128 | Index: gtk+-2.10.6/gtk/gtkentry.c | ||
2129 | =================================================================== | ||
2130 | --- gtk+-2.10.6.orig/gtk/gtkentry.c 2006-10-30 12:58:30.000000000 +0000 | ||
2131 | +++ gtk+-2.10.6/gtk/gtkentry.c 2006-10-30 12:59:30.000000000 +0000 | ||
2132 | @@ -3333,7 +3333,6 @@ | ||
2133 | if (GTK_WIDGET_DRAWABLE (entry)) | ||
2134 | { | ||
2135 | PangoLayout *layout = gtk_entry_ensure_layout (entry, TRUE); | ||
2136 | - cairo_t *cr; | ||
2137 | gint x, y; | ||
2138 | gint start_pos, end_pos; | ||
2139 | |||
2140 | @@ -3341,56 +3340,60 @@ | ||
2141 | |||
2142 | get_layout_position (entry, &x, &y); | ||
2143 | |||
2144 | - cr = gdk_cairo_create (entry->text_area); | ||
2145 | - | ||
2146 | - cairo_move_to (cr, x, y); | ||
2147 | - gdk_cairo_set_source_color (cr, &widget->style->text [widget->state]); | ||
2148 | - pango_cairo_show_layout (cr, layout); | ||
2149 | - | ||
2150 | + gdk_draw_layout (entry->text_area, widget->style->text_gc [widget->state], | ||
2151 | + x, y, | ||
2152 | + layout); | ||
2153 | + | ||
2154 | if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start_pos, &end_pos)) | ||
2155 | { | ||
2156 | gint *ranges; | ||
2157 | gint n_ranges, i; | ||
2158 | PangoRectangle logical_rect; | ||
2159 | - GdkColor *selection_color, *text_color; | ||
2160 | + GdkGC *selection_gc, *text_gc; | ||
2161 | GtkBorder inner_border; | ||
2162 | - | ||
2163 | + GdkRegion *clip_region; | ||
2164 | + | ||
2165 | pango_layout_get_pixel_extents (layout, NULL, &logical_rect); | ||
2166 | gtk_entry_get_pixel_ranges (entry, &ranges, &n_ranges); | ||
2167 | |||
2168 | if (GTK_WIDGET_HAS_FOCUS (entry)) | ||
2169 | { | ||
2170 | - selection_color = &widget->style->base [GTK_STATE_SELECTED]; | ||
2171 | - text_color = &widget->style->text [GTK_STATE_SELECTED]; | ||
2172 | + selection_gc = widget->style->base_gc [GTK_STATE_SELECTED]; | ||
2173 | + text_gc = widget->style->text_gc [GTK_STATE_SELECTED]; | ||
2174 | } | ||
2175 | else | ||
2176 | { | ||
2177 | - selection_color = &widget->style->base [GTK_STATE_ACTIVE]; | ||
2178 | - text_color = &widget->style->text [GTK_STATE_ACTIVE]; | ||
2179 | + selection_gc = widget->style->base_gc [GTK_STATE_ACTIVE]; | ||
2180 | + text_gc = widget->style->text_gc [GTK_STATE_ACTIVE]; | ||
2181 | } | ||
2182 | - | ||
2183 | + | ||
2184 | + clip_region = gdk_region_new (); | ||
2185 | _gtk_entry_effective_inner_border (entry, &inner_border); | ||
2186 | |||
2187 | for (i = 0; i < n_ranges; ++i) | ||
2188 | - cairo_rectangle (cr, | ||
2189 | - inner_border.left - entry->scroll_offset + ranges[2 * i], | ||
2190 | - y, | ||
2191 | - ranges[2 * i + 1], | ||
2192 | - logical_rect.height); | ||
2193 | + { | ||
2194 | + GdkRectangle rect; | ||
2195 | |||
2196 | - cairo_clip (cr); | ||
2197 | - | ||
2198 | - gdk_cairo_set_source_color (cr, selection_color); | ||
2199 | - cairo_paint (cr); | ||
2200 | + rect.x = inner_border.left - entry->scroll_offset + ranges[2 * i]; | ||
2201 | + rect.y = y; | ||
2202 | + rect.width = ranges[2 * i + 1]; | ||
2203 | + rect.height = logical_rect.height; | ||
2204 | + | ||
2205 | + gdk_draw_rectangle (entry->text_area, selection_gc, TRUE, | ||
2206 | + rect.x, rect.y, rect.width, rect.height); | ||
2207 | |||
2208 | - cairo_move_to (cr, x, y); | ||
2209 | - gdk_cairo_set_source_color (cr, text_color); | ||
2210 | - pango_cairo_show_layout (cr, layout); | ||
2211 | + gdk_region_union_with_rect (clip_region, &rect); | ||
2212 | + } | ||
2213 | |||
2214 | + gdk_gc_set_clip_region (text_gc, clip_region); | ||
2215 | + gdk_draw_layout (entry->text_area, text_gc, | ||
2216 | + x, y, | ||
2217 | + layout); | ||
2218 | + gdk_gc_set_clip_region (text_gc, NULL); | ||
2219 | + | ||
2220 | + gdk_region_destroy (clip_region); | ||
2221 | g_free (ranges); | ||
2222 | } | ||
2223 | - | ||
2224 | - cairo_destroy (cr); | ||
2225 | } | ||
2226 | } | ||
2227 | |||
2228 | Index: gtk+-2.10.6/gtk/gtkwidget.c | ||
2229 | =================================================================== | ||
2230 | --- gtk+-2.10.6.orig/gtk/gtkwidget.c 2006-10-30 12:58:30.000000000 +0000 | ||
2231 | +++ gtk+-2.10.6/gtk/gtkwidget.c 2006-10-30 12:59:30.000000000 +0000 | ||
2232 | @@ -5445,7 +5445,8 @@ | ||
2233 | GdkScreen *screen; | ||
2234 | |||
2235 | update_pango_context (widget, context); | ||
2236 | - | ||
2237 | +/* TODO: Figure out the proper way to handle this in a pangoxft setting | ||
2238 | + | ||
2239 | screen = gtk_widget_get_screen_unchecked (widget); | ||
2240 | if (screen) | ||
2241 | { | ||
2242 | @@ -5453,7 +5454,7 @@ | ||
2243 | gdk_screen_get_resolution (screen)); | ||
2244 | pango_cairo_context_set_font_options (context, | ||
2245 | gdk_screen_get_font_options (screen)); | ||
2246 | - } | ||
2247 | + }*/ | ||
2248 | } | ||
2249 | } | ||
2250 | |||
2251 | Index: gtk+-2.10.6/gdk/x11/gdkpango-x11.c | ||
2252 | =================================================================== | ||
2253 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
2254 | +++ gtk+-2.10.6/gdk/x11/gdkpango-x11.c 2006-10-30 12:59:30.000000000 +0000 | ||
2255 | @@ -0,0 +1,174 @@ | ||
2256 | +/* GDK - The GIMP Drawing Kit | ||
2257 | + * Copyright (C) 2000 Red Hat, Inc. | ||
2258 | + * | ||
2259 | + * This library is free software; you can redistribute it and/or | ||
2260 | + * modify it under the terms of the GNU Lesser General Public | ||
2261 | + * License as published by the Free Software Foundation; either | ||
2262 | + * version 2 of the License, or (at your option) any later version. | ||
2263 | + * | ||
2264 | + * This library is distributed in the hope that it will be useful, | ||
2265 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2266 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
2267 | + * Lesser General Public License for more details. | ||
2268 | + * | ||
2269 | + * You should have received a copy of the GNU Lesser General Public | ||
2270 | + * License along with this library; if not, write to the | ||
2271 | + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
2272 | + * Boston, MA 02111-1307, USA. | ||
2273 | + */ | ||
2274 | + | ||
2275 | +#include <config.h> | ||
2276 | +#include <stdlib.h> | ||
2277 | + | ||
2278 | +#include "gdkx.h" | ||
2279 | +#include "gdkdisplay-x11.h" | ||
2280 | +#include "gdkpango.h" | ||
2281 | +#include <pango/pangoxft.h> | ||
2282 | +#include <pango/pangoxft-render.h> | ||
2283 | +#include "gdkalias.h" | ||
2284 | + | ||
2285 | +#include <math.h> | ||
2286 | + | ||
2287 | +typedef struct _GdkX11Renderer GdkX11Renderer; | ||
2288 | +typedef struct _GdkX11RendererClass GdkX11RendererClass; | ||
2289 | + | ||
2290 | +#define GDK_TYPE_X11_RENDERER (_gdk_x11_renderer_get_type()) | ||
2291 | +#define GDK_X11_RENDERER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_X11_RENDERER, GdkX11Renderer)) | ||
2292 | +#define GDK_IS_X11_RENDERER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_X11_RENDERER)) | ||
2293 | +#define GDK_X11_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_X11_RENDERER, GdkX11RendererClass)) | ||
2294 | +#define GDK_IS_X11_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_X11_RENDERER)) | ||
2295 | +#define GDK_X11_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_X11_RENDERER, GdkX11RendererClass)) | ||
2296 | + | ||
2297 | +#define MAX_RENDER_PART PANGO_RENDER_PART_STRIKETHROUGH | ||
2298 | + | ||
2299 | +struct _GdkX11Renderer | ||
2300 | +{ | ||
2301 | + PangoXftRenderer parent_instance; | ||
2302 | + | ||
2303 | + XRenderPictFormat *mask_format; | ||
2304 | + | ||
2305 | + GdkDrawable *drawable; | ||
2306 | + GdkGC *gc; | ||
2307 | +}; | ||
2308 | + | ||
2309 | +struct _GdkX11RendererClass | ||
2310 | +{ | ||
2311 | + PangoXftRendererClass parent_class; | ||
2312 | +}; | ||
2313 | + | ||
2314 | +G_DEFINE_TYPE (GdkX11Renderer, _gdk_x11_renderer, PANGO_TYPE_XFT_RENDERER) | ||
2315 | + | ||
2316 | +static void | ||
2317 | +gdk_x11_renderer_finalize (GObject *object) | ||
2318 | +{ | ||
2319 | + G_OBJECT_CLASS (_gdk_x11_renderer_parent_class)->finalize (object); | ||
2320 | +} | ||
2321 | + | ||
2322 | +static void | ||
2323 | +gdk_x11_renderer_composite_trapezoids (PangoXftRenderer *xftrenderer, | ||
2324 | + PangoRenderPart part, | ||
2325 | + XTrapezoid *trapezoids, | ||
2326 | + int n_trapezoids) | ||
2327 | +{ | ||
2328 | + /* Because we only use this renderer for "draw_glyphs()" calls, we | ||
2329 | + * won't hit this code path much. However, it is hit for drawing | ||
2330 | + * the "unknown glyph" hex squares. We can safely ignore the part, | ||
2331 | + */ | ||
2332 | + GdkX11Renderer *x11_renderer = GDK_X11_RENDERER (xftrenderer); | ||
2333 | + | ||
2334 | + _gdk_x11_drawable_draw_xtrapezoids (x11_renderer->drawable, | ||
2335 | + x11_renderer->gc, | ||
2336 | + trapezoids, n_trapezoids); | ||
2337 | + | ||
2338 | +} | ||
2339 | + | ||
2340 | +static void | ||
2341 | +gdk_x11_renderer_composite_glyphs (PangoXftRenderer *xftrenderer, | ||
2342 | + XftFont *xft_font, | ||
2343 | + XftGlyphSpec *glyphs, | ||
2344 | + gint n_glyphs) | ||
2345 | +{ | ||
2346 | + GdkX11Renderer *x11_renderer = GDK_X11_RENDERER (xftrenderer); | ||
2347 | + | ||
2348 | + _gdk_x11_drawable_draw_xft_glyphs (x11_renderer->drawable, | ||
2349 | + x11_renderer->gc, | ||
2350 | + xft_font, glyphs, n_glyphs); | ||
2351 | +} | ||
2352 | + | ||
2353 | +static void | ||
2354 | +_gdk_x11_renderer_init (GdkX11Renderer *renderer) | ||
2355 | +{ | ||
2356 | +} | ||
2357 | + | ||
2358 | +static void | ||
2359 | +_gdk_x11_renderer_class_init (GdkX11RendererClass *klass) | ||
2360 | +{ | ||
2361 | + PangoXftRendererClass *xftrenderer_class = PANGO_XFT_RENDERER_CLASS (klass); | ||
2362 | + GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||
2363 | + | ||
2364 | + xftrenderer_class->composite_glyphs = gdk_x11_renderer_composite_glyphs; | ||
2365 | + xftrenderer_class->composite_trapezoids = gdk_x11_renderer_composite_trapezoids; | ||
2366 | + | ||
2367 | + object_class->finalize = gdk_x11_renderer_finalize; | ||
2368 | +} | ||
2369 | + | ||
2370 | +PangoRenderer * | ||
2371 | +_gdk_x11_renderer_get (GdkDrawable *drawable, | ||
2372 | + GdkGC *gc) | ||
2373 | +{ | ||
2374 | + GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen; | ||
2375 | + GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen); | ||
2376 | + GdkX11Renderer *x11_renderer; | ||
2377 | + | ||
2378 | + if (!screen_x11->renderer) | ||
2379 | + { | ||
2380 | + screen_x11->renderer = g_object_new (GDK_TYPE_X11_RENDERER, | ||
2381 | + "display", GDK_SCREEN_XDISPLAY (screen), | ||
2382 | + "screen", GDK_SCREEN_XNUMBER (screen), | ||
2383 | + NULL); | ||
2384 | + } | ||
2385 | + | ||
2386 | + x11_renderer = GDK_X11_RENDERER (screen_x11->renderer); | ||
2387 | + | ||
2388 | + x11_renderer->drawable = drawable; | ||
2389 | + x11_renderer->gc = gc; | ||
2390 | + | ||
2391 | + return screen_x11->renderer; | ||
2392 | +} | ||
2393 | + | ||
2394 | +/** | ||
2395 | + * gdk_pango_context_get_for_screen: | ||
2396 | + * @screen: the #GdkScreen for which the context is to be created. | ||
2397 | + * | ||
2398 | + * Creates a #PangoContext for @screen. | ||
2399 | + * | ||
2400 | + * The context must be freed when you're finished with it. | ||
2401 | + * | ||
2402 | + * When using GTK+, normally you should use gtk_widget_get_pango_context() | ||
2403 | + * instead of this function, to get the appropriate context for | ||
2404 | + * the widget you intend to render text onto. | ||
2405 | + * | ||
2406 | + * Return value: a new #PangoContext for @screen | ||
2407 | + * | ||
2408 | + * Since: 2.2 | ||
2409 | + **/ | ||
2410 | +PangoContext * | ||
2411 | +gdk_pango_context_get_for_screen (GdkScreen *screen) | ||
2412 | +{ | ||
2413 | + PangoContext *context; | ||
2414 | + | ||
2415 | + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); | ||
2416 | + | ||
2417 | + if (screen->closed) | ||
2418 | + return NULL; | ||
2419 | + | ||
2420 | + context = pango_xft_get_context (GDK_SCREEN_XDISPLAY (screen), | ||
2421 | + GDK_SCREEN_X11 (screen)->screen_num); | ||
2422 | + | ||
2423 | + g_object_set_data (G_OBJECT (context), "gdk-pango-screen", screen); | ||
2424 | + | ||
2425 | + return context; | ||
2426 | +} | ||
2427 | + | ||
2428 | +#define __GDK_PANGO_X11_C__ | ||
2429 | +#include "gdkaliasdef.c" | ||
2430 | Index: gtk+-2.10.6/gdk/x11/gdkpixmap-x11.c | ||
2431 | =================================================================== | ||
2432 | --- gtk+-2.10.6.orig/gdk/x11/gdkpixmap-x11.c 2006-10-30 12:58:30.000000000 +0000 | ||
2433 | +++ gtk+-2.10.6/gdk/x11/gdkpixmap-x11.c 2006-10-30 12:59:30.000000000 +0000 | ||
2434 | @@ -119,6 +119,9 @@ | ||
2435 | { | ||
2436 | GdkDrawableImplX11 *draw_impl = GDK_DRAWABLE_IMPL_X11 (impl); | ||
2437 | |||
2438 | + if (draw_impl->xft_draw) | ||
2439 | + XftDrawDestroy (draw_impl->xft_draw); | ||
2440 | + | ||
2441 | _gdk_x11_drawable_finish (GDK_DRAWABLE (draw_impl)); | ||
2442 | } | ||
2443 | |||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/run-iconcache.patch b/meta/packages/gtk+/gtk+-2.10.6/run-iconcache.patch new file mode 100644 index 0000000000..5c114dbdda --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/run-iconcache.patch | |||
@@ -0,0 +1,21 @@ | |||
1 | Index: gtk+-2.10.6/gtk/Makefile.am | ||
2 | =================================================================== | ||
3 | --- gtk+-2.10.6.orig/gtk/Makefile.am 2006-10-30 12:56:34.000000000 +0000 | ||
4 | +++ gtk+-2.10.6/gtk/Makefile.am 2006-10-30 12:57:08.000000000 +0000 | ||
5 | @@ -1119,11 +1119,11 @@ | ||
6 | done \ | ||
7 | && touch stamp-icons | ||
8 | |||
9 | -gtkbuiltincache.h: @REBUILD@ stamp-icons | ||
10 | - $(MAKE) $(AM_MAKEFLAGS) gtk-update-icon-cache$(EXEEXT) | ||
11 | - GDK_PIXBUF_MODULE_FILE=$(top_builddir)/gdk-pixbuf/gdk-pixbuf.loaders \ | ||
12 | - ./gtk-update-icon-cache --force --ignore-theme-index \ | ||
13 | - --source builtin_icons stock-icons > gtkbuiltincache.h | ||
14 | +#gtkbuiltincache.h: @REBUILD@ stamp-icons | ||
15 | +# $(MAKE) $(AM_MAKEFLAGS) gtk-update-icon-cache$(EXEEXT) | ||
16 | +# GDK_PIXBUF_MODULE_FILE=$(top_builddir)/gdk-pixbuf/gdk-pixbuf.loaders \ | ||
17 | +# ./gtk-update-icon-cache --force --ignore-theme-index \ | ||
18 | +# --source builtin_icons stock-icons > gtkbuiltincache.h | ||
19 | |||
20 | EXTRA_DIST += \ | ||
21 | $(STOCK_ICONS) \ | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/scroll-timings.patch b/meta/packages/gtk+/gtk+-2.10.6/scroll-timings.patch new file mode 100644 index 0000000000..3f823a7880 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/scroll-timings.patch | |||
@@ -0,0 +1,11 @@ | |||
1 | --- gtk+-2.10.0/gtk/gtkrange.c.orig 2006-07-05 12:41:39.000000000 +0200 | ||
2 | +++ gtk+-2.10.0/gtk/gtkrange.c 2006-07-05 12:41:58.000000000 +0200 | ||
3 | @@ -39,7 +39,7 @@ | ||
4 | #include "gtkalias.h" | ||
5 | |||
6 | #define SCROLL_DELAY_FACTOR 5 /* Scroll repeat multiplier */ | ||
7 | -#define UPDATE_DELAY 300 /* Delay for queued update */ | ||
8 | +#define UPDATE_DELAY 1000 /* Delay for queued update */ | ||
9 | |||
10 | enum { | ||
11 | PROP_0, | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/single-click.patch b/meta/packages/gtk+/gtk+-2.10.6/single-click.patch new file mode 100644 index 0000000000..3bb208d4d6 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/single-click.patch | |||
@@ -0,0 +1,54 @@ | |||
1 | diff -urNd ../gtk+-2.6.3-r0.old/gtk+-2.6.3/gtk/gtkcalendar.c gtk+-2.6.3/gtk/gtkcalendar.c | ||
2 | --- ../gtk+-2.6.3-r0.old/gtk+-2.6.3/gtk/gtkcalendar.c 2005-04-06 16:57:04 +01:00 | ||
3 | +++ gtk+-2.6.3/gtk/gtkcalendar.c 2005-04-06 20:05:18 +01:00 | ||
4 | @@ -1023,9 +1023,11 @@ | ||
5 | } | ||
6 | |||
7 | gtk_calendar_select_and_focus_day (calendar, day); | ||
8 | - } | ||
9 | + | ||
10 | + // This change causes the calendar to disappear after choosing a day | ||
11 | +/* } | ||
12 | else if (event->type == GDK_2BUTTON_PRESS) | ||
13 | - { | ||
14 | + {*/ | ||
15 | private_data->in_drag = 0; | ||
16 | if (day_month == MONTH_CURRENT) | ||
17 | g_signal_emit (calendar, | ||
18 | diff -urNd ../gtk+-2.6.3-r0.old/gtk+-2.6.3/gtk/gtkfilesel.c gtk+-2.6.3/gtk/gtkfilesel.c | ||
19 | --- ../gtk+-2.6.3-r0.old/gtk+-2.6.3/gtk/gtkfilesel.c 2005-04-06 16:57:07 +01:00 | ||
20 | +++ gtk+-2.6.3/gtk/gtkfilesel.c 2005-04-07 13:40:32 +01:00 | ||
21 | @@ -2468,6 +2468,33 @@ | ||
22 | if (fs->last_selected != NULL) | ||
23 | g_free (fs->last_selected); | ||
24 | |||
25 | + // Single-click directory entry | ||
26 | + if (new_names->len == 1) | ||
27 | + { | ||
28 | + GtkTreeView *tree_view; | ||
29 | + GtkTreeModel *model; | ||
30 | + GtkTreePath *path; | ||
31 | + GtkTreeIter iter; | ||
32 | + gboolean is_file; | ||
33 | + | ||
34 | + tree_view = gtk_tree_selection_get_tree_view (selection); | ||
35 | + | ||
36 | + if (gtk_tree_selection_get_selected (selection, &model, &iter)) | ||
37 | + { | ||
38 | + path = gtk_tree_model_get_path (model, &iter); | ||
39 | + gtk_tree_model_get (model, &iter, ISFILE_COLUMN, &is_file, -1); | ||
40 | + | ||
41 | + if (!is_file) | ||
42 | + { | ||
43 | + gtk_file_selection_dir_activate (tree_view, path, | ||
44 | + gtk_tree_view_get_column (tree_view, DIR_COLUMN), | ||
45 | + user_data); | ||
46 | + } | ||
47 | + | ||
48 | + gtk_tree_path_free (path); | ||
49 | + } | ||
50 | + } | ||
51 | + | ||
52 | fs->last_selected = g_strdup (g_ptr_array_index (new_names, index)); | ||
53 | filename = get_real_filename (fs->last_selected, FALSE); | ||
54 | |||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/small-gtkfilesel.patch b/meta/packages/gtk+/gtk+-2.10.6/small-gtkfilesel.patch new file mode 100644 index 0000000000..20bf4cf366 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/small-gtkfilesel.patch | |||
@@ -0,0 +1,267 @@ | |||
1 | diff -urNd ../gtk+-2.4.4-r5/gtk+-2.4.4/gtk/gtkfilesel.c gtk+-2.4.4/gtk/gtkfilesel.c | ||
2 | --- ../gtk+-2.4.4-r5/gtk+-2.4.4/gtk/gtkfilesel.c 2004-07-10 05:02:10.000000000 +0100 | ||
3 | +++ gtk+-2.4.4/gtk/gtkfilesel.c 2004-09-13 13:40:09.000000000 +0100 | ||
4 | @@ -68,6 +68,7 @@ | ||
5 | #include "gtkprivate.h" | ||
6 | #include "gtkscrolledwindow.h" | ||
7 | #include "gtkstock.h" | ||
8 | +#include "gtksignal.h" | ||
9 | #include "gtktreeselection.h" | ||
10 | #include "gtktreeview.h" | ||
11 | #include "gtkvbox.h" | ||
12 | @@ -77,6 +78,7 @@ | ||
13 | #include "gtkmessagedialog.h" | ||
14 | #include "gtkdnd.h" | ||
15 | #include "gtkeventbox.h" | ||
16 | +#include "gtkimage.h" | ||
17 | |||
18 | #undef GTK_DISABLE_DEPRECATED | ||
19 | #include "gtkoptionmenu.h" | ||
20 | @@ -245,7 +247,8 @@ | ||
21 | }; | ||
22 | |||
23 | enum { | ||
24 | - DIR_COLUMN | ||
25 | + DIR_COLUMN, | ||
26 | + ISFILE_COLUMN | ||
27 | }; | ||
28 | |||
29 | enum { | ||
30 | @@ -400,6 +403,12 @@ | ||
31 | GtkTreePath *path, | ||
32 | GtkTreeViewColumn *column, | ||
33 | gpointer user_data); | ||
34 | + | ||
35 | +static void gtk_file_selection_activate (GtkTreeView *tree_view, | ||
36 | + GtkTreePath *path, | ||
37 | + GtkTreeViewColumn *column, | ||
38 | + gpointer user_data); | ||
39 | + | ||
40 | static void gtk_file_selection_file_changed (GtkTreeSelection *selection, | ||
41 | gpointer user_data); | ||
42 | static void gtk_file_selection_dir_activate (GtkTreeView *tree_view, | ||
43 | @@ -419,6 +428,7 @@ | ||
44 | static void gtk_file_selection_create_dir (GtkWidget *widget, gpointer data); | ||
45 | static void gtk_file_selection_delete_file (GtkWidget *widget, gpointer data); | ||
46 | static void gtk_file_selection_rename_file (GtkWidget *widget, gpointer data); | ||
47 | +static void gtk_file_selection_style_set (GtkWidget *widget, GtkStyle *prev_style); | ||
48 | |||
49 | static void free_selected_names (GPtrArray *names); | ||
50 | |||
51 | @@ -578,6 +588,23 @@ | ||
52 | G_PARAM_WRITABLE)); | ||
53 | object_class->destroy = gtk_file_selection_destroy; | ||
54 | widget_class->map = gtk_file_selection_map; | ||
55 | + widget_class->style_set = gtk_file_selection_style_set; | ||
56 | + | ||
57 | + gtk_widget_class_install_style_property (widget_class, | ||
58 | + g_param_spec_boolean ("show_fileops_default", | ||
59 | + _("Show fileop buttons by default"), | ||
60 | + _("Whether file operation buttons are shown by default"), | ||
61 | + TRUE, | ||
62 | + G_PARAM_READABLE)); | ||
63 | + | ||
64 | + gtk_widget_class_install_style_property (widget_class, | ||
65 | + g_param_spec_int ("border_width", | ||
66 | + _("Border width"), | ||
67 | + _("Width of border around the main dialog area"), | ||
68 | + 0, | ||
69 | + G_MAXINT, | ||
70 | + 10, | ||
71 | + G_PARAM_READABLE)); | ||
72 | } | ||
73 | |||
74 | static void gtk_file_selection_set_property (GObject *object, | ||
75 | @@ -649,7 +676,29 @@ | ||
76 | gtk_widget_grab_default (widget); | ||
77 | return FALSE; | ||
78 | } | ||
79 | - | ||
80 | + | ||
81 | +static void | ||
82 | +gtk_file_selection_style_set (GtkWidget *filesel, | ||
83 | + GtkStyle *prev_style) | ||
84 | +{ | ||
85 | + gboolean show_fileops; | ||
86 | + gint border_width; | ||
87 | + | ||
88 | + gtk_widget_style_get (filesel, | ||
89 | + "show_fileops_default", | ||
90 | + &show_fileops, | ||
91 | + "border_width", | ||
92 | + &border_width, | ||
93 | + NULL); | ||
94 | + | ||
95 | + gtk_container_set_border_width (GTK_CONTAINER (filesel), border_width); | ||
96 | + | ||
97 | + if (show_fileops) | ||
98 | + gtk_file_selection_show_fileop_buttons (GTK_FILE_SELECTION (filesel)); | ||
99 | + else | ||
100 | + gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (filesel)); | ||
101 | +} | ||
102 | + | ||
103 | static void | ||
104 | gtk_file_selection_init (GtkFileSelection *filesel) | ||
105 | { | ||
106 | @@ -674,17 +723,15 @@ | ||
107 | |||
108 | /* The dialog-sized vertical box */ | ||
109 | filesel->main_vbox = dialog->vbox; | ||
110 | - gtk_container_set_border_width (GTK_CONTAINER (filesel), 10); | ||
111 | |||
112 | /* The horizontal box containing create, rename etc. buttons */ | ||
113 | filesel->button_area = gtk_hbutton_box_new (); | ||
114 | gtk_button_box_set_layout (GTK_BUTTON_BOX (filesel->button_area), GTK_BUTTONBOX_START); | ||
115 | - gtk_box_set_spacing (GTK_BOX (filesel->button_area), 0); | ||
116 | gtk_box_pack_start (GTK_BOX (filesel->main_vbox), filesel->button_area, | ||
117 | FALSE, FALSE, 0); | ||
118 | gtk_widget_show (filesel->button_area); | ||
119 | |||
120 | - gtk_file_selection_show_fileop_buttons (filesel); | ||
121 | + gtk_file_selection_style_set (GTK_WIDGET (filesel), NULL); | ||
122 | |||
123 | /* hbox for pulldown menu */ | ||
124 | pulldown_hbox = gtk_hbox_new (TRUE, 5); | ||
125 | @@ -723,25 +770,32 @@ | ||
126 | |||
127 | /* The directories list */ | ||
128 | |||
129 | - model = gtk_list_store_new (1, G_TYPE_STRING); | ||
130 | + model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN); /* MA */ | ||
131 | filesel->dir_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); | ||
132 | g_object_unref (model); | ||
133 | |||
134 | - column = gtk_tree_view_column_new_with_attributes (_("Folders"), | ||
135 | + column = gtk_tree_view_column_new_with_attributes (/*_("Folders")*/ NULL, | ||
136 | gtk_cell_renderer_text_new (), | ||
137 | "text", DIR_COLUMN, | ||
138 | NULL); | ||
139 | label = gtk_label_new_with_mnemonic (_("Fol_ders")); | ||
140 | gtk_label_set_mnemonic_widget (GTK_LABEL (label), filesel->dir_list); | ||
141 | gtk_widget_show (label); | ||
142 | - gtk_tree_view_column_set_widget (column, label); | ||
143 | + | ||
144 | + /* gtk_tree_view_column_set_widget (column, label); */ | ||
145 | + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (filesel->dir_list), FALSE); | ||
146 | + | ||
147 | gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); | ||
148 | gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->dir_list), column); | ||
149 | |||
150 | gtk_widget_set_size_request (filesel->dir_list, | ||
151 | DIR_LIST_WIDTH, DIR_LIST_HEIGHT); | ||
152 | g_signal_connect (filesel->dir_list, "row_activated", | ||
153 | - G_CALLBACK (gtk_file_selection_dir_activate), filesel); | ||
154 | + G_CALLBACK (gtk_file_selection_activate), filesel); | ||
155 | + | ||
156 | + g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (filesel->dir_list)), "changed", | ||
157 | + G_CALLBACK (gtk_file_selection_file_changed), filesel); | ||
158 | + | ||
159 | |||
160 | /* gtk_clist_column_titles_passive (GTK_CLIST (filesel->dir_list)); */ | ||
161 | |||
162 | @@ -758,41 +812,6 @@ | ||
163 | gtk_widget_show (filesel->dir_list); | ||
164 | gtk_widget_show (scrolled_win); | ||
165 | |||
166 | - /* The files list */ | ||
167 | - model = gtk_list_store_new (1, G_TYPE_STRING); | ||
168 | - filesel->file_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); | ||
169 | - g_object_unref (model); | ||
170 | - | ||
171 | - column = gtk_tree_view_column_new_with_attributes (_("Files"), | ||
172 | - gtk_cell_renderer_text_new (), | ||
173 | - "text", FILE_COLUMN, | ||
174 | - NULL); | ||
175 | - label = gtk_label_new_with_mnemonic (_("_Files")); | ||
176 | - gtk_label_set_mnemonic_widget (GTK_LABEL (label), filesel->file_list); | ||
177 | - gtk_widget_show (label); | ||
178 | - gtk_tree_view_column_set_widget (column, label); | ||
179 | - gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); | ||
180 | - gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->file_list), column); | ||
181 | - | ||
182 | - gtk_widget_set_size_request (filesel->file_list, | ||
183 | - FILE_LIST_WIDTH, FILE_LIST_HEIGHT); | ||
184 | - g_signal_connect (filesel->file_list, "row_activated", | ||
185 | - G_CALLBACK (gtk_file_selection_file_activate), filesel); | ||
186 | - g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (filesel->file_list)), "changed", | ||
187 | - G_CALLBACK (gtk_file_selection_file_changed), filesel); | ||
188 | - | ||
189 | - /* gtk_clist_column_titles_passive (GTK_CLIST (filesel->file_list)); */ | ||
190 | - | ||
191 | - scrolled_win = gtk_scrolled_window_new (NULL, NULL); | ||
192 | - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN); | ||
193 | - gtk_container_add (GTK_CONTAINER (scrolled_win), filesel->file_list); | ||
194 | - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), | ||
195 | - GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | ||
196 | - gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 0); | ||
197 | - gtk_container_add (GTK_CONTAINER (list_container), scrolled_win); | ||
198 | - gtk_widget_show (filesel->file_list); | ||
199 | - gtk_widget_show (scrolled_win); | ||
200 | - | ||
201 | /* action area for packing buttons into. */ | ||
202 | filesel->action_area = gtk_hbox_new (TRUE, 0); | ||
203 | gtk_box_pack_start (GTK_BOX (filesel->main_vbox), filesel->action_area, | ||
204 | @@ -2008,6 +2027,23 @@ | ||
205 | } | ||
206 | |||
207 | static void | ||
208 | +gtk_file_selection_activate (GtkTreeView *tree_view, | ||
209 | + GtkTreePath *path, | ||
210 | + GtkTreeViewColumn *column, | ||
211 | + gpointer user_data) | ||
212 | +{ | ||
213 | + GtkTreeModel *model = gtk_tree_view_get_model (tree_view); | ||
214 | + GtkTreeIter iter; | ||
215 | + gboolean is_file; | ||
216 | + | ||
217 | + gtk_tree_model_get_iter (model, &iter, path); | ||
218 | + gtk_tree_model_get (model, &iter, ISFILE_COLUMN, &is_file, -1); | ||
219 | + | ||
220 | + if (! is_file) | ||
221 | + gtk_file_selection_dir_activate (tree_view, path, column, user_data); | ||
222 | +} | ||
223 | + | ||
224 | +static void | ||
225 | gtk_file_selection_file_activate (GtkTreeView *tree_view, | ||
226 | GtkTreePath *path, | ||
227 | GtkTreeViewColumn *column, | ||
228 | @@ -2103,7 +2139,6 @@ | ||
229 | PossibleCompletion* poss; | ||
230 | GtkTreeIter iter; | ||
231 | GtkListStore *dir_model; | ||
232 | - GtkListStore *file_model; | ||
233 | gchar* filename; | ||
234 | gchar* rem_path = rel_path; | ||
235 | gchar* sel_text; | ||
236 | @@ -2125,10 +2160,8 @@ | ||
237 | g_assert (cmpl_state->reference_dir); | ||
238 | |||
239 | dir_model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fs->dir_list))); | ||
240 | - file_model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fs->file_list))); | ||
241 | |||
242 | gtk_list_store_clear (dir_model); | ||
243 | - gtk_list_store_clear (file_model); | ||
244 | |||
245 | /* Set the dir list to include ./ and ../ */ | ||
246 | gtk_list_store_append (dir_model, &iter); | ||
247 | @@ -2150,13 +2183,17 @@ | ||
248 | strcmp (filename, ".." G_DIR_SEPARATOR_S) != 0) | ||
249 | { | ||
250 | gtk_list_store_append (dir_model, &iter); | ||
251 | - gtk_list_store_set (dir_model, &iter, DIR_COLUMN, filename, -1); | ||
252 | + gtk_list_store_set (dir_model, &iter, | ||
253 | + DIR_COLUMN, filename, | ||
254 | + ISFILE_COLUMN, FALSE, -1); | ||
255 | } | ||
256 | } | ||
257 | else | ||
258 | { | ||
259 | - gtk_list_store_append (file_model, &iter); | ||
260 | - gtk_list_store_set (file_model, &iter, DIR_COLUMN, filename, -1); | ||
261 | + gtk_list_store_append (dir_model, &iter); | ||
262 | + gtk_list_store_set (dir_model, &iter, | ||
263 | + DIR_COLUMN, filename, | ||
264 | + ISFILE_COLUMN, TRUE, -1); | ||
265 | } | ||
266 | } | ||
267 | |||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/spinbutton.patch b/meta/packages/gtk+/gtk+-2.10.6/spinbutton.patch new file mode 100644 index 0000000000..8ad7507af0 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/spinbutton.patch | |||
@@ -0,0 +1,128 @@ | |||
1 | --- gtk+-2.4.3/gtk/gtkspinbutton.c.old 2004-04-22 14:49:27.000000000 +0100 | ||
2 | +++ gtk+-2.4.3/gtk/gtkspinbutton.c 2004-06-30 21:48:18.000000000 +0100 | ||
3 | @@ -733,7 +733,7 @@ | ||
4 | |||
5 | spin = GTK_SPIN_BUTTON (widget); | ||
6 | arrow_size = spin_button_get_arrow_size (spin); | ||
7 | - panel_width = arrow_size + 2 * widget->style->xthickness; | ||
8 | + panel_width = (2 * arrow_size) + 4 * widget->style->xthickness; | ||
9 | |||
10 | widget->allocation = *allocation; | ||
11 | |||
12 | @@ -866,19 +866,16 @@ | ||
13 | { | ||
14 | width = spin_button_get_arrow_size (spin_button) + 2 * widget->style->xthickness; | ||
15 | |||
16 | + y = widget->style->ythickness; | ||
17 | + height = widget->requisition.height - (2 * y); | ||
18 | + | ||
19 | if (arrow_type == GTK_ARROW_UP) | ||
20 | { | ||
21 | x = 0; | ||
22 | - y = 0; | ||
23 | - | ||
24 | - height = widget->requisition.height / 2; | ||
25 | } | ||
26 | else | ||
27 | { | ||
28 | - x = 0; | ||
29 | - y = widget->requisition.height / 2; | ||
30 | - | ||
31 | - height = (widget->requisition.height + 1) / 2; | ||
32 | + x = width; | ||
33 | } | ||
34 | |||
35 | if (spin_button_at_limit (spin_button, arrow_type)) | ||
36 | @@ -908,32 +905,17 @@ | ||
37 | shadow_type = GTK_SHADOW_OUT; | ||
38 | } | ||
39 | } | ||
40 | - | ||
41 | + | ||
42 | gtk_paint_box (widget->style, spin_button->panel, | ||
43 | state_type, shadow_type, | ||
44 | NULL, widget, | ||
45 | - (arrow_type == GTK_ARROW_UP)? "spinbutton_up" : "spinbutton_down", | ||
46 | + NULL, | ||
47 | x, y, width, height); | ||
48 | |||
49 | height = widget->requisition.height; | ||
50 | |||
51 | - if (arrow_type == GTK_ARROW_DOWN) | ||
52 | - { | ||
53 | - y = height / 2; | ||
54 | - height = height - y - 2; | ||
55 | - } | ||
56 | - else | ||
57 | - { | ||
58 | - y = 2; | ||
59 | - height = height / 2 - 2; | ||
60 | - } | ||
61 | - | ||
62 | width -= 3; | ||
63 | - | ||
64 | - if (widget && gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) | ||
65 | - x = 2; | ||
66 | - else | ||
67 | - x = 1; | ||
68 | + height -= 3; | ||
69 | |||
70 | w = width / 2; | ||
71 | w -= w % 2 - 1; /* force odd */ | ||
72 | @@ -1108,7 +1090,7 @@ | ||
73 | if (GTK_ENTRY (widget)->editable) | ||
74 | gtk_spin_button_update (spin); | ||
75 | |||
76 | - if (event->y <= widget->requisition.height / 2) | ||
77 | + if (event->x <= (spin_button_get_arrow_size (spin) + widget->style->xthickness)) | ||
78 | { | ||
79 | if (event->button == 1) | ||
80 | start_spinning (spin, GTK_ARROW_UP, spin->adjustment->step_increment); | ||
81 | @@ -1143,44 +1125,11 @@ | ||
82 | |||
83 | arrow_size = spin_button_get_arrow_size (spin); | ||
84 | |||
85 | - if (event->button == spin->button) | ||
86 | - { | ||
87 | - int click_child = spin->click_child; | ||
88 | + gtk_spin_button_stop_spinning (spin); | ||
89 | |||
90 | - gtk_spin_button_stop_spinning (spin); | ||
91 | - | ||
92 | - if (event->button == 3) | ||
93 | - { | ||
94 | - if (event->y >= 0 && event->x >= 0 && | ||
95 | - event->y <= widget->requisition.height && | ||
96 | - event->x <= arrow_size + 2 * widget->style->xthickness) | ||
97 | - { | ||
98 | - if (click_child == GTK_ARROW_UP && | ||
99 | - event->y <= widget->requisition.height / 2) | ||
100 | - { | ||
101 | - gdouble diff; | ||
102 | - | ||
103 | - diff = spin->adjustment->upper - spin->adjustment->value; | ||
104 | - if (diff > EPSILON) | ||
105 | - gtk_spin_button_real_spin (spin, diff); | ||
106 | - } | ||
107 | - else if (click_child == GTK_ARROW_DOWN && | ||
108 | - event->y > widget->requisition.height / 2) | ||
109 | - { | ||
110 | - gdouble diff; | ||
111 | - | ||
112 | - diff = spin->adjustment->value - spin->adjustment->lower; | ||
113 | - if (diff > EPSILON) | ||
114 | - gtk_spin_button_real_spin (spin, -diff); | ||
115 | - } | ||
116 | - } | ||
117 | - } | ||
118 | - spin_button_redraw (spin); | ||
119 | + spin_button_redraw (spin); | ||
120 | |||
121 | - return TRUE; | ||
122 | - } | ||
123 | - else | ||
124 | - return GTK_WIDGET_CLASS (parent_class)->button_release_event (widget, event); | ||
125 | + return TRUE; | ||
126 | } | ||
127 | |||
128 | static gint | ||
diff --git a/meta/packages/gtk+/gtk+-2.10.6/xsettings.patch b/meta/packages/gtk+/gtk+-2.10.6/xsettings.patch new file mode 100644 index 0000000000..b63e262d34 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.6/xsettings.patch | |||
@@ -0,0 +1,16 @@ | |||
1 | --- gtk+-2.4.4/gdk/x11/gdkevents-x11.c.old Sun Aug 22 17:14:00 2004 | ||
2 | +++ gtk+-2.4.4/gdk/x11/gdkevents-x11.c Sun Aug 22 17:14:00 2004 | ||
3 | @@ -2827,10 +2827,9 @@ | ||
4 | { | ||
5 | GdkScreenX11 *screen = data; | ||
6 | |||
7 | - if (xsettings_client_process_event (screen->xsettings_client, (XEvent *)xevent)) | ||
8 | - return GDK_FILTER_REMOVE; | ||
9 | - else | ||
10 | - return GDK_FILTER_CONTINUE; | ||
11 | + xsettings_client_process_event (screen->xsettings_client, (XEvent *)xevent); | ||
12 | + | ||
13 | + return GDK_FILTER_CONTINUE; | ||
14 | } | ||
15 | |||
16 | static void | ||
diff --git a/meta/packages/gtk+/gtk+_2.10.6.bb b/meta/packages/gtk+/gtk+_2.10.6.bb new file mode 100644 index 0000000000..c1fd971295 --- /dev/null +++ b/meta/packages/gtk+/gtk+_2.10.6.bb | |||
@@ -0,0 +1,104 @@ | |||
1 | LICENSE = "LGPL" | ||
2 | DESCRIPTION = "GTK+ is a multi-platform toolkit for creating graphical user interfaces. Offering a complete \ | ||
3 | set of widgets, GTK+ is suitable for projects ranging from small one-off projects to complete application suites." | ||
4 | HOMEPAGE = "http://www.gtk.org" | ||
5 | SECTION = "libs" | ||
6 | PRIORITY = "optional" | ||
7 | DEPENDS = "glib-2.0 pango atk jpeg libpng libxext libxcursor gtk-doc libgcrypt cairo cups" | ||
8 | PR = "r2" | ||
9 | |||
10 | # disable per default - untested and not all patches included. | ||
11 | DEFAULT_PREFERENCE = "-1" | ||
12 | |||
13 | SRC_URI = "ftp://ftp.gtk.org/pub/gtk/v2.10/gtk+-${PV}.tar.bz2 \ | ||
14 | file://no-xwc.patch;patch=1 \ | ||
15 | file://automake-lossage.patch;patch=1 \ | ||
16 | file://disable-tooltips.patch;patch=1 \ | ||
17 | file://gtklabel-resize-patch;patch=1 \ | ||
18 | file://menu-deactivate.patch;patch=1 \ | ||
19 | file://xsettings.patch;patch=1 \ | ||
20 | file://scroll-timings.patch;patch=1 \ | ||
21 | file://small-gtkfilesel.patch;patch=1 \ | ||
22 | file://migration.patch;patch=1;pnum=0 \ | ||
23 | file://run-iconcache.patch;patch=1 \ | ||
24 | file://disable-print.patch;patch=1 \ | ||
25 | file://hardcoded_libtool.patch;patch=1 \ | ||
26 | file://no-demos.patch;patch=1 \ | ||
27 | file://pangoxft2.10.6.diff;patch=1" | ||
28 | # file://gtk+-handhelds.patch;patch=1 | ||
29 | # file://single-click.patch;patch=1 | ||
30 | # file://spinbutton.patch;patch=1 \ | ||
31 | |||
32 | inherit autotools pkgconfig | ||
33 | |||
34 | FILES_${PN} = "${bindir}/gdk-pixbuf-query-loaders \ | ||
35 | ${bindir}/gtk-update-icon-cache \ | ||
36 | ${bindir}/gtk-query-immodules-2.0 \ | ||
37 | ${libdir}/lib*.so.* \ | ||
38 | ${datadir}/themes ${sysconfdir} \ | ||
39 | ${libdir}/gtk-2.0/${LIBV}/engines/libpixmap.so" | ||
40 | FILES_${PN}-dev += " \ | ||
41 | ${datadir}/gtk-2.0/include \ | ||
42 | ${libdir}/gtk-2.0/include \ | ||
43 | ${libdir}/gtk-2.0/${LIBV}/loaders/*.la \ | ||
44 | ${libdir}/gtk-2.0/${LIBV}/immodules/*.la \ | ||
45 | ${libdir}/gtk-2.0/${LIBV}/engines/*.la \ | ||
46 | ${bindir}/gdk-pixbuf-csource" | ||
47 | FILES_${PN}-dbg += " \ | ||
48 | ${libdir}/gtk-2.0/${LIBV}/loaders/.debug/* \ | ||
49 | ${libdir}/gtk-2.0/${LIBV}/immodules/.debug/* \ | ||
50 | ${libdir}/gtk-2.0/${LIBV}/engines/.debug/*" | ||
51 | |||
52 | |||
53 | RRECOMMENDS_${PN} = "glibc-gconv-iso8859-1 ttf-dejavu-sans" | ||
54 | RRECOMMENDS_${PN}_angstrom = "glibc-gconv-iso8859-1 ttf-dejavu-sans gdk-pixbuf-loader-png gdk-pixbuf-loader-jpeg gdk-pixbuf-loader-gif gdk-pixbuf-loader-xpm" | ||
55 | RRECOMMENDS_${PN}_openzaurus = "glibc-gconv-iso8859-1 ttf-dejavu-sans gdk-pixbuf-loader-png gdk-pixbuf-loader-jpeg gdk-pixbuf-loader-gif gdk-pixbuf-loader-xpm" | ||
56 | |||
57 | EXTRA_OECONF = "--without-libtiff --disable-xkb --disable-glibtest --enable-display-migration" | ||
58 | |||
59 | LIBV = "2.10.0" | ||
60 | |||
61 | do_stage () { | ||
62 | oe_libinstall -so -C gtk libgtk-x11-2.0 ${STAGING_LIBDIR} | ||
63 | oe_libinstall -so -C gdk libgdk-x11-2.0 ${STAGING_LIBDIR} | ||
64 | oe_libinstall -so -C contrib/gdk-pixbuf-xlib libgdk_pixbuf_xlib-2.0 ${STAGING_LIBDIR} | ||
65 | oe_libinstall -so -C gdk-pixbuf libgdk_pixbuf-2.0 ${STAGING_LIBDIR} | ||
66 | |||
67 | autotools_stage_includes | ||
68 | |||
69 | mkdir -p ${STAGING_LIBDIR}/gtk-2.0/include | ||
70 | install -m 0644 gdk/gdkconfig.h ${STAGING_LIBDIR}/gtk-2.0/include/gdkconfig.h | ||
71 | |||
72 | install -m 0644 m4macros/gtk-2.0.m4 ${STAGING_DATADIR}/aclocal/ | ||
73 | } | ||
74 | |||
75 | do_install_append () { | ||
76 | install -d ${D}${sysconfdir}/gtk-2.0 | ||
77 | } | ||
78 | |||
79 | postinst_prologue() { | ||
80 | if [ "x$D" != "x" ]; then | ||
81 | exit 1 | ||
82 | fi | ||
83 | |||
84 | } | ||
85 | |||
86 | PACKAGES_DYNAMIC = "gdk-pixbuf-loader-* gtk-immodule-* gtk-printbackend-*" | ||
87 | |||
88 | python populate_packages_prepend () { | ||
89 | import os.path | ||
90 | |||
91 | prologue = bb.data.getVar("postinst_prologue", d, 1) | ||
92 | |||
93 | gtk_libdir = bb.data.expand('${libdir}/gtk-2.0/${LIBV}', d) | ||
94 | loaders_root = os.path.join(gtk_libdir, 'loaders') | ||
95 | immodules_root = os.path.join(gtk_libdir, 'immodules') | ||
96 | printmodules_root = os.path.join(gtk_libdir, 'printbackends'); | ||
97 | |||
98 | do_split_packages(d, loaders_root, '^libpixbufloader-(.*)\.so$', 'gdk-pixbuf-loader-%s', 'GDK pixbuf loader for %s', prologue + 'gdk-pixbuf-query-loaders > /etc/gtk-2.0/gdk-pixbuf.loaders') | ||
99 | do_split_packages(d, immodules_root, '^im-(.*)\.so$', 'gtk-immodule-%s', 'GTK input module for %s', prologue + 'gtk-query-immodules > /etc/gtk-2.0/gtk.immodules') | ||
100 | do_split_packages(d, printmodules_root, '^libprintbackend-(.*)\.so$', 'gtk-printbackend-%s', 'GTK printbackend module for %s') | ||
101 | |||
102 | if (bb.data.getVar('DEBIAN_NAMES', d, 1)): | ||
103 | bb.data.setVar('PKG_${PN}', 'libgtk-2.0', d) | ||
104 | } | ||