diff options
Diffstat (limited to 'packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff')
-rw-r--r-- | packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff | 471 |
1 files changed, 471 insertions, 0 deletions
diff --git a/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff b/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff index e69de29bb2..e5a007372a 100644 --- a/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff +++ b/packages/gtk+/gtk+-2.6.4-1.osso7/gtkbutton.c.diff @@ -0,0 +1,471 @@ +--- gtk+-2.6.4/gtk/gtkbutton.c 2005-01-25 22:54:43.000000000 +0200 ++++ gtk+-2.6.4/gtk/gtkbutton.c 2005-04-06 16:19:36.249027672 +0300 +@@ -24,6 +24,10 @@ + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + ++/* Modified for Nokia Oyj during 2002-2005. See CHANGES file for list ++ * of changes. ++ */ ++ + #include <config.h> + #include <string.h> + #include "gtkalias.h" +@@ -38,8 +42,33 @@ + #include "gtkiconfactory.h" + #include "gtkintl.h" + ++/* Osso addition: ++ * Here are the details for each attach ++ * bitmask combination. */ ++const gchar *osso_gtk_button_attach_details [OSSO_GTK_BUTTON_ATTACH_ENUM_END] = ++ { "osso_button", ++ "osso_button_n", ++ "osso_button_e", ++ "osso_button_ne", ++ "osso_button_s", ++ "osso_button_ns", ++ "osso_button_es", ++ "osso_button_nes", ++ "osso_button_w", ++ "osso_button_nw", ++ "osso_button_ew", ++ "osso_button_new", ++ "osso_button_sw", ++ "osso_button_nsw", ++ "osso_button_esw", ++ "osso_button_nesw", ++ }; ++ + #define CHILD_SPACING 1 + ++/* Take this away after font drawing is fixed */ ++#define OSSO_FONT_HACK TRUE ++ + static const GtkBorder default_default_border = { 1, 1, 1, 1 }; + static const GtkBorder default_default_outside_border = { 0, 0, 0, 0 }; + +@@ -68,6 +97,9 @@ + PROP_FOCUS_ON_CLICK, + PROP_XALIGN, + PROP_YALIGN, ++ PROP_DETAIL, ++ PROP_AUTOMATIC_DETAIL, ++ PROP_KEYBOARD_BUTTON + }; + + #define GTK_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_BUTTON, GtkButtonPrivate)) +@@ -80,6 +112,10 @@ + GtkWidget *image; + guint align_set : 1; + guint image_is_stock : 1; ++ gchar *detail; ++ gboolean automatic_detail; ++ gboolean keyboard_button; ++ GtkLabel *keyboard_label; + }; + + static void gtk_button_class_init (GtkButtonClass *klass); +@@ -231,6 +267,14 @@ + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (gobject_class, ++ PROP_KEYBOARD_BUTTON, ++ g_param_spec_boolean ("keyboard_button", ++ P_("Keyboard button"), ++ P_("If set, label foo"), ++ FALSE, ++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); ++ ++ g_object_class_install_property (gobject_class, + PROP_USE_STOCK, + g_param_spec_boolean ("use_stock", + P_("Use stock"), +@@ -418,6 +462,77 @@ + P_("Whether stock icons should be shown in buttons"), + TRUE, + G_PARAM_READWRITE)); ++ ++ gtk_widget_class_install_style_property (widget_class, ++ g_param_spec_int ("child_spacing", ++ _("Child spacing"), ++ _("Spacing between button edges and child."), ++ 0, ++ G_MAXINT, ++ CHILD_SPACING, ++ G_PARAM_READABLE)); ++ /* Osso additions below */ ++ g_object_class_install_property (gobject_class, ++ PROP_DETAIL, ++ g_param_spec_string ("detail", ++ P_("Detail"), ++ P_("The detail the button is drawn with."), ++ "buttondefault", ++ G_PARAM_READWRITE)); ++ ++ g_object_class_install_property (gobject_class, ++ PROP_AUTOMATIC_DETAIL, ++ g_param_spec_boolean ("automatic_detail", ++ P_("Automatic Detail"), ++ P_("Whether setting detail is automatic based on GtkTable/GtkHButtonBox."), ++ TRUE, ++ G_PARAM_READWRITE)); ++ ++ ++ gtk_widget_class_install_style_property (widget_class, ++ g_param_spec_int ("child_offset_y", ++ _("Child Y Offset"), ++ _("Enable hack how many pixels to add/take away from GtkButton's child size allocation."), ++ G_MININT, ++ G_MAXINT, ++ 0, ++ G_PARAM_READABLE)); ++ ++ /* OSSO: This is used to find out whether ++ * button is a GtkTreeView column Listbox ++ * header or not */ ++ gtk_widget_class_install_style_property (widget_class, ++ g_param_spec_boolean ("listboxheader", ++ P_( "Listbox header" ), ++ P_( "Listbox header ( FALSE / TRUE )" ), ++ FALSE, ++ G_PARAM_READABLE)); ++ ++ /* OSSO: Column Listbox header separator height */ ++ gtk_widget_class_install_style_property (widget_class, ++ g_param_spec_int ("separator-height", ++ P_( "Separator height" ), ++ P_( "Listbox header separator height ( FALSE / TRUE )" ), ++ 0, ++ G_MAXINT, ++ 0, ++ G_PARAM_READABLE)); ++ ++ gtk_widget_class_install_style_property (widget_class, ++ g_param_spec_boxed ("padding", ++ P_("Padding"), ++ P_("Paddings around the button child"), ++ GTK_TYPE_BORDER, ++ G_PARAM_READABLE)); ++ ++ gtk_widget_class_install_style_property (widget_class, ++ g_param_spec_int ("minimum_width", ++ P_("Minimum Width"), ++ P_("Minimum width of the button"), ++ 0, ++ G_MAXINT, ++ 0, ++ G_PARAM_READABLE)); + + g_type_class_add_private (gobject_class, sizeof (GtkButtonPrivate)); + } +@@ -445,7 +560,14 @@ + priv->xalign = 0.5; + priv->yalign = 0.5; + priv->align_set = 0; ++ priv->detail = g_strdup("buttondefault"); ++ priv->automatic_detail = TRUE; ++ priv->keyboard_button = FALSE; ++ priv->keyboard_label = NULL; + priv->image_is_stock = TRUE; ++ ++ g_object_set (G_OBJECT (button), "tap_and_hold_state", ++ GTK_STATE_ACTIVE, NULL); + } + + static void +@@ -560,6 +682,18 @@ + case PROP_YALIGN: + gtk_button_set_alignment (button, priv->xalign, g_value_get_float (value)); + break; ++ case PROP_DETAIL: ++ if (priv->detail) ++ g_free (priv->detail); ++ priv->detail = g_strdup (g_value_get_string (value)); ++ gtk_widget_queue_draw (GTK_WIDGET (button)); ++ break; ++ case PROP_AUTOMATIC_DETAIL: ++ priv->automatic_detail = g_value_get_boolean (value); ++ break; ++ case PROP_KEYBOARD_BUTTON: ++ priv->keyboard_button = g_value_get_boolean (value); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -601,6 +735,15 @@ + case PROP_YALIGN: + g_value_set_float (value, priv->yalign); + break; ++ case PROP_DETAIL: ++ g_value_set_string (value, priv->detail); ++ break; ++ case PROP_AUTOMATIC_DETAIL: ++ g_value_set_boolean (value, priv->automatic_detail); ++ break; ++ case PROP_KEYBOARD_BUTTON: ++ g_value_set_boolean (value, priv->keyboard_button); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -641,6 +784,26 @@ + if (button->label_text == NULL) + return; + ++ if (priv->keyboard_button) ++ { ++ if (priv->keyboard_label) ++ { ++ gtk_label_set_label (priv->keyboard_label, button->label_text); ++ } ++ else ++ { ++ GtkWidget *label = gtk_label_new (button->label_text); ++ priv->keyboard_label = GTK_LABEL (label); ++ ++ if (priv->align_set) ++ gtk_misc_set_alignment (GTK_MISC (label), ++ priv->xalign, priv->yalign); ++ gtk_widget_show (priv->keyboard_label); ++ gtk_container_add (GTK_CONTAINER (button), label); ++ } ++ return; ++ } ++ + if (GTK_BIN (button)->child) + { + if (priv->image && !priv->image_is_stock) +@@ -944,16 +1107,20 @@ + GtkBorder default_border; + gint focus_width; + gint focus_pad; ++ gint child_spacing; ++ gint separator_height; + + gtk_button_get_props (button, &default_border, NULL, NULL); + gtk_widget_style_get (GTK_WIDGET (widget), + "focus-line-width", &focus_width, + "focus-padding", &focus_pad, ++ "child-spacing", &child_spacing, ++ "separator-height", &separator_height, + NULL); + +- requisition->width = (GTK_CONTAINER (widget)->border_width + CHILD_SPACING + ++ requisition->width = (GTK_CONTAINER (widget)->border_width + child_spacing + + GTK_WIDGET (widget)->style->xthickness) * 2; +- requisition->height = (GTK_CONTAINER (widget)->border_width + CHILD_SPACING + ++ requisition->height = (GTK_CONTAINER (widget)->border_width + child_spacing + + GTK_WIDGET (widget)->style->ythickness) * 2; + + if (GTK_WIDGET_CAN_DEFAULT (widget)) +@@ -965,15 +1132,35 @@ + if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child)) + { + GtkRequisition child_requisition; ++ GtkBorder *padding; ++ gint minimum_width; + + gtk_widget_size_request (GTK_BIN (button)->child, &child_requisition); + ++ gtk_widget_style_get (widget, ++ "padding", ++ &padding, ++ "minimum_width", ++ &minimum_width, ++ NULL); ++ ++ if ( padding ) ++ { ++ requisition->width += padding->left + padding->right; ++ requisition->height += padding->top + padding->bottom; ++ } ++ + requisition->width += child_requisition.width; + requisition->height += child_requisition.height; ++ ++ if (requisition->width < minimum_width) ++ requisition->width = minimum_width; + } + + requisition->width += 2 * (focus_width + focus_pad); + requisition->height += 2 * (focus_width + focus_pad); ++ ++ requisition->height += separator_height; + } + + static void +@@ -989,14 +1176,15 @@ + GtkBorder default_border; + gint focus_width; + gint focus_pad; ++ gint child_spacing; + + gtk_button_get_props (button, &default_border, NULL, NULL); + gtk_widget_style_get (GTK_WIDGET (widget), + "focus-line-width", &focus_width, + "focus-padding", &focus_pad, ++ "child-spacing", &child_spacing, + NULL); +- +- ++ + widget->allocation = *allocation; + + if (GTK_WIDGET_REALIZED (widget)) +@@ -1008,14 +1196,27 @@ + + if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child)) + { +- child_allocation.x = widget->allocation.x + border_width + CHILD_SPACING + xthickness; +- child_allocation.y = widget->allocation.y + border_width + CHILD_SPACING + ythickness; ++ child_allocation.x = widget->allocation.x + border_width + child_spacing + xthickness; ++ child_allocation.y = widget->allocation.y + border_width + child_spacing + ythickness; + +- child_allocation.width = MAX (1, widget->allocation.width - (CHILD_SPACING + xthickness) * 2 - ++ child_allocation.width = MAX (1, widget->allocation.width - (child_spacing + xthickness) * 2 - + border_width * 2); +- child_allocation.height = MAX (1, widget->allocation.height - (CHILD_SPACING + ythickness) * 2 - ++ child_allocation.height = MAX (1, widget->allocation.height - (child_spacing + ythickness) * 2 - + border_width * 2); + ++#ifdef OSSO_FONT_HACK ++ { ++ gint child_offset_y; ++ ++ gtk_widget_style_get (widget, "child_offset_y", &child_offset_y, NULL); ++ ++ if( GTK_IS_LABEL(GTK_BIN (button)->child) ) ++ { ++ child_allocation.y += child_offset_y; ++ } ++ } ++#endif ++ + if (GTK_WIDGET_CAN_DEFAULT (button)) + { + child_allocation.x += default_border.left; +@@ -1066,7 +1267,14 @@ + gboolean interior_focus; + gint focus_width; + gint focus_pad; +- ++ gint separator_height; ++ gboolean listboxheader; ++ GtkButtonPrivate *priv; ++ ++ g_return_if_fail (GTK_IS_BUTTON (button)); ++ ++ priv = GTK_BUTTON_GET_PRIVATE (button); ++ + if (GTK_WIDGET_DRAWABLE (button)) + { + widget = GTK_WIDGET (button); +@@ -1076,6 +1284,8 @@ + gtk_widget_style_get (GTK_WIDGET (widget), + "focus-line-width", &focus_width, + "focus-padding", &focus_pad, ++ "listboxheader", &listboxheader, ++ "separator-height", &separator_height, + NULL); + + x = widget->allocation.x + border_width; +@@ -1083,13 +1293,55 @@ + width = widget->allocation.width - border_width * 2; + height = widget->allocation.height - border_width * 2; + ++ if (listboxheader) ++ { ++ /* this changes everything! */ ++ PangoLayout *layout; ++ int layout_height; ++ ++ /* construct layout - see get_layout in gtkcellrenderertext.c */ ++ layout = gtk_widget_create_pango_layout (widget, /* use parent treeview instead? */ ++ button->label_text); ++ pango_layout_set_width (layout, -1); ++ pango_layout_get_pixel_size (layout, NULL, &layout_height); ++ ++ /* render text */ ++ gtk_paint_layout (widget->style, ++ widget->window, ++ GTK_STATE_NORMAL, ++ TRUE, ++ area, ++ widget, ++ "listboxheader", ++ x, ++ y, ++ layout); ++ ++ g_object_unref (layout); ++ ++ /* draw separator */ ++ gtk_paint_hline (widget->style, ++ widget->window, ++ GTK_STATE_NORMAL, ++ area, ++ widget, ++ "listboxseparator", ++ area->x - focus_width - focus_pad, ++ area->x + area->width + focus_width + focus_pad, ++ layout_height + separator_height * 2); ++ return; ++ } ++ + if (GTK_WIDGET_HAS_DEFAULT (widget) && + GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL) + { +- gtk_paint_box (widget->style, widget->window, ++ /* This comment is here because it's part of the ++ * normal GtkButton ++ */ ++ /* gtk_paint_box (widget->style, widget->window, + GTK_STATE_NORMAL, GTK_SHADOW_IN, + area, widget, "buttondefault", +- x, y, width, height); ++ x, y, width, height); */ + + x += default_border.left; + y += default_border.top; +@@ -1116,7 +1368,7 @@ + GTK_WIDGET_STATE(widget) == GTK_STATE_PRELIGHT) + gtk_paint_box (widget->style, widget->window, + state_type, +- shadow_type, area, widget, "button", ++ shadow_type, area, widget, priv->detail, + x, y, width, height); + + if (GTK_WIDGET_HAS_FOCUS (widget)) +@@ -1151,10 +1403,14 @@ + x += child_displacement_x; + y += child_displacement_y; + } +- ++ /* Comment exists, because it is part of normal GtkButton + gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget), + area, widget, "button", + x, y, width, height); ++ */ ++ gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget), ++ area, widget, priv->detail, ++ x, y, width, height); + } + } + } +@@ -1786,5 +2042,13 @@ + + return priv->image; + } +- +- ++void osso_gtk_button_set_detail_from_attach_flags (GtkButton *button,OssoGtkButtonAttachFlags flags) ++{ ++ g_return_if_fail (GTK_IS_BUTTON (button)); ++ g_object_set (G_OBJECT (button), ++ "automatic_detail", ++ FALSE, ++ "detail", ++ osso_gtk_button_attach_details[flags], ++ NULL); ++} |