1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
28 #include "gtkbutton.h"
31 #include "gtksignal.h"
34 #define CHILD_SPACING 1
35 #define DEFAULT_LEFT_POS 4
36 #define DEFAULT_TOP_POS 4
37 #define DEFAULT_SPACING 7
56 static void gtk_button_class_init (GtkButtonClass *klass);
57 static void gtk_button_init (GtkButton *button);
58 static void gtk_button_set_arg (GtkObject *object,
61 static void gtk_button_get_arg (GtkObject *object,
64 static void gtk_button_realize (GtkWidget *widget);
65 static void gtk_button_size_request (GtkWidget *widget,
66 GtkRequisition *requisition);
67 static void gtk_button_size_allocate (GtkWidget *widget,
68 GtkAllocation *allocation);
69 static void gtk_button_paint (GtkWidget *widget,
71 static void gtk_button_draw (GtkWidget *widget,
73 static void gtk_button_draw_focus (GtkWidget *widget);
74 static void gtk_button_draw_default (GtkWidget *widget);
75 static gint gtk_button_expose (GtkWidget *widget,
76 GdkEventExpose *event);
77 static gint gtk_button_button_press (GtkWidget *widget,
78 GdkEventButton *event);
79 static gint gtk_button_button_release (GtkWidget *widget,
80 GdkEventButton *event);
81 static gint gtk_button_enter_notify (GtkWidget *widget,
82 GdkEventCrossing *event);
83 static gint gtk_button_leave_notify (GtkWidget *widget,
84 GdkEventCrossing *event);
85 static gint gtk_button_focus_in (GtkWidget *widget,
86 GdkEventFocus *event);
87 static gint gtk_button_focus_out (GtkWidget *widget,
88 GdkEventFocus *event);
89 static void gtk_button_add (GtkContainer *container,
91 static void gtk_button_remove (GtkContainer *container,
93 static void gtk_real_button_pressed (GtkButton *button);
94 static void gtk_real_button_released (GtkButton *button);
95 static void gtk_real_button_enter (GtkButton *button);
96 static void gtk_real_button_leave (GtkButton *button);
97 static GtkType gtk_button_child_type (GtkContainer *container);
100 static GtkBinClass *parent_class = NULL;
101 static guint button_signals[LAST_SIGNAL] = { 0 };
105 gtk_button_get_type (void)
107 static GtkType button_type = 0;
111 static const GTypeInfo button_info =
113 sizeof (GtkButtonClass),
114 NULL, /* base_init */
115 NULL, /* base_finalize */
116 (GClassInitFunc) gtk_button_class_init,
117 NULL, /* class_finalize */
118 NULL, /* class_data */
120 16, /* n_preallocs */
121 (GInstanceInitFunc) gtk_button_init,
124 button_type = g_type_register_static (GTK_TYPE_BIN, "GtkButton", &button_info);
131 gtk_button_class_init (GtkButtonClass *klass)
133 GtkObjectClass *object_class;
134 GtkWidgetClass *widget_class;
135 GtkContainerClass *container_class;
137 object_class = (GtkObjectClass*) klass;
138 widget_class = (GtkWidgetClass*) klass;
139 container_class = (GtkContainerClass*) klass;
141 parent_class = gtk_type_class (GTK_TYPE_BIN);
143 gtk_object_add_arg_type ("GtkButton::label", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_LABEL);
144 gtk_object_add_arg_type ("GtkButton::relief", GTK_TYPE_RELIEF_STYLE, GTK_ARG_READWRITE, ARG_RELIEF);
146 button_signals[PRESSED] =
147 gtk_signal_new ("pressed",
149 GTK_CLASS_TYPE (object_class),
150 GTK_SIGNAL_OFFSET (GtkButtonClass, pressed),
151 gtk_marshal_NONE__NONE,
153 button_signals[RELEASED] =
154 gtk_signal_new ("released",
156 GTK_CLASS_TYPE (object_class),
157 GTK_SIGNAL_OFFSET (GtkButtonClass, released),
158 gtk_marshal_NONE__NONE,
160 button_signals[CLICKED] =
161 gtk_signal_new ("clicked",
162 GTK_RUN_FIRST | GTK_RUN_ACTION,
163 GTK_CLASS_TYPE (object_class),
164 GTK_SIGNAL_OFFSET (GtkButtonClass, clicked),
165 gtk_marshal_NONE__NONE,
167 button_signals[ENTER] =
168 gtk_signal_new ("enter",
170 GTK_CLASS_TYPE (object_class),
171 GTK_SIGNAL_OFFSET (GtkButtonClass, enter),
172 gtk_marshal_NONE__NONE,
174 button_signals[LEAVE] =
175 gtk_signal_new ("leave",
177 GTK_CLASS_TYPE (object_class),
178 GTK_SIGNAL_OFFSET (GtkButtonClass, leave),
179 gtk_marshal_NONE__NONE,
182 gtk_object_class_add_signals (object_class, button_signals, LAST_SIGNAL);
184 object_class->set_arg = gtk_button_set_arg;
185 object_class->get_arg = gtk_button_get_arg;
187 widget_class->activate_signal = button_signals[CLICKED];
188 widget_class->realize = gtk_button_realize;
189 widget_class->draw = gtk_button_draw;
190 widget_class->draw_focus = gtk_button_draw_focus;
191 widget_class->draw_default = gtk_button_draw_default;
192 widget_class->size_request = gtk_button_size_request;
193 widget_class->size_allocate = gtk_button_size_allocate;
194 widget_class->expose_event = gtk_button_expose;
195 widget_class->button_press_event = gtk_button_button_press;
196 widget_class->button_release_event = gtk_button_button_release;
197 widget_class->enter_notify_event = gtk_button_enter_notify;
198 widget_class->leave_notify_event = gtk_button_leave_notify;
199 widget_class->focus_in_event = gtk_button_focus_in;
200 widget_class->focus_out_event = gtk_button_focus_out;
202 container_class->add = gtk_button_add;
203 container_class->remove = gtk_button_remove;
204 container_class->child_type = gtk_button_child_type;
206 klass->pressed = gtk_real_button_pressed;
207 klass->released = gtk_real_button_released;
208 klass->clicked = NULL;
209 klass->enter = gtk_real_button_enter;
210 klass->leave = gtk_real_button_leave;
214 gtk_button_init (GtkButton *button)
216 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_FOCUS | GTK_RECEIVES_DEFAULT);
217 GTK_WIDGET_UNSET_FLAGS (button, GTK_NO_WINDOW);
219 button->child = NULL;
220 button->in_button = FALSE;
221 button->button_down = FALSE;
222 button->relief = GTK_RELIEF_NORMAL;
226 gtk_button_child_type (GtkContainer *container)
228 if (!GTK_BIN (container)->child)
229 return GTK_TYPE_WIDGET;
231 return GTK_TYPE_NONE;
235 gtk_button_set_arg (GtkObject *object,
241 button = GTK_BUTTON (object);
248 child = GTK_BIN (button)->child;
250 child = gtk_widget_new (GTK_TYPE_LABEL,
254 if (GTK_IS_LABEL (child))
255 gtk_label_set_text (GTK_LABEL (child),
256 GTK_VALUE_STRING (*arg) ? GTK_VALUE_STRING (*arg) : "");
259 gtk_button_set_relief (button, GTK_VALUE_ENUM (*arg));
267 gtk_button_get_arg (GtkObject *object,
273 button = GTK_BUTTON (object);
278 if (GTK_BIN (button)->child && GTK_IS_LABEL (GTK_BIN (button)->child))
279 GTK_VALUE_STRING (*arg) = g_strdup (GTK_LABEL (GTK_BIN (button)->child)->label);
281 GTK_VALUE_STRING (*arg) = NULL;
284 GTK_VALUE_ENUM (*arg) = gtk_button_get_relief (button);
287 arg->type = GTK_TYPE_INVALID;
293 gtk_button_new (void)
295 return GTK_WIDGET (gtk_type_new (gtk_button_get_type ()));
299 gtk_button_new_with_label (const gchar *label)
302 GtkWidget *label_widget;
304 button = gtk_button_new ();
305 label_widget = gtk_label_new (label);
306 gtk_misc_set_alignment (GTK_MISC (label_widget), 0.5, 0.5);
308 gtk_container_add (GTK_CONTAINER (button), label_widget);
309 gtk_widget_show (label_widget);
315 gtk_button_pressed (GtkButton *button)
317 g_return_if_fail (button != NULL);
318 g_return_if_fail (GTK_IS_BUTTON (button));
320 gtk_signal_emit (GTK_OBJECT (button), button_signals[PRESSED]);
324 gtk_button_released (GtkButton *button)
326 g_return_if_fail (button != NULL);
327 g_return_if_fail (GTK_IS_BUTTON (button));
329 gtk_signal_emit (GTK_OBJECT (button), button_signals[RELEASED]);
333 gtk_button_clicked (GtkButton *button)
335 g_return_if_fail (button != NULL);
336 g_return_if_fail (GTK_IS_BUTTON (button));
338 gtk_signal_emit (GTK_OBJECT (button), button_signals[CLICKED]);
342 gtk_button_enter (GtkButton *button)
344 g_return_if_fail (button != NULL);
345 g_return_if_fail (GTK_IS_BUTTON (button));
347 gtk_signal_emit (GTK_OBJECT (button), button_signals[ENTER]);
351 gtk_button_leave (GtkButton *button)
353 g_return_if_fail (button != NULL);
354 g_return_if_fail (GTK_IS_BUTTON (button));
356 gtk_signal_emit (GTK_OBJECT (button), button_signals[LEAVE]);
360 gtk_button_set_relief (GtkButton *button,
361 GtkReliefStyle newrelief)
363 g_return_if_fail (button != NULL);
364 g_return_if_fail (GTK_IS_BUTTON (button));
366 button->relief = newrelief;
367 gtk_widget_queue_draw (GTK_WIDGET (button));
371 gtk_button_get_relief (GtkButton *button)
373 g_return_val_if_fail (button != NULL, GTK_RELIEF_NORMAL);
374 g_return_val_if_fail (GTK_IS_BUTTON (button), GTK_RELIEF_NORMAL);
376 return button->relief;
380 gtk_button_realize (GtkWidget *widget)
383 GdkWindowAttr attributes;
384 gint attributes_mask;
387 g_return_if_fail (widget != NULL);
388 g_return_if_fail (GTK_IS_BUTTON (widget));
390 button = GTK_BUTTON (widget);
391 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
393 border_width = GTK_CONTAINER (widget)->border_width;
395 attributes.window_type = GDK_WINDOW_CHILD;
396 attributes.x = widget->allocation.x + border_width;
397 attributes.y = widget->allocation.y + border_width;
398 attributes.width = widget->allocation.width - border_width * 2;
399 attributes.height = widget->allocation.height - border_width * 2;
400 attributes.wclass = GDK_INPUT_OUTPUT;
401 attributes.visual = gtk_widget_get_visual (widget);
402 attributes.colormap = gtk_widget_get_colormap (widget);
403 attributes.event_mask = gtk_widget_get_events (widget);
404 attributes.event_mask |= (GDK_EXPOSURE_MASK |
405 GDK_BUTTON_PRESS_MASK |
406 GDK_BUTTON_RELEASE_MASK |
407 GDK_ENTER_NOTIFY_MASK |
408 GDK_LEAVE_NOTIFY_MASK);
410 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
412 widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
413 gdk_window_set_user_data (widget->window, button);
415 widget->style = gtk_style_attach (widget->style, widget->window);
416 gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
420 gtk_button_size_request (GtkWidget *widget,
421 GtkRequisition *requisition)
425 g_return_if_fail (widget != NULL);
426 g_return_if_fail (GTK_IS_BUTTON (widget));
427 g_return_if_fail (requisition != NULL);
429 button = GTK_BUTTON (widget);
431 requisition->width = (GTK_CONTAINER (widget)->border_width + CHILD_SPACING +
432 GTK_WIDGET (widget)->style->xthickness) * 2;
433 requisition->height = (GTK_CONTAINER (widget)->border_width + CHILD_SPACING +
434 GTK_WIDGET (widget)->style->ythickness) * 2;
436 if (GTK_WIDGET_CAN_DEFAULT (widget))
438 requisition->width += (GTK_WIDGET (widget)->style->xthickness * 2 +
440 requisition->height += (GTK_WIDGET (widget)->style->ythickness * 2 +
444 if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child))
446 GtkRequisition child_requisition;
448 gtk_widget_size_request (GTK_BIN (button)->child, &child_requisition);
450 requisition->width += child_requisition.width;
451 requisition->height += child_requisition.height;
456 gtk_button_size_allocate (GtkWidget *widget,
457 GtkAllocation *allocation)
460 GtkAllocation child_allocation;
463 g_return_if_fail (widget != NULL);
464 g_return_if_fail (GTK_IS_BUTTON (widget));
465 g_return_if_fail (allocation != NULL);
467 widget->allocation = *allocation;
468 border_width = GTK_CONTAINER (widget)->border_width;
470 if (GTK_WIDGET_REALIZED (widget))
471 gdk_window_move_resize (widget->window,
472 widget->allocation.x + border_width,
473 widget->allocation.y + border_width,
474 widget->allocation.width - border_width * 2,
475 widget->allocation.height - border_width * 2);
477 button = GTK_BUTTON (widget);
479 if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child))
481 child_allocation.x = (CHILD_SPACING + GTK_WIDGET (widget)->style->xthickness);
482 child_allocation.y = (CHILD_SPACING + GTK_WIDGET (widget)->style->ythickness);
484 child_allocation.width = MAX (1, (gint)widget->allocation.width - child_allocation.x * 2 -
486 child_allocation.height = MAX (1, (gint)widget->allocation.height - child_allocation.y * 2 -
489 if (GTK_WIDGET_CAN_DEFAULT (button))
491 child_allocation.x += (GTK_WIDGET (widget)->style->xthickness +
493 child_allocation.y += (GTK_WIDGET (widget)->style->ythickness +
495 child_allocation.width = MAX (1, (gint)child_allocation.width -
496 (gint)(GTK_WIDGET (widget)->style->xthickness * 2 + DEFAULT_SPACING));
497 child_allocation.height = MAX (1, (gint)child_allocation.height -
498 (gint)(GTK_WIDGET (widget)->style->xthickness * 2 + DEFAULT_SPACING));
501 gtk_widget_size_allocate (GTK_BIN (button)->child, &child_allocation);
506 * +------------------------------------------------+
508 * | +------------------------------------------+ |
509 * | |\\\\\\\\\\\\\\\\DEFAULT\\\\\\\\\\\\\\\\\ | |
510 * | |\\+------------------------------------+ | |
511 * | |\\| | SPACING 3 | | | |
512 * | |\\| +--------------------------------+ | | |
513 * | |\\| |########## FOCUS ###############| | | |
514 * | |\\| |#+----------------------------+#| | | |
515 * | |\\| |#| RELIEF \|#| | | |
516 * | |\\| |#| +-----------------------+\|#| | | |
517 * | |\\|1|#| + THE TEXT +\|#|2| | |
518 * | |\\| |#| +-----------------------+\|#| | | |
519 * | |\\| |#| \\\\\ ythickness \\\\\\\\\\|#| | | |
520 * | |\\| |#+----------------------------+#| | | |
521 * | |\\| |########### 1 ##################| | | |
522 * | |\\| +--------------------------------+ | | |
523 * | |\\| | default spacing 4 | | | |
524 * | |\\+------------------------------------+ | |
525 * | |\ ythickness | |
526 * | +------------------------------------------+ |
528 * +------------------------------------------------+
532 gtk_button_paint (GtkWidget *widget,
536 GtkShadowType shadow_type;
540 if (GTK_WIDGET_DRAWABLE (widget))
542 button = GTK_BUTTON (widget);
546 width = widget->allocation.width - GTK_CONTAINER (widget)->border_width * 2;
547 height = widget->allocation.height - GTK_CONTAINER (widget)->border_width * 2;
549 gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
550 gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height);
552 if (GTK_WIDGET_HAS_DEFAULT (widget) &&
553 GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL)
555 gtk_paint_box (widget->style, widget->window,
556 GTK_STATE_NORMAL, GTK_SHADOW_IN,
557 area, widget, "buttondefault",
558 x, y, width, height);
561 if (GTK_WIDGET_CAN_DEFAULT (widget))
563 x += widget->style->xthickness;
564 y += widget->style->ythickness;
565 width -= 2 * x + DEFAULT_SPACING;
566 height -= 2 * y + DEFAULT_SPACING;
567 x += DEFAULT_LEFT_POS;
568 y += DEFAULT_TOP_POS;
571 if (GTK_WIDGET_HAS_FOCUS (widget))
579 if (GTK_WIDGET_STATE (widget) == GTK_STATE_ACTIVE)
580 shadow_type = GTK_SHADOW_IN;
582 shadow_type = GTK_SHADOW_OUT;
584 if ((button->relief != GTK_RELIEF_NONE) ||
585 ((GTK_WIDGET_STATE(widget) != GTK_STATE_NORMAL) &&
586 (GTK_WIDGET_STATE(widget) != GTK_STATE_INSENSITIVE)))
587 gtk_paint_box (widget->style, widget->window,
588 GTK_WIDGET_STATE (widget),
589 shadow_type, area, widget, "button",
590 x, y, width, height);
592 if (GTK_WIDGET_HAS_FOCUS (widget))
599 gtk_paint_focus (widget->style, widget->window,
600 area, widget, "button",
601 x, y, width - 1, height - 1);
607 gtk_button_draw (GtkWidget *widget,
611 GdkRectangle child_area;
612 GdkRectangle tmp_area;
614 g_return_if_fail (widget != NULL);
615 g_return_if_fail (GTK_IS_BUTTON (widget));
616 g_return_if_fail (area != NULL);
618 if (GTK_WIDGET_DRAWABLE (widget))
620 button = GTK_BUTTON (widget);
623 tmp_area.x -= GTK_CONTAINER (button)->border_width;
624 tmp_area.y -= GTK_CONTAINER (button)->border_width;
626 gtk_button_paint (widget, &tmp_area);
628 if (GTK_BIN (button)->child && gtk_widget_intersect (GTK_BIN (button)->child, &tmp_area, &child_area))
629 gtk_widget_draw (GTK_BIN (button)->child, &child_area);
634 gtk_button_draw_focus (GtkWidget *widget)
636 gtk_widget_draw (widget, NULL);
640 gtk_button_draw_default (GtkWidget *widget)
642 gtk_widget_draw (widget, NULL);
646 gtk_button_expose (GtkWidget *widget,
647 GdkEventExpose *event)
650 GdkEventExpose child_event;
652 g_return_val_if_fail (widget != NULL, FALSE);
653 g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE);
654 g_return_val_if_fail (event != NULL, FALSE);
656 if (GTK_WIDGET_DRAWABLE (widget))
658 bin = GTK_BIN (widget);
660 gtk_button_paint (widget, &event->area);
662 child_event = *event;
663 if (bin->child && GTK_WIDGET_NO_WINDOW (bin->child) &&
664 gtk_widget_intersect (bin->child, &event->area, &child_event.area))
665 gtk_widget_event (bin->child, (GdkEvent*) &child_event);
672 gtk_button_button_press (GtkWidget *widget,
673 GdkEventButton *event)
677 g_return_val_if_fail (widget != NULL, FALSE);
678 g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE);
679 g_return_val_if_fail (event != NULL, FALSE);
681 if (event->type == GDK_BUTTON_PRESS)
683 button = GTK_BUTTON (widget);
685 if (!GTK_WIDGET_HAS_FOCUS (widget))
686 gtk_widget_grab_focus (widget);
688 if (event->button == 1)
690 gtk_grab_add (GTK_WIDGET (button));
691 gtk_button_pressed (button);
699 gtk_button_button_release (GtkWidget *widget,
700 GdkEventButton *event)
704 g_return_val_if_fail (widget != NULL, FALSE);
705 g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE);
706 g_return_val_if_fail (event != NULL, FALSE);
708 if (event->button == 1)
710 button = GTK_BUTTON (widget);
711 gtk_grab_remove (GTK_WIDGET (button));
712 gtk_button_released (button);
719 gtk_button_enter_notify (GtkWidget *widget,
720 GdkEventCrossing *event)
723 GtkWidget *event_widget;
725 g_return_val_if_fail (widget != NULL, FALSE);
726 g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE);
727 g_return_val_if_fail (event != NULL, FALSE);
729 button = GTK_BUTTON (widget);
730 event_widget = gtk_get_event_widget ((GdkEvent*) event);
732 if ((event_widget == widget) &&
733 (event->detail != GDK_NOTIFY_INFERIOR))
735 button->in_button = TRUE;
736 gtk_button_enter (button);
743 gtk_button_leave_notify (GtkWidget *widget,
744 GdkEventCrossing *event)
747 GtkWidget *event_widget;
749 g_return_val_if_fail (widget != NULL, FALSE);
750 g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE);
751 g_return_val_if_fail (event != NULL, FALSE);
753 button = GTK_BUTTON (widget);
754 event_widget = gtk_get_event_widget ((GdkEvent*) event);
756 if ((event_widget == widget) &&
757 (event->detail != GDK_NOTIFY_INFERIOR))
759 button->in_button = FALSE;
760 gtk_button_leave (button);
767 gtk_button_focus_in (GtkWidget *widget,
768 GdkEventFocus *event)
770 g_return_val_if_fail (widget != NULL, FALSE);
771 g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE);
772 g_return_val_if_fail (event != NULL, FALSE);
774 GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
775 gtk_widget_draw_focus (widget);
781 gtk_button_focus_out (GtkWidget *widget,
782 GdkEventFocus *event)
784 g_return_val_if_fail (widget != NULL, FALSE);
785 g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE);
786 g_return_val_if_fail (event != NULL, FALSE);
788 GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
789 gtk_widget_draw_focus (widget);
795 gtk_button_add (GtkContainer *container,
798 g_return_if_fail (container != NULL);
799 g_return_if_fail (widget != NULL);
801 if (GTK_CONTAINER_CLASS (parent_class)->add)
802 GTK_CONTAINER_CLASS (parent_class)->add (container, widget);
804 GTK_BUTTON (container)->child = GTK_BIN (container)->child;
808 gtk_button_remove (GtkContainer *container,
811 g_return_if_fail (container != NULL);
812 g_return_if_fail (widget != NULL);
814 if (GTK_CONTAINER_CLASS (parent_class)->remove)
815 GTK_CONTAINER_CLASS (parent_class)->remove (container, widget);
817 GTK_BUTTON (container)->child = GTK_BIN (container)->child;
821 gtk_real_button_pressed (GtkButton *button)
823 GtkStateType new_state;
825 g_return_if_fail (button != NULL);
826 g_return_if_fail (GTK_IS_BUTTON (button));
828 button->button_down = TRUE;
830 new_state = (button->in_button ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL);
832 if (GTK_WIDGET_STATE (button) != new_state)
834 gtk_widget_set_state (GTK_WIDGET (button), new_state);
835 gtk_widget_queue_draw (GTK_WIDGET (button));
840 gtk_real_button_released (GtkButton *button)
842 GtkStateType new_state;
844 g_return_if_fail (button != NULL);
845 g_return_if_fail (GTK_IS_BUTTON (button));
847 if (button->button_down)
849 button->button_down = FALSE;
851 if (button->in_button)
852 gtk_button_clicked (button);
854 new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL);
856 if (GTK_WIDGET_STATE (button) != new_state)
858 gtk_widget_set_state (GTK_WIDGET (button), new_state);
859 /* We _draw () instead of queue_draw so that if the operation
860 * blocks, the label doesn't vanish.
862 gtk_widget_draw (GTK_WIDGET (button), NULL);
868 gtk_real_button_enter (GtkButton *button)
870 GtkStateType new_state;
872 g_return_if_fail (button != NULL);
873 g_return_if_fail (GTK_IS_BUTTON (button));
875 new_state = (button->button_down ? GTK_STATE_ACTIVE : GTK_STATE_PRELIGHT);
877 if (GTK_WIDGET_STATE (button) != new_state)
879 gtk_widget_set_state (GTK_WIDGET (button), new_state);
880 gtk_widget_queue_draw (GTK_WIDGET (button));
885 gtk_real_button_leave (GtkButton *button)
887 g_return_if_fail (button != NULL);
888 g_return_if_fail (GTK_IS_BUTTON (button));
890 if (GTK_WIDGET_STATE (button) != GTK_STATE_NORMAL)
892 gtk_widget_set_state (GTK_WIDGET (button), GTK_STATE_NORMAL);
893 gtk_widget_queue_draw (GTK_WIDGET (button));