X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkradiobutton.c;h=ec6c2c6357ddb860110129a37c9ab9fafca37e60;hb=9d0febc9a64a5bfb0fcfc3a88de4757f6c1ff090;hp=33479503ab52c0310c268cb0c2aa8cb20b496200;hpb=80d1ce9f676f7eacf66a46cf749c20b840287124;p=~andy%2Fgtk diff --git a/gtk/gtkradiobutton.c b/gtk/gtkradiobutton.c index 33479503a..ec6c2c635 100644 --- a/gtk/gtkradiobutton.c +++ b/gtk/gtkradiobutton.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -33,6 +31,7 @@ #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtkintl.h" +#include "a11y/gtkradiobuttonaccessible.h" /** * SECTION:gtkradiobutton @@ -175,7 +174,7 @@ gtk_radio_button_class_init (GtkRadioButtonClass *class) /** * GtkRadioButton::group-changed: - * @style: the object which received the signal + * @button: the object which received the signal * * Emitted when the group of radio buttons that a radio button belongs * to changes. This is emitted when a radio button switches from @@ -195,6 +194,8 @@ gtk_radio_button_class_init (GtkRadioButtonClass *class) G_TYPE_NONE, 0); g_type_class_add_private (class, sizeof (GtkRadioButtonPrivate)); + + gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_RADIO_BUTTON_ACCESSIBLE); } static void @@ -207,7 +208,6 @@ gtk_radio_button_init (GtkRadioButton *radio_button) GtkRadioButtonPrivate); priv = radio_button->priv; - gtk_widget_set_has_window (GTK_WIDGET (radio_button), FALSE); gtk_widget_set_receives_default (GTK_WIDGET (radio_button), FALSE); _gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button), TRUE); @@ -403,8 +403,8 @@ gtk_radio_button_join_group (GtkRadioButton *radio_button, /** * gtk_radio_button_new: - * @group: (allow-none): an existing radio button group, or %NULL if you are - * creating a new group. + * @group: (element-type GtkRadioButton) (allow-none): an existing + * radio button group, or %NULL if you are creating a new group. * * Creates a new #GtkRadioButton. To be of any practical value, a widget should * then be packed into the radio button. @@ -426,13 +426,13 @@ gtk_radio_button_new (GSList *group) /** * gtk_radio_button_new_with_label: - * @group: (allow-none): an existing radio button group, or %NULL if you are - * creating a new group. + * @group: (element-type GtkRadioButton) (allow-none): an existing + * radio button group, or %NULL if you are creating a new group. * @label: the text label to display next to the radio button. * * Creates a new #GtkRadioButton with a text label. * - * Returns: (transfer full): a new radio button. + * Returns: a new radio button. */ GtkWidget* gtk_radio_button_new_with_label (GSList *group, @@ -451,7 +451,8 @@ gtk_radio_button_new_with_label (GSList *group, /** * gtk_radio_button_new_with_mnemonic: - * @group: (allow-none): the radio button group + * @group: (element-type GtkRadioButton) (allow-none): the radio button + * group * @label: the text of the button, with an underscore in front of the * mnemonic character * @@ -460,7 +461,7 @@ gtk_radio_button_new_with_label (GSList *group, * gtk_label_new_with_mnemonic(), so underscores in @label indicate the * mnemonic for the button. * - * Returns: (transfer full): a new #GtkRadioButton + * Returns: a new #GtkRadioButton */ GtkWidget* gtk_radio_button_new_with_mnemonic (GSList *group, @@ -480,14 +481,14 @@ gtk_radio_button_new_with_mnemonic (GSList *group, } /** - * gtk_radio_button_new_from_widget: + * gtk_radio_button_new_from_widget: (constructor) * @radio_group_member: (allow-none): an existing #GtkRadioButton. * * Creates a new #GtkRadioButton, adding it to the same group as * @radio_group_member. As with gtk_radio_button_new(), a widget * should be packed into the radio button. * - * Returns: (transfer full): a new radio button. + * Returns: (transfer none): a new radio button. */ GtkWidget* gtk_radio_button_new_from_widget (GtkRadioButton *radio_group_member) @@ -499,7 +500,7 @@ gtk_radio_button_new_from_widget (GtkRadioButton *radio_group_member) } /** - * gtk_radio_button_new_with_label_from_widget: + * gtk_radio_button_new_with_label_from_widget: (constructor) * @radio_group_member: (allow-none): widget to get radio group from or %NULL * @label: a text string to display next to the radio button. * @@ -519,7 +520,7 @@ gtk_radio_button_new_with_label_from_widget (GtkRadioButton *radio_group_member, } /** - * gtk_radio_button_new_with_mnemonic_from_widget: + * gtk_radio_button_new_with_mnemonic_from_widget: (constructor) * @radio_group_member: (allow-none): widget to get radio group from or %NULL * @label: the text of the button, with an underscore in front of the * mnemonic character @@ -528,7 +529,7 @@ gtk_radio_button_new_with_label_from_widget (GtkRadioButton *radio_group_member, * will be created using gtk_label_new_with_mnemonic(), so underscores * in @label indicate the mnemonic for the button. * - * Returns: (transfer full): a new #GtkRadioButton + * Returns: (transfer none): a new #GtkRadioButton **/ GtkWidget* gtk_radio_button_new_with_mnemonic_from_widget (GtkRadioButton *radio_group_member, @@ -799,6 +800,10 @@ gtk_radio_button_clicked (GtkButton *button) g_object_ref (GTK_WIDGET (button)); + new_state = gtk_widget_get_state_flags (GTK_WIDGET (button)) & + ~(GTK_STATE_FLAG_PRELIGHT | + GTK_STATE_FLAG_ACTIVE); + if (gtk_toggle_button_get_active (toggle_button)) { tmp_button = NULL; @@ -891,10 +896,8 @@ gtk_radio_button_draw_indicator (GtkCheckButton *check_button, GtkWidget *child; GtkButton *button; GtkToggleButton *toggle_button; - GtkStateType state_type; - GtkShadowType shadow_type; - GtkStyle *style; - GdkWindow *window; + GtkStyleContext *context; + GtkStateFlags state = 0; gint x, y; gint indicator_size, indicator_spacing; gint focus_width; @@ -905,18 +908,17 @@ gtk_radio_button_draw_indicator (GtkCheckButton *check_button, widget = GTK_WIDGET (check_button); button = GTK_BUTTON (check_button); toggle_button = GTK_TOGGLE_BUTTON (check_button); + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); - style = gtk_widget_get_style (widget); gtk_widget_style_get (widget, "interior-focus", &interior_focus, "focus-line-width", &focus_width, "focus-padding", &focus_pad, NULL); - window = gtk_widget_get_window (widget); - _gtk_check_button_get_props (check_button, &indicator_size, &indicator_spacing); gtk_widget_get_allocation (widget, &allocation); @@ -926,40 +928,41 @@ gtk_radio_button_draw_indicator (GtkCheckButton *check_button, child = gtk_bin_get_child (GTK_BIN (check_button)); if (!interior_focus || !(child && gtk_widget_get_visible (child))) - x += focus_width + focus_pad; + x += focus_width + focus_pad; + + state &= ~(GTK_STATE_FLAG_INCONSISTENT | + GTK_STATE_FLAG_ACTIVE | + GTK_STATE_FLAG_SELECTED | + GTK_STATE_FLAG_PRELIGHT); if (gtk_toggle_button_get_inconsistent (toggle_button)) - shadow_type = GTK_SHADOW_ETCHED_IN; + state |= GTK_STATE_FLAG_INCONSISTENT; else if (gtk_toggle_button_get_active (toggle_button)) - shadow_type = GTK_SHADOW_IN; - else - shadow_type = GTK_SHADOW_OUT; - - if (button->priv->activate_timeout || (button->priv->button_down && button->priv->in_button)) - state_type = GTK_STATE_ACTIVE; - else if (button->priv->in_button) - state_type = GTK_STATE_PRELIGHT; - else if (!gtk_widget_is_sensitive (widget)) - state_type = GTK_STATE_INSENSITIVE; - else - state_type = GTK_STATE_NORMAL; + state |= GTK_STATE_FLAG_ACTIVE; + + if (button->priv->activate_timeout || + (button->priv->button_down && button->priv->in_button)) + state |= GTK_STATE_FLAG_SELECTED; + + if (button->priv->in_button && !(state & GTK_STATE_FLAG_INSENSITIVE)) + state |= GTK_STATE_FLAG_PRELIGHT; if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) x = allocation.width - (indicator_size + x); - if (gtk_widget_get_state (widget) == GTK_STATE_PRELIGHT) - { - gtk_paint_flat_box (style, cr, - GTK_STATE_PRELIGHT, - GTK_SHADOW_ETCHED_OUT, - widget, "checkbutton", - border_width, border_width, - allocation.width - (2 * border_width), - allocation.height - (2 * border_width)); - } + gtk_style_context_save (context); + gtk_style_context_set_state (context, state); + + if (state & GTK_STATE_FLAG_PRELIGHT) + gtk_render_background (context, cr, + border_width, border_width, + allocation.width - (2 * border_width), + allocation.height - (2 * border_width)); + + gtk_style_context_add_class (context, GTK_STYLE_CLASS_RADIO); + + gtk_render_option (context, cr, + x, y, indicator_size, indicator_size); - gtk_paint_option (style, cr, - state_type, shadow_type, - widget, "radiobutton", - x, y, indicator_size, indicator_size); + gtk_style_context_restore (context); }