+void gtkut_stock_button_set_create(GtkWidget **bbox,
+ GtkWidget **button1, const gchar *label1,
+ GtkWidget **button2, const gchar *label2,
+ GtkWidget **button3, const gchar *label3)
+{
+ g_return_if_fail(bbox != NULL);
+ g_return_if_fail(button1 != NULL);
+
+ *bbox = gtk_hbutton_box_new();
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(*bbox), GTK_BUTTONBOX_END);
+ gtk_box_set_spacing(GTK_BOX(*bbox), 5);
+
+ *button1 = gtk_button_new_from_stock(label1);
+ GTK_WIDGET_SET_FLAGS(*button1, GTK_CAN_DEFAULT);
+ gtk_box_pack_start(GTK_BOX(*bbox), *button1, TRUE, TRUE, 0);
+ gtk_widget_show(*button1);
+
+ if (button2) {
+ *button2 = gtk_button_new_from_stock(label2);
+ GTK_WIDGET_SET_FLAGS(*button2, GTK_CAN_DEFAULT);
+ gtk_box_pack_start(GTK_BOX(*bbox), *button2, TRUE, TRUE, 0);
+ gtk_widget_show(*button2);
+ }
+
+ if (button3) {
+ *button3 = gtk_button_new_from_stock(label3);
+ GTK_WIDGET_SET_FLAGS(*button3, GTK_CAN_DEFAULT);
+ gtk_box_pack_start(GTK_BOX(*bbox), *button3, TRUE, TRUE, 0);
+ gtk_widget_show(*button3);
+ }
+}
+
+static void combo_button_size_request(GtkWidget *widget,
+ GtkRequisition *requisition,
+ gpointer data)
+{
+ ComboButton *combo = (ComboButton *)data;
+
+ if (combo->arrow->allocation.height != requisition->height)
+ gtk_widget_set_size_request(combo->arrow,
+ -1, requisition->height);
+}
+
+static void combo_button_enter(GtkWidget *widget, gpointer data)
+{
+ ComboButton *combo = (ComboButton *)data;
+
+ if (GTK_WIDGET_STATE(combo->arrow) != GTK_STATE_PRELIGHT) {
+ gtk_widget_set_state(combo->arrow, GTK_STATE_PRELIGHT);
+ gtk_widget_queue_draw(combo->arrow);
+ }
+ if (GTK_WIDGET_STATE(combo->button) != GTK_STATE_PRELIGHT) {
+ gtk_widget_set_state(combo->button, GTK_STATE_PRELIGHT);
+ gtk_widget_queue_draw(combo->button);
+ }
+}
+
+static void combo_button_leave(GtkWidget *widget, gpointer data)
+{
+ ComboButton *combo = (ComboButton *)data;
+
+ if (GTK_WIDGET_STATE(combo->arrow) != GTK_STATE_NORMAL) {
+ gtk_widget_set_state(combo->arrow, GTK_STATE_NORMAL);
+ gtk_widget_queue_draw(combo->arrow);
+ }
+ if (GTK_WIDGET_STATE(combo->button) != GTK_STATE_NORMAL) {
+ gtk_widget_set_state(combo->button, GTK_STATE_NORMAL);
+ gtk_widget_queue_draw(combo->button);
+ }
+}
+
+static gint combo_button_arrow_pressed(GtkWidget *widget, GdkEventButton *event,
+ gpointer data)
+{
+ ComboButton *combo = (ComboButton *)data;
+
+ if (!event) return FALSE;
+
+ gtk_menu_popup(GTK_MENU(combo->menu), NULL, NULL,
+ menu_button_position, combo->button,
+ event->button, event->time);
+
+ return FALSE;
+}
+
+static void combo_button_destroy(GtkWidget *widget, gpointer data)
+{
+ ComboButton *combo = (ComboButton *)data;
+
+ gtk_object_destroy(GTK_OBJECT(combo->factory));
+ g_free(combo);
+}
+
+ComboButton *gtkut_combo_button_create(GtkWidget *button,
+ GtkItemFactoryEntry *entries,
+ gint n_entries, const gchar *path,
+ gpointer data)
+{
+ ComboButton *combo;
+ GtkWidget *arrow;
+
+ combo = g_new0(ComboButton, 1);
+
+ combo->arrow = gtk_button_new();
+ arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT);
+ gtk_widget_set_size_request(arrow, 7, -1);
+ gtk_container_add(GTK_CONTAINER(combo->arrow), arrow);
+ GTK_WIDGET_UNSET_FLAGS(combo->arrow, GTK_CAN_FOCUS);
+ gtk_widget_show_all(combo->arrow);
+
+ combo->button = button;
+ combo->menu = menu_create_items(entries, n_entries, path,
+ &combo->factory, data);
+ combo->data = data;
+
+ g_signal_connect(G_OBJECT(combo->button), "size_request",
+ G_CALLBACK(combo_button_size_request), combo);
+ g_signal_connect(G_OBJECT(combo->button), "enter",
+ G_CALLBACK(combo_button_enter), combo);
+ g_signal_connect(G_OBJECT(combo->button), "leave",
+ G_CALLBACK(combo_button_leave), combo);
+ g_signal_connect(G_OBJECT(combo->arrow), "enter",
+ G_CALLBACK(combo_button_enter), combo);
+ g_signal_connect(G_OBJECT(combo->arrow), "leave",
+ G_CALLBACK(combo_button_leave), combo);
+ g_signal_connect(G_OBJECT(combo->arrow), "button_press_event",
+ G_CALLBACK(combo_button_arrow_pressed), combo);
+ g_signal_connect(G_OBJECT(combo->arrow), "destroy",
+ G_CALLBACK(combo_button_destroy), combo);
+
+ return combo;
+}
+