summaryrefslogtreecommitdiff
path: root/gtk/gtkbutton.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkbutton.c')
-rw-r--r--gtk/gtkbutton.c143
1 files changed, 26 insertions, 117 deletions
diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
index 2b8cfd3c4f..101ee0d7da 100644
--- a/gtk/gtkbutton.c
+++ b/gtk/gtkbutton.c
@@ -52,8 +52,6 @@ static void gtk_button_set_arg (GtkObject *object,
static void gtk_button_get_arg (GtkObject *object,
GtkArg *arg,
guint arg_id);
-static void gtk_button_map (GtkWidget *widget);
-static void gtk_button_unmap (GtkWidget *widget);
static void gtk_button_realize (GtkWidget *widget);
static void gtk_button_size_request (GtkWidget *widget,
GtkRequisition *requisition);
@@ -83,9 +81,6 @@ static void gtk_button_add (GtkContainer *container,
GtkWidget *widget);
static void gtk_button_remove (GtkContainer *container,
GtkWidget *widget);
-static void gtk_button_foreach (GtkContainer *container,
- GtkCallback callback,
- gpointer callback_data);
static void gtk_real_button_pressed (GtkButton *button);
static void gtk_real_button_released (GtkButton *button);
static void gtk_real_button_enter (GtkButton *button);
@@ -93,7 +88,7 @@ static void gtk_real_button_leave (GtkButton *button);
static GtkType gtk_button_child_type (GtkContainer *container);
-static GtkContainerClass *parent_class;
+static GtkBinClass *parent_class = NULL;
static guint button_signals[LAST_SIGNAL] = { 0 };
@@ -116,7 +111,7 @@ gtk_button_get_type (void)
(GtkClassInitFunc) NULL,
};
- button_type = gtk_type_unique (gtk_container_get_type (), &button_info);
+ button_type = gtk_type_unique (GTK_TYPE_BIN, &button_info);
gtk_type_set_chunk_alloc (button_type, 16);
}
@@ -134,7 +129,7 @@ gtk_button_class_init (GtkButtonClass *klass)
widget_class = (GtkWidgetClass*) klass;
container_class = (GtkContainerClass*) klass;
- parent_class = gtk_type_class (gtk_container_get_type ());
+ parent_class = gtk_type_class (GTK_TYPE_BIN);
gtk_object_add_arg_type ("GtkButton::label", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_LABEL);
@@ -180,8 +175,6 @@ gtk_button_class_init (GtkButtonClass *klass)
object_class->get_arg = gtk_button_get_arg;
widget_class->activate_signal = button_signals[CLICKED];
- widget_class->map = gtk_button_map;
- widget_class->unmap = gtk_button_unmap;
widget_class->realize = gtk_button_realize;
widget_class->draw = gtk_button_draw;
widget_class->draw_focus = gtk_button_draw_focus;
@@ -198,7 +191,6 @@ gtk_button_class_init (GtkButtonClass *klass)
container_class->add = gtk_button_add;
container_class->remove = gtk_button_remove;
- container_class->foreach = gtk_button_foreach;
container_class->child_type = gtk_button_child_type;
klass->pressed = gtk_real_button_pressed;
@@ -212,6 +204,7 @@ static void
gtk_button_init (GtkButton *button)
{
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_FOCUS);
+ GTK_WIDGET_UNSET_FLAGS (button, GTK_NO_WINDOW);
button->child = NULL;
button->in_button = FALSE;
@@ -222,7 +215,7 @@ gtk_button_init (GtkButton *button)
static GtkType
gtk_button_child_type (GtkContainer *container)
{
- if (!GTK_BUTTON (container)->child)
+ if (!GTK_BIN (container)->child)
return GTK_TYPE_WIDGET;
else
return GTK_TYPE_NONE;
@@ -242,11 +235,8 @@ gtk_button_set_arg (GtkObject *object,
GtkWidget *label;
case ARG_LABEL:
- if (button->child)
- {
- gtk_widget_unparent (button->child);
- button->child = NULL;
- }
+ if (GTK_BIN (button)->child)
+ gtk_container_remove (GTK_CONTAINER (button), GTK_BIN (button)->child);
label = gtk_label_new (GTK_VALUE_STRING(*arg) ? GTK_VALUE_STRING(*arg) : "");
gtk_widget_show (label);
@@ -270,8 +260,8 @@ gtk_button_get_arg (GtkObject *object,
switch (arg_id)
{
case ARG_LABEL:
- if (button->child && GTK_IS_LABEL (button->child))
- GTK_VALUE_STRING (*arg) = g_strdup (GTK_LABEL (button->child)->label);
+ if (GTK_BIN (button)->child && GTK_IS_LABEL (GTK_BIN (button)->child))
+ GTK_VALUE_STRING (*arg) = g_strdup (GTK_LABEL (GTK_BIN (button)->child)->label);
else
GTK_VALUE_STRING (*arg) = NULL;
break;
@@ -353,35 +343,6 @@ gtk_button_get_relief(GtkButton *button)
}
static void
-gtk_button_map (GtkWidget *widget)
-{
- GtkButton *button;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_BUTTON (widget));
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
- gdk_window_show (widget->window);
-
- button = GTK_BUTTON (widget);
-
- if (button->child &&
- GTK_WIDGET_VISIBLE (button->child) &&
- !GTK_WIDGET_MAPPED (button->child))
- gtk_widget_map (button->child);
-}
-
-static void
-gtk_button_unmap (GtkWidget *widget)
-{
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_BUTTON (widget));
-
- GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
- gdk_window_hide (widget->window);
-}
-
-static void
gtk_button_realize (GtkWidget *widget)
{
GtkButton *button;
@@ -446,12 +407,12 @@ gtk_button_size_request (GtkWidget *widget,
DEFAULT_SPACING);
}
- if (button->child && GTK_WIDGET_VISIBLE (button->child))
+ if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child))
{
- gtk_widget_size_request (button->child, &button->child->requisition);
+ gtk_widget_size_request (GTK_BIN (button)->child, &GTK_BIN (button)->child->requisition);
- requisition->width += button->child->requisition.width;
- requisition->height += button->child->requisition.height;
+ requisition->width += GTK_BIN (button)->child->requisition.width;
+ requisition->height += GTK_BIN (button)->child->requisition.height;
}
}
@@ -479,7 +440,7 @@ gtk_button_size_allocate (GtkWidget *widget,
button = GTK_BUTTON (widget);
- if (button->child && GTK_WIDGET_VISIBLE (button->child))
+ if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child))
{
child_allocation.x = (CHILD_SPACING + GTK_WIDGET (widget)->style->klass->xthickness);
child_allocation.y = (CHILD_SPACING + GTK_WIDGET (widget)->style->klass->ythickness);
@@ -501,7 +462,7 @@ gtk_button_size_allocate (GtkWidget *widget,
(GTK_WIDGET (widget)->style->klass->xthickness * 2 + DEFAULT_SPACING));
}
- gtk_widget_size_allocate (button->child, &child_allocation);
+ gtk_widget_size_allocate (GTK_BIN (button)->child, &child_allocation);
}
}
@@ -646,8 +607,8 @@ gtk_button_draw (GtkWidget *widget,
gtk_button_paint (widget, &tmp_area);
- if (button->child && gtk_widget_intersect (button->child, &tmp_area, &child_area))
- gtk_widget_draw (button->child, &child_area);
+ if (GTK_BIN (button)->child && gtk_widget_intersect (GTK_BIN (button)->child, &tmp_area, &child_area))
+ gtk_widget_draw (GTK_BIN (button)->child, &child_area);
gtk_widget_draw_default (widget);
gtk_widget_draw_focus (widget);
@@ -785,9 +746,9 @@ gtk_button_expose (GtkWidget *widget,
gtk_button_paint (widget, &event->area);
child_event = *event;
- if (button->child && GTK_WIDGET_NO_WINDOW (button->child) &&
- gtk_widget_intersect (button->child, &event->area, &child_event.area))
- gtk_widget_event (button->child, (GdkEvent*) &child_event);
+ if (GTK_BIN (button)->child && GTK_WIDGET_NO_WINDOW (GTK_BIN (button)->child) &&
+ gtk_widget_intersect (GTK_BIN (button)->child, &event->area, &child_event.area))
+ gtk_widget_event (GTK_BIN (button)->child, (GdkEvent*) &child_event);
gtk_widget_draw_default (widget);
gtk_widget_draw_focus (widget);
@@ -925,78 +886,26 @@ static void
gtk_button_add (GtkContainer *container,
GtkWidget *widget)
{
- GtkButton *button;
-
g_return_if_fail (container != NULL);
- g_return_if_fail (GTK_IS_BUTTON (container));
g_return_if_fail (widget != NULL);
- g_return_if_fail (gtk_widget_basic (widget));
-
- button = GTK_BUTTON (container);
- if (!button->child)
- {
- gtk_widget_set_parent (widget, GTK_WIDGET (container));
-
- if (GTK_WIDGET_VISIBLE (widget->parent))
- {
- if (GTK_WIDGET_REALIZED (widget->parent) &&
- !GTK_WIDGET_REALIZED (widget))
- gtk_widget_realize (widget);
-
- if (GTK_WIDGET_MAPPED (widget->parent) &&
- !GTK_WIDGET_MAPPED (widget))
- gtk_widget_map (widget);
- }
-
- button->child = widget;
+ if (GTK_CONTAINER_CLASS (parent_class)->add)
+ GTK_CONTAINER_CLASS (parent_class)->add (container, widget);
- if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (container))
- gtk_widget_queue_resize (widget);
- }
+ GTK_BUTTON (container)->child = GTK_BIN (container)->child;
}
static void
gtk_button_remove (GtkContainer *container,
GtkWidget *widget)
{
- GtkButton *button;
-
g_return_if_fail (container != NULL);
- g_return_if_fail (GTK_IS_BUTTON (container));
g_return_if_fail (widget != NULL);
- button = GTK_BUTTON (container);
-
- if (button->child == widget)
- {
- gboolean widget_was_visible = GTK_WIDGET_VISIBLE(widget);
-
- gtk_widget_unparent (widget);
-
- button->child = NULL;
-
- if (widget_was_visible && GTK_WIDGET_VISIBLE (container))
- gtk_widget_queue_resize (GTK_WIDGET (container));
-
- }
-}
-
-static void
-gtk_button_foreach (GtkContainer *container,
- GtkCallback callback,
- gpointer callback_data)
-{
- GtkButton *button;
-
- g_return_if_fail (container != NULL);
- g_return_if_fail (GTK_IS_BUTTON (container));
- g_return_if_fail (callback != NULL);
-
- button = GTK_BUTTON (container);
+ if (GTK_CONTAINER_CLASS (parent_class)->remove)
+ GTK_CONTAINER_CLASS (parent_class)->remove (container, widget);
- if (button->child)
- (* callback) (button->child, callback_data);
+ GTK_BUTTON (container)->child = GTK_BIN (container)->child;
}
static void