summaryrefslogtreecommitdiff
path: root/gtk/gtktogglebutton.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@src.gnome.org>1998-11-06 22:05:02 +0000
committerOwen Taylor <otaylor@src.gnome.org>1998-11-06 22:05:02 +0000
commite2a521922085c8010028e227f61bba59ea6b8242 (patch)
tree2500d6aa6f63aab4b58c17546532ecce8fdcca37 /gtk/gtktogglebutton.c
parent3c0df19a588bd96f328bda975db8eb9fa7f79e81 (diff)
downloadgtk+-e2a521922085c8010028e227f61bba59ea6b8242.tar.gz
Merge from themes-2. See the ChangeLog for a somewhat detailed
history of the evolution of the changes involved. Most of this is actually minor painting tweaks.
Diffstat (limited to 'gtk/gtktogglebutton.c')
-rw-r--r--gtk/gtktogglebutton.c122
1 files changed, 102 insertions, 20 deletions
diff --git a/gtk/gtktogglebutton.c b/gtk/gtktogglebutton.c
index 2c5b67eafc..cd8e6e04e2 100644
--- a/gtk/gtktogglebutton.c
+++ b/gtk/gtktogglebutton.c
@@ -52,10 +52,12 @@ static void gtk_toggle_button_set_arg (GtkObject *object,
static void gtk_toggle_button_get_arg (GtkObject *object,
GtkArg *arg,
guint arg_id);
-
+static void gtk_toggle_button_leave (GtkButton *button);
+static void gtk_toggle_button_realize (GtkWidget *widget);
+static void gtk_toggle_button_unrealize (GtkWidget *widget);
static guint toggle_button_signals[LAST_SIGNAL] = { 0 };
-
+static GtkContainerClass *parent_class = NULL;
GtkType
gtk_toggle_button_get_type (void)
@@ -95,6 +97,8 @@ gtk_toggle_button_class_init (GtkToggleButtonClass *class)
container_class = (GtkContainerClass*) class;
button_class = (GtkButtonClass*) class;
+ parent_class = gtk_type_class (GTK_TYPE_BUTTON);
+
gtk_object_add_arg_type ("GtkToggleButton::active", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_ACTIVE);
gtk_object_add_arg_type ("GtkToggleButton::draw_indicator", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_DRAW_INDICATOR);
@@ -112,6 +116,8 @@ gtk_toggle_button_class_init (GtkToggleButtonClass *class)
object_class->get_arg = gtk_toggle_button_get_arg;
widget_class->draw_focus = gtk_toggle_button_draw_focus;
+ widget_class->realize = gtk_toggle_button_realize;
+ widget_class->unrealize = gtk_toggle_button_unrealize;
button_class->pressed = gtk_toggle_button_pressed;
button_class->released = gtk_toggle_button_released;
@@ -208,7 +214,15 @@ gtk_toggle_button_set_mode (GtkToggleButton *toggle_button,
if (toggle_button->draw_indicator != draw_indicator)
{
- toggle_button->draw_indicator = draw_indicator;
+ if (GTK_WIDGET_REALIZED(toggle_button))
+ {
+ gtk_widget_unrealize(GTK_WIDGET(toggle_button));
+ toggle_button->draw_indicator = draw_indicator;
+ gtk_widget_realize(GTK_WIDGET(toggle_button));
+ gtk_widget_show(GTK_WIDGET(toggle_button));
+ }
+ else
+ toggle_button->draw_indicator = draw_indicator;
if (GTK_WIDGET_VISIBLE (toggle_button))
gtk_widget_queue_resize (GTK_WIDGET (toggle_button));
@@ -272,26 +286,16 @@ gtk_toggle_button_draw_focus (GtkWidget *widget)
width -= 2;
height -= 2;
}
- else
- {
- if (GTK_WIDGET_STATE (toggle_button) == GTK_STATE_ACTIVE)
- gdk_draw_rectangle (widget->window,
- widget->style->bg_gc[GTK_WIDGET_STATE (widget)], FALSE,
- x + 1, y + 1, width - 4, height - 4);
- else
- gdk_draw_rectangle (widget->window,
- widget->style->bg_gc[GTK_WIDGET_STATE (widget)], FALSE,
- x + 2, y + 2, width - 5, height - 5);
- }
if (toggle_button->active)
shadow_type = GTK_SHADOW_IN;
else
shadow_type = GTK_SHADOW_OUT;
- gtk_draw_shadow (widget->style, widget->window,
- GTK_WIDGET_STATE (widget), shadow_type,
- x, y, width, height);
+ gtk_paint_box (widget->style, widget->window,
+ GTK_WIDGET_STATE (widget), shadow_type,
+ NULL, widget, "togglebutton",
+ x, y, width, height);
if (GTK_WIDGET_HAS_FOCUS (widget))
{
@@ -300,10 +304,11 @@ gtk_toggle_button_draw_focus (GtkWidget *widget)
width += 2;
height += 2;
- gdk_draw_rectangle (widget->window,
- widget->style->black_gc, FALSE,
- x, y, width - 1, height - 1);
+ gtk_paint_focus (widget->style, widget->window,
+ NULL, widget, "togglebutton",
+ x, y, width - 1, height - 1);
}
+ gtk_widget_draw (GTK_BIN (widget)->child, NULL);
}
}
@@ -433,3 +438,80 @@ gtk_toggle_button_leave (GtkButton *button)
gtk_widget_queue_draw (GTK_WIDGET (button));
}
}
+
+static void
+gtk_toggle_button_realize (GtkWidget *widget)
+{
+ GtkToggleButton *toggle_button;
+ GdkWindowAttr attributes;
+ gint attributes_mask;
+ gint border_width;
+
+ g_return_if_fail (widget != NULL);
+ g_return_if_fail (GTK_IS_TOGGLE_BUTTON (widget));
+
+ toggle_button = GTK_TOGGLE_BUTTON (widget);
+ GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
+
+ border_width = GTK_CONTAINER (widget)->border_width;
+
+ attributes.window_type = GDK_WINDOW_CHILD;
+ attributes.x = widget->allocation.x + border_width;
+ attributes.y = widget->allocation.y + border_width;
+ attributes.width = widget->allocation.width - border_width * 2;
+ attributes.height = widget->allocation.height - border_width * 2;
+ attributes.event_mask = gtk_widget_get_events (widget);
+ attributes.event_mask |= (GDK_EXPOSURE_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_ENTER_NOTIFY_MASK |
+ GDK_LEAVE_NOTIFY_MASK);
+
+ if (toggle_button->draw_indicator)
+ {
+ GTK_WIDGET_SET_FLAGS (toggle_button, GTK_NO_WINDOW);
+ attributes.wclass = GDK_INPUT_ONLY;
+ attributes_mask = GDK_WA_X | GDK_WA_Y;
+
+ widget->window = gtk_widget_get_parent_window(widget);
+ gdk_window_ref(widget->window);
+
+ toggle_button->event_window =
+ gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
+ gdk_window_show(toggle_button->event_window);
+ gdk_window_set_user_data (toggle_button->event_window, toggle_button);
+ }
+ else
+ {
+ GTK_WIDGET_UNSET_FLAGS (toggle_button, GTK_NO_WINDOW);
+ attributes.wclass = GDK_INPUT_OUTPUT;
+ attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+ attributes.visual = gtk_widget_get_visual (widget);
+ attributes.colormap = gtk_widget_get_colormap (widget);
+ widget->window =
+ gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
+ gdk_window_set_user_data (widget->window, toggle_button);
+ }
+ widget->style = gtk_style_attach (widget->style, widget->window);
+}
+
+static void
+gtk_toggle_button_unrealize (GtkWidget *widget)
+{
+ GtkToggleButton *toggle_button;
+
+ g_return_if_fail (widget != NULL);
+ g_return_if_fail (GTK_IS_TOGGLE_BUTTON (widget));
+
+ toggle_button = GTK_TOGGLE_BUTTON (widget);
+
+ if (toggle_button->draw_indicator)
+ {
+ gdk_window_set_user_data (toggle_button->event_window, NULL);
+ gdk_window_destroy (toggle_button->event_window);
+ toggle_button->event_window = NULL;
+ }
+
+ if (GTK_WIDGET_CLASS (parent_class)->unrealize)
+ (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+}