diff options
author | Owen Taylor <otaylor@src.gnome.org> | 1998-11-06 22:05:02 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 1998-11-06 22:05:02 +0000 |
commit | e2a521922085c8010028e227f61bba59ea6b8242 (patch) | |
tree | 2500d6aa6f63aab4b58c17546532ecce8fdcca37 /gtk/gtktogglebutton.c | |
parent | 3c0df19a588bd96f328bda975db8eb9fa7f79e81 (diff) | |
download | gtk+-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.c | 122 |
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); +} |