summaryrefslogtreecommitdiff
path: root/packages/gtk+/gtk+-2.6.4-1.osso7/gtkhbbox.c.diff
diff options
context:
space:
mode:
Diffstat (limited to 'packages/gtk+/gtk+-2.6.4-1.osso7/gtkhbbox.c.diff')
-rw-r--r--packages/gtk+/gtk+-2.6.4-1.osso7/gtkhbbox.c.diff344
1 files changed, 344 insertions, 0 deletions
diff --git a/packages/gtk+/gtk+-2.6.4-1.osso7/gtkhbbox.c.diff b/packages/gtk+/gtk+-2.6.4-1.osso7/gtkhbbox.c.diff
index e69de29bb2..e43db37f5c 100644
--- a/packages/gtk+/gtk+-2.6.4-1.osso7/gtkhbbox.c.diff
+++ b/packages/gtk+/gtk+-2.6.4-1.osso7/gtkhbbox.c.diff
@@ -0,0 +1,344 @@
+--- gtk+-2.6.4/gtk/gtkhbbox.c 2004-08-09 19:59:52.000000000 +0300
++++ gtk+-2.6.4/gtk/gtkhbbox.c 2005-04-06 16:19:36.644967480 +0300
+@@ -24,10 +24,20 @@
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
++/* Modified for Nokia Oyj during 2002-2005. See CHANGES file for list
++ * of changes.
++ */
++
++/* Hildon : Button spacing according to the spec. */
++#define HILDON_BUTTON_SPACING 5
++/* Selecting hetefogenous mode for a childlayout */
++#define GTK_BUTTONBOX_HETEROGENOUS 6
++
+ #include <config.h>
+ #include "gtkalias.h"
+ #include "gtkhbbox.h"
+-
++/* Hildon : We need this to mess with buttons graphics. */
++#include "gtkbutton.h"
+
+ static void gtk_hbutton_box_class_init (GtkHButtonBoxClass *klass);
+ static void gtk_hbutton_box_init (GtkHButtonBox *box);
+@@ -36,6 +46,15 @@
+ static void gtk_hbutton_box_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation);
+
++static void osso_gtk_hbutton_child_showhide_handler (GtkWidget *widget,
++ gpointer user_data);
++static void osso_gtk_hbutton_box_remove_child_signal_handlers (GtkHButtonBox *hbbox,
++ GtkWidget *removed_widget,
++ gpointer data);
++static void osso_gtk_hbutton_box_find_button_detail (GtkHButtonBox *hbbox,
++ GtkWidget *addremovewidget,
++ gpointer data);
++
+ static gint default_spacing = 30;
+ static gint default_layout_style = GTK_BUTTONBOX_EDGE;
+
+@@ -76,12 +95,23 @@
+
+ widget_class->size_request = gtk_hbutton_box_size_request;
+ widget_class->size_allocate = gtk_hbutton_box_size_allocate;
++
++ /* HILDON:
++ * Name buttons only if hildon like style property is set
++ */
++ gtk_widget_class_install_style_property (widget_class,
++ g_param_spec_boolean
++ ( "hildonlike",
++ "hildonlike looks",
++ "Name buttons, 1/0",
++ FALSE,
++ G_PARAM_READABLE) );
+ }
+
+ static void
+ gtk_hbutton_box_init (GtkHButtonBox *hbutton_box)
+ {
+- /* button_box_init has done everything allready */
++ /* button_box_init has done everything allready */
+ }
+
+ GtkWidget*
+@@ -91,6 +121,24 @@
+
+ hbutton_box = g_object_new (GTK_TYPE_HBUTTON_BOX, NULL);
+
++ /* Attach signal handler for 'hildonizing' buttons.
++ * gtk_hbutton_box_hildonize_buttons will check the name
++ * and if it is something we're interested in i.e.
++ *
++ * hildon_dialogbuttons
++ * hildon_viewbuttons
++ *
++ * it will do the hildonizing
++ */
++ g_signal_connect_after (G_OBJECT (hbutton_box), "remove",
++ G_CALLBACK (osso_gtk_hbutton_box_remove_child_signal_handlers),
++ NULL);
++ g_signal_connect_after( G_OBJECT( hbutton_box ), "add",
++ G_CALLBACK( osso_gtk_hbutton_box_find_button_detail ),
++ NULL );
++ g_signal_connect_after( G_OBJECT( hbutton_box ), "remove",
++ G_CALLBACK( osso_gtk_hbutton_box_find_button_detail ),
++ NULL );
+ return GTK_WIDGET (hbutton_box);
+ }
+
+@@ -145,6 +193,11 @@
+ gint child_height;
+ gint spacing;
+ GtkButtonBoxStyle layout;
++ gint child_xpad=0;
++ GtkBoxChild *child_req;
++ GList *children_req;
++ GtkRequisition treq;
++
+
+ box = GTK_BOX (widget);
+ bbox = GTK_BUTTON_BOX (widget);
+@@ -159,6 +212,12 @@
+ &child_width,
+ &child_height);
+
++ /* should GTK_BUTTONBOX_HETEROGENOUS add into the GtkButtonBoxStyle
++ enum struct
++ */
++ if( !box->homogeneous )
++ layout = GTK_BUTTONBOX_HETEROGENOUS;
++
+ if (nvis_children == 0)
+ {
+ requisition->width = 0;
+@@ -177,11 +236,36 @@
+ case GTK_BUTTONBOX_END:
+ requisition->width = nvis_children*child_width + ((nvis_children-1)*spacing);
+ break;
++ case GTK_BUTTONBOX_HETEROGENOUS:
++ children_req = GTK_BOX (box)->children;
++ child_req = children_req->data;
++ requisition->width = 0;
++
++ while (children_req)
++ {
++ child_req = children_req->data;
++ children_req = children_req->next;
++
++ if (GTK_WIDGET_VISIBLE (child_req->widget))
++ {
++ gtk_widget_get_child_requisition( child_req->widget,
++ &(treq) );
++ requisition->width += treq.width;
++
++ gtk_widget_style_get(widget,
++ "child-internal-pad-x",
++ &(child_xpad), NULL);
++ requisition->width += (child_xpad*2);
++ }
++ }
++ requisition->width += ((nvis_children-1)*spacing);
++
++ break;
+ default:
+ g_assert_not_reached();
+ break;
+ }
+-
++
+ requisition->height = child_height;
+ }
+
+@@ -227,6 +311,10 @@
+ &child_height);
+ widget->allocation = *allocation;
+ width = allocation->width - GTK_CONTAINER (box)->border_width*2;
++
++ if( !base_box->homogeneous )
++ layout = GTK_BUTTONBOX_HETEROGENOUS;
++
+ switch (layout)
+ {
+ case GTK_BUTTONBOX_SPREAD:
+@@ -264,6 +352,39 @@
+ - GTK_CONTAINER (box)->border_width;
+ secondary_x = allocation->x + GTK_CONTAINER (box)->border_width;
+ break;
++ case GTK_BUTTONBOX_HETEROGENOUS:
++ {
++ gint sumwidth = 0;
++ GtkBoxChild *child_h;
++ GList *children_h = GTK_BOX (box)->children;
++ /* heterogenous sized childs onto center */
++ childspacing = spacing;
++ child_h = children_h->data;
++
++ while (children_h )
++ {
++ if ( g_list_length (children_h) == 0 ) break;
++
++ child_h = children_h->data;
++ children_h = children_h->next;
++
++ if (GTK_WIDGET_VISIBLE (child_h->widget))
++ {
++ gint child_xpad = 0;
++ GtkRequisition treq;
++ gtk_widget_get_child_requisition( child_h->widget, &(treq) );
++ sumwidth += treq.width;
++
++ gtk_widget_style_get(widget,
++ "child-internal-pad-x",
++ &(child_xpad), NULL);
++ sumwidth += (child_xpad*2);
++ }
++ }
++ x = secondary_x = allocation->x +
++ ( (allocation->width - sumwidth - (spacing * (nvis_children - 1)))/2 );
++ break;
++ }
+ default:
+ g_assert_not_reached();
+ break;
+@@ -282,10 +403,33 @@
+
+ if (GTK_WIDGET_VISIBLE (child->widget))
+ {
+- child_allocation.width = child_width;
+ child_allocation.height = child_height;
+ child_allocation.y = y;
+
++ if(layout != GTK_BUTTONBOX_HETEROGENOUS)
++ {
++ child_allocation.width = child_width;
++ }
++ else /* if layout will be hetergenous */
++ {
++ gint child_hwidth = 0;
++ GtkRequisition treq;
++ gint child_xpad = 0;
++
++ gtk_widget_get_child_requisition( child->widget, &(treq) );
++ child_hwidth += treq.width;
++
++ gtk_widget_style_get(widget,
++ "child-internal-pad-x",
++ &child_xpad, NULL);
++ child_hwidth += (child_xpad*2);
++
++ child_allocation.width = child_hwidth;
++ childspace = child_hwidth + childspacing;
++
++ }
++
++ /* calculate the horizontal location */
+ if (child->is_secondary)
+ {
+ child_allocation.x = secondary_x;
+@@ -304,4 +448,104 @@
+ }
+ }
+ }
++
++/* Function to wrap "hide" and "show" signals to call
++ * osso_gtk_hbutton_box_find_button_detail -function.*/
++static void osso_gtk_hbutton_child_showhide_handler (GtkWidget *widget,
++ gpointer user_data)
++{
++ osso_gtk_hbutton_box_find_button_detail (widget, GTK_WIDGET (user_data), NULL);
++}
+
++/* Function to remove "show"&"hide" signal handlers
++ * from a child when it's removed. */
++static void osso_gtk_hbutton_box_remove_child_signal_handlers (GtkHButtonBox *hbbox,
++ GtkWidget *removed_widget,
++ gpointer data)
++{
++ g_signal_handlers_disconnect_by_func (G_OBJECT (removed_widget), osso_gtk_hbutton_box_find_button_detail, hbbox);
++}
++
++/* Signal handler called when we have to set
++ * painting detail values for buttons in this
++ * gtk_horizontal_button_box.
++ */
++static void osso_gtk_hbutton_box_find_button_detail (GtkHButtonBox *hbbox,
++ GtkWidget *addremovewidget,
++ gpointer data)
++{
++ GList *child;
++ gint visible_buttons = 0;
++ gint secondary_buttons = 0;
++ GtkWidget *leftmost_button = NULL;
++ GtkWidget *rightmost_button = NULL;
++
++ for( child = GTK_BOX (hbbox)->children ; child ; child = child->next )
++ {
++ GtkBoxChild *box_child = child->data;
++ GtkWidget *child_widget = box_child->widget;
++ gulong signal_handler = g_signal_handler_find ( G_OBJECT( child_widget ),
++ G_SIGNAL_MATCH_FUNC,
++ 0, 0, NULL,
++ G_CALLBACK (osso_gtk_hbutton_child_showhide_handler),
++ NULL);
++
++ if (signal_handler == 0)
++ {
++ g_signal_connect_object ( G_OBJECT( child_widget ),
++ "hide",
++ G_CALLBACK ( osso_gtk_hbutton_child_showhide_handler ),
++ hbbox, G_CONNECT_SWAPPED);
++ g_signal_connect_object ( G_OBJECT( child_widget ),
++ "show",
++ G_CALLBACK ( osso_gtk_hbutton_child_showhide_handler ),
++ hbbox, G_CONNECT_SWAPPED);
++ }
++
++ if ((GTK_WIDGET_VISIBLE (child_widget)) &&
++ (GTK_IS_BUTTON (child_widget)))
++ visible_buttons++;
++ else
++ continue;
++
++ if (leftmost_button == NULL)
++ leftmost_button = child_widget;
++
++ if (secondary_buttons == 0)
++ rightmost_button = child_widget;
++ else
++ if (box_child->is_secondary)
++ {
++ rightmost_button = child_widget;
++ secondary_buttons++;
++ }
++
++ if (box_child->is_secondary)
++ rightmost_button = child_widget;
++ }
++
++ if (visible_buttons == 0)
++ return;
++
++ for( child = GTK_BOX (hbbox)->children ; child ; child = child->next )
++ {
++ GtkBoxChild *box_child = child->data;
++ GtkWidget *child_widget = box_child->widget;
++ OssoGtkButtonAttachFlags attachflags = OSSO_GTK_BUTTON_ATTACH_NORTH | OSSO_GTK_BUTTON_ATTACH_SOUTH;
++ gboolean automatic_detail;
++
++ if (!((GTK_WIDGET_VISIBLE (child_widget)) &&
++ (GTK_IS_BUTTON (child_widget))))
++ continue;
++
++ if (child_widget == leftmost_button)
++ attachflags |= OSSO_GTK_BUTTON_ATTACH_WEST;
++
++ if (child_widget == rightmost_button)
++ attachflags |= OSSO_GTK_BUTTON_ATTACH_EAST;
++
++ g_object_get (G_OBJECT (child_widget), "automatic_detail", &automatic_detail, NULL);
++ if (automatic_detail == TRUE)
++ g_object_set (G_OBJECT (child_widget), "detail", osso_gtk_button_attach_details[attachflags], NULL);
++ }
++}