summaryrefslogtreecommitdiffstats
path: root/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff
diff options
context:
space:
mode:
Diffstat (limited to 'meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff')
-rw-r--r--meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff471
1 files changed, 471 insertions, 0 deletions
diff --git a/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff b/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff
new file mode 100644
index 0000000000..e5a007372a
--- /dev/null
+++ b/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff
@@ -0,0 +1,471 @@
1--- gtk+-2.6.4/gtk/gtkbutton.c 2005-01-25 22:54:43.000000000 +0200
2+++ gtk+-2.6.4/gtk/gtkbutton.c 2005-04-06 16:19:36.249027672 +0300
3@@ -24,6 +24,10 @@
4 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
5 */
6
7+/* Modified for Nokia Oyj during 2002-2005. See CHANGES file for list
8+ * of changes.
9+ */
10+
11 #include <config.h>
12 #include <string.h>
13 #include "gtkalias.h"
14@@ -38,8 +42,33 @@
15 #include "gtkiconfactory.h"
16 #include "gtkintl.h"
17
18+/* Osso addition:
19+ * Here are the details for each attach
20+ * bitmask combination. */
21+const gchar *osso_gtk_button_attach_details [OSSO_GTK_BUTTON_ATTACH_ENUM_END] =
22+ { "osso_button",
23+ "osso_button_n",
24+ "osso_button_e",
25+ "osso_button_ne",
26+ "osso_button_s",
27+ "osso_button_ns",
28+ "osso_button_es",
29+ "osso_button_nes",
30+ "osso_button_w",
31+ "osso_button_nw",
32+ "osso_button_ew",
33+ "osso_button_new",
34+ "osso_button_sw",
35+ "osso_button_nsw",
36+ "osso_button_esw",
37+ "osso_button_nesw",
38+ };
39+
40 #define CHILD_SPACING 1
41
42+/* Take this away after font drawing is fixed */
43+#define OSSO_FONT_HACK TRUE
44+
45 static const GtkBorder default_default_border = { 1, 1, 1, 1 };
46 static const GtkBorder default_default_outside_border = { 0, 0, 0, 0 };
47
48@@ -68,6 +97,9 @@
49 PROP_FOCUS_ON_CLICK,
50 PROP_XALIGN,
51 PROP_YALIGN,
52+ PROP_DETAIL,
53+ PROP_AUTOMATIC_DETAIL,
54+ PROP_KEYBOARD_BUTTON
55 };
56
57 #define GTK_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_BUTTON, GtkButtonPrivate))
58@@ -80,6 +112,10 @@
59 GtkWidget *image;
60 guint align_set : 1;
61 guint image_is_stock : 1;
62+ gchar *detail;
63+ gboolean automatic_detail;
64+ gboolean keyboard_button;
65+ GtkLabel *keyboard_label;
66 };
67
68 static void gtk_button_class_init (GtkButtonClass *klass);
69@@ -231,6 +267,14 @@
70 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
71
72 g_object_class_install_property (gobject_class,
73+ PROP_KEYBOARD_BUTTON,
74+ g_param_spec_boolean ("keyboard_button",
75+ P_("Keyboard button"),
76+ P_("If set, label foo"),
77+ FALSE,
78+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
79+
80+ g_object_class_install_property (gobject_class,
81 PROP_USE_STOCK,
82 g_param_spec_boolean ("use_stock",
83 P_("Use stock"),
84@@ -418,6 +462,77 @@
85 P_("Whether stock icons should be shown in buttons"),
86 TRUE,
87 G_PARAM_READWRITE));
88+
89+ gtk_widget_class_install_style_property (widget_class,
90+ g_param_spec_int ("child_spacing",
91+ _("Child spacing"),
92+ _("Spacing between button edges and child."),
93+ 0,
94+ G_MAXINT,
95+ CHILD_SPACING,
96+ G_PARAM_READABLE));
97+ /* Osso additions below */
98+ g_object_class_install_property (gobject_class,
99+ PROP_DETAIL,
100+ g_param_spec_string ("detail",
101+ P_("Detail"),
102+ P_("The detail the button is drawn with."),
103+ "buttondefault",
104+ G_PARAM_READWRITE));
105+
106+ g_object_class_install_property (gobject_class,
107+ PROP_AUTOMATIC_DETAIL,
108+ g_param_spec_boolean ("automatic_detail",
109+ P_("Automatic Detail"),
110+ P_("Whether setting detail is automatic based on GtkTable/GtkHButtonBox."),
111+ TRUE,
112+ G_PARAM_READWRITE));
113+
114+
115+ gtk_widget_class_install_style_property (widget_class,
116+ g_param_spec_int ("child_offset_y",
117+ _("Child Y Offset"),
118+ _("Enable hack how many pixels to add/take away from GtkButton's child size allocation."),
119+ G_MININT,
120+ G_MAXINT,
121+ 0,
122+ G_PARAM_READABLE));
123+
124+ /* OSSO: This is used to find out whether
125+ * button is a GtkTreeView column Listbox
126+ * header or not */
127+ gtk_widget_class_install_style_property (widget_class,
128+ g_param_spec_boolean ("listboxheader",
129+ P_( "Listbox header" ),
130+ P_( "Listbox header ( FALSE / TRUE )" ),
131+ FALSE,
132+ G_PARAM_READABLE));
133+
134+ /* OSSO: Column Listbox header separator height */
135+ gtk_widget_class_install_style_property (widget_class,
136+ g_param_spec_int ("separator-height",
137+ P_( "Separator height" ),
138+ P_( "Listbox header separator height ( FALSE / TRUE )" ),
139+ 0,
140+ G_MAXINT,
141+ 0,
142+ G_PARAM_READABLE));
143+
144+ gtk_widget_class_install_style_property (widget_class,
145+ g_param_spec_boxed ("padding",
146+ P_("Padding"),
147+ P_("Paddings around the button child"),
148+ GTK_TYPE_BORDER,
149+ G_PARAM_READABLE));
150+
151+ gtk_widget_class_install_style_property (widget_class,
152+ g_param_spec_int ("minimum_width",
153+ P_("Minimum Width"),
154+ P_("Minimum width of the button"),
155+ 0,
156+ G_MAXINT,
157+ 0,
158+ G_PARAM_READABLE));
159
160 g_type_class_add_private (gobject_class, sizeof (GtkButtonPrivate));
161 }
162@@ -445,7 +560,14 @@
163 priv->xalign = 0.5;
164 priv->yalign = 0.5;
165 priv->align_set = 0;
166+ priv->detail = g_strdup("buttondefault");
167+ priv->automatic_detail = TRUE;
168+ priv->keyboard_button = FALSE;
169+ priv->keyboard_label = NULL;
170 priv->image_is_stock = TRUE;
171+
172+ g_object_set (G_OBJECT (button), "tap_and_hold_state",
173+ GTK_STATE_ACTIVE, NULL);
174 }
175
176 static void
177@@ -560,6 +682,18 @@
178 case PROP_YALIGN:
179 gtk_button_set_alignment (button, priv->xalign, g_value_get_float (value));
180 break;
181+ case PROP_DETAIL:
182+ if (priv->detail)
183+ g_free (priv->detail);
184+ priv->detail = g_strdup (g_value_get_string (value));
185+ gtk_widget_queue_draw (GTK_WIDGET (button));
186+ break;
187+ case PROP_AUTOMATIC_DETAIL:
188+ priv->automatic_detail = g_value_get_boolean (value);
189+ break;
190+ case PROP_KEYBOARD_BUTTON:
191+ priv->keyboard_button = g_value_get_boolean (value);
192+ break;
193 default:
194 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
195 break;
196@@ -601,6 +735,15 @@
197 case PROP_YALIGN:
198 g_value_set_float (value, priv->yalign);
199 break;
200+ case PROP_DETAIL:
201+ g_value_set_string (value, priv->detail);
202+ break;
203+ case PROP_AUTOMATIC_DETAIL:
204+ g_value_set_boolean (value, priv->automatic_detail);
205+ break;
206+ case PROP_KEYBOARD_BUTTON:
207+ g_value_set_boolean (value, priv->keyboard_button);
208+ break;
209 default:
210 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
211 break;
212@@ -641,6 +784,26 @@
213 if (button->label_text == NULL)
214 return;
215
216+ if (priv->keyboard_button)
217+ {
218+ if (priv->keyboard_label)
219+ {
220+ gtk_label_set_label (priv->keyboard_label, button->label_text);
221+ }
222+ else
223+ {
224+ GtkWidget *label = gtk_label_new (button->label_text);
225+ priv->keyboard_label = GTK_LABEL (label);
226+
227+ if (priv->align_set)
228+ gtk_misc_set_alignment (GTK_MISC (label),
229+ priv->xalign, priv->yalign);
230+ gtk_widget_show (priv->keyboard_label);
231+ gtk_container_add (GTK_CONTAINER (button), label);
232+ }
233+ return;
234+ }
235+
236 if (GTK_BIN (button)->child)
237 {
238 if (priv->image && !priv->image_is_stock)
239@@ -944,16 +1107,20 @@
240 GtkBorder default_border;
241 gint focus_width;
242 gint focus_pad;
243+ gint child_spacing;
244+ gint separator_height;
245
246 gtk_button_get_props (button, &default_border, NULL, NULL);
247 gtk_widget_style_get (GTK_WIDGET (widget),
248 "focus-line-width", &focus_width,
249 "focus-padding", &focus_pad,
250+ "child-spacing", &child_spacing,
251+ "separator-height", &separator_height,
252 NULL);
253
254- requisition->width = (GTK_CONTAINER (widget)->border_width + CHILD_SPACING +
255+ requisition->width = (GTK_CONTAINER (widget)->border_width + child_spacing +
256 GTK_WIDGET (widget)->style->xthickness) * 2;
257- requisition->height = (GTK_CONTAINER (widget)->border_width + CHILD_SPACING +
258+ requisition->height = (GTK_CONTAINER (widget)->border_width + child_spacing +
259 GTK_WIDGET (widget)->style->ythickness) * 2;
260
261 if (GTK_WIDGET_CAN_DEFAULT (widget))
262@@ -965,15 +1132,35 @@
263 if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child))
264 {
265 GtkRequisition child_requisition;
266+ GtkBorder *padding;
267+ gint minimum_width;
268
269 gtk_widget_size_request (GTK_BIN (button)->child, &child_requisition);
270
271+ gtk_widget_style_get (widget,
272+ "padding",
273+ &padding,
274+ "minimum_width",
275+ &minimum_width,
276+ NULL);
277+
278+ if ( padding )
279+ {
280+ requisition->width += padding->left + padding->right;
281+ requisition->height += padding->top + padding->bottom;
282+ }
283+
284 requisition->width += child_requisition.width;
285 requisition->height += child_requisition.height;
286+
287+ if (requisition->width < minimum_width)
288+ requisition->width = minimum_width;
289 }
290
291 requisition->width += 2 * (focus_width + focus_pad);
292 requisition->height += 2 * (focus_width + focus_pad);
293+
294+ requisition->height += separator_height;
295 }
296
297 static void
298@@ -989,14 +1176,15 @@
299 GtkBorder default_border;
300 gint focus_width;
301 gint focus_pad;
302+ gint child_spacing;
303
304 gtk_button_get_props (button, &default_border, NULL, NULL);
305 gtk_widget_style_get (GTK_WIDGET (widget),
306 "focus-line-width", &focus_width,
307 "focus-padding", &focus_pad,
308+ "child-spacing", &child_spacing,
309 NULL);
310-
311-
312+
313 widget->allocation = *allocation;
314
315 if (GTK_WIDGET_REALIZED (widget))
316@@ -1008,14 +1196,27 @@
317
318 if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child))
319 {
320- child_allocation.x = widget->allocation.x + border_width + CHILD_SPACING + xthickness;
321- child_allocation.y = widget->allocation.y + border_width + CHILD_SPACING + ythickness;
322+ child_allocation.x = widget->allocation.x + border_width + child_spacing + xthickness;
323+ child_allocation.y = widget->allocation.y + border_width + child_spacing + ythickness;
324
325- child_allocation.width = MAX (1, widget->allocation.width - (CHILD_SPACING + xthickness) * 2 -
326+ child_allocation.width = MAX (1, widget->allocation.width - (child_spacing + xthickness) * 2 -
327 border_width * 2);
328- child_allocation.height = MAX (1, widget->allocation.height - (CHILD_SPACING + ythickness) * 2 -
329+ child_allocation.height = MAX (1, widget->allocation.height - (child_spacing + ythickness) * 2 -
330 border_width * 2);
331
332+#ifdef OSSO_FONT_HACK
333+ {
334+ gint child_offset_y;
335+
336+ gtk_widget_style_get (widget, "child_offset_y", &child_offset_y, NULL);
337+
338+ if( GTK_IS_LABEL(GTK_BIN (button)->child) )
339+ {
340+ child_allocation.y += child_offset_y;
341+ }
342+ }
343+#endif
344+
345 if (GTK_WIDGET_CAN_DEFAULT (button))
346 {
347 child_allocation.x += default_border.left;
348@@ -1066,7 +1267,14 @@
349 gboolean interior_focus;
350 gint focus_width;
351 gint focus_pad;
352-
353+ gint separator_height;
354+ gboolean listboxheader;
355+ GtkButtonPrivate *priv;
356+
357+ g_return_if_fail (GTK_IS_BUTTON (button));
358+
359+ priv = GTK_BUTTON_GET_PRIVATE (button);
360+
361 if (GTK_WIDGET_DRAWABLE (button))
362 {
363 widget = GTK_WIDGET (button);
364@@ -1076,6 +1284,8 @@
365 gtk_widget_style_get (GTK_WIDGET (widget),
366 "focus-line-width", &focus_width,
367 "focus-padding", &focus_pad,
368+ "listboxheader", &listboxheader,
369+ "separator-height", &separator_height,
370 NULL);
371
372 x = widget->allocation.x + border_width;
373@@ -1083,13 +1293,55 @@
374 width = widget->allocation.width - border_width * 2;
375 height = widget->allocation.height - border_width * 2;
376
377+ if (listboxheader)
378+ {
379+ /* this changes everything! */
380+ PangoLayout *layout;
381+ int layout_height;
382+
383+ /* construct layout - see get_layout in gtkcellrenderertext.c */
384+ layout = gtk_widget_create_pango_layout (widget, /* use parent treeview instead? */
385+ button->label_text);
386+ pango_layout_set_width (layout, -1);
387+ pango_layout_get_pixel_size (layout, NULL, &layout_height);
388+
389+ /* render text */
390+ gtk_paint_layout (widget->style,
391+ widget->window,
392+ GTK_STATE_NORMAL,
393+ TRUE,
394+ area,
395+ widget,
396+ "listboxheader",
397+ x,
398+ y,
399+ layout);
400+
401+ g_object_unref (layout);
402+
403+ /* draw separator */
404+ gtk_paint_hline (widget->style,
405+ widget->window,
406+ GTK_STATE_NORMAL,
407+ area,
408+ widget,
409+ "listboxseparator",
410+ area->x - focus_width - focus_pad,
411+ area->x + area->width + focus_width + focus_pad,
412+ layout_height + separator_height * 2);
413+ return;
414+ }
415+
416 if (GTK_WIDGET_HAS_DEFAULT (widget) &&
417 GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL)
418 {
419- gtk_paint_box (widget->style, widget->window,
420+ /* This comment is here because it's part of the
421+ * normal GtkButton
422+ */
423+ /* gtk_paint_box (widget->style, widget->window,
424 GTK_STATE_NORMAL, GTK_SHADOW_IN,
425 area, widget, "buttondefault",
426- x, y, width, height);
427+ x, y, width, height); */
428
429 x += default_border.left;
430 y += default_border.top;
431@@ -1116,7 +1368,7 @@
432 GTK_WIDGET_STATE(widget) == GTK_STATE_PRELIGHT)
433 gtk_paint_box (widget->style, widget->window,
434 state_type,
435- shadow_type, area, widget, "button",
436+ shadow_type, area, widget, priv->detail,
437 x, y, width, height);
438
439 if (GTK_WIDGET_HAS_FOCUS (widget))
440@@ -1151,10 +1403,14 @@
441 x += child_displacement_x;
442 y += child_displacement_y;
443 }
444-
445+ /* Comment exists, because it is part of normal GtkButton
446 gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget),
447 area, widget, "button",
448 x, y, width, height);
449+ */
450+ gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget),
451+ area, widget, priv->detail,
452+ x, y, width, height);
453 }
454 }
455 }
456@@ -1786,5 +2042,13 @@
457
458 return priv->image;
459 }
460-
461-
462+void osso_gtk_button_set_detail_from_attach_flags (GtkButton *button,OssoGtkButtonAttachFlags flags)
463+{
464+ g_return_if_fail (GTK_IS_BUTTON (button));
465+ g_object_set (G_OBJECT (button),
466+ "automatic_detail",
467+ FALSE,
468+ "detail",
469+ osso_gtk_button_attach_details[flags],
470+ NULL);
471+}