generic-poky/openembedded/packages/gtk+/gtk+-2.6.4-1.osso7/gtkhbbox.c.diff

345 lines
10 KiB
Diff

--- 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);
+ }
+}