diff options
author | Owen Taylor <otaylor@redhat.com> | 2000-08-22 03:05:14 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2000-08-22 03:05:14 +0000 |
commit | 92b22465818a783b693aa530274eb2f9b6019fec (patch) | |
tree | 88e9b26360363e59635e7376512d8d7bfafa30ad | |
parent | cae2af57d5600b94641540b757dc8e46d92557fa (diff) | |
download | gtk+-92b22465818a783b693aa530274eb2f9b6019fec.tar.gz |
Add gtk_widget_modify_{fg,bg,text,base,font}.
Mon Aug 21 22:39:18 2000 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwidget.[ch]: Add gtk_widget_modify_{fg,bg,text,base,font}.
* gtk/testgtk.c (create_styles): Add a test for modifying
the style through gtk_widget_modify_*.
* gtk/gtkwidget.c (gtk_widget_get_modifier_style): Add
a function to get the current modifier style.
* gtk/gtkwidget.c (gtk_widget_modify_style): Make a copy
of the passed in GtkRcStyle instead of ref'ing it.
* gtk/gtkrc.[ch]: Add gtk_rc_style_copy().
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 15 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 15 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 15 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 15 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 15 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 15 | ||||
-rw-r--r-- | gtk/gtkrc.c | 23 | ||||
-rw-r--r-- | gtk/gtkrc.h | 1 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 220 | ||||
-rw-r--r-- | gtk/gtkwidget.h | 19 | ||||
-rw-r--r-- | gtk/testgtk.c | 120 | ||||
-rw-r--r-- | tests/testgtk.c | 120 |
13 files changed, 602 insertions, 6 deletions
@@ -1,3 +1,18 @@ +Mon Aug 21 22:39:18 2000 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkwidget.[ch]: Add gtk_widget_modify_{fg,bg,text,base,font}. + + * gtk/testgtk.c (create_styles): Add a test for modifying + the style through gtk_widget_modify_*. + + * gtk/gtkwidget.c (gtk_widget_get_modifier_style): Add + a function to get the current modifier style. + + * gtk/gtkwidget.c (gtk_widget_modify_style): Make a copy + of the passed in GtkRcStyle instead of ref'ing it. + + * gtk/gtkrc.[ch]: Add gtk_rc_style_copy(). + 2000-08-20 Tor Lillqvist <tml@iki.fi> * gdk/gdkimage.h diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 726a4970fd..c4d6fe9c5b 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,18 @@ +Mon Aug 21 22:39:18 2000 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkwidget.[ch]: Add gtk_widget_modify_{fg,bg,text,base,font}. + + * gtk/testgtk.c (create_styles): Add a test for modifying + the style through gtk_widget_modify_*. + + * gtk/gtkwidget.c (gtk_widget_get_modifier_style): Add + a function to get the current modifier style. + + * gtk/gtkwidget.c (gtk_widget_modify_style): Make a copy + of the passed in GtkRcStyle instead of ref'ing it. + + * gtk/gtkrc.[ch]: Add gtk_rc_style_copy(). + 2000-08-20 Tor Lillqvist <tml@iki.fi> * gdk/gdkimage.h diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 726a4970fd..c4d6fe9c5b 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,18 @@ +Mon Aug 21 22:39:18 2000 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkwidget.[ch]: Add gtk_widget_modify_{fg,bg,text,base,font}. + + * gtk/testgtk.c (create_styles): Add a test for modifying + the style through gtk_widget_modify_*. + + * gtk/gtkwidget.c (gtk_widget_get_modifier_style): Add + a function to get the current modifier style. + + * gtk/gtkwidget.c (gtk_widget_modify_style): Make a copy + of the passed in GtkRcStyle instead of ref'ing it. + + * gtk/gtkrc.[ch]: Add gtk_rc_style_copy(). + 2000-08-20 Tor Lillqvist <tml@iki.fi> * gdk/gdkimage.h diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 726a4970fd..c4d6fe9c5b 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,18 @@ +Mon Aug 21 22:39:18 2000 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkwidget.[ch]: Add gtk_widget_modify_{fg,bg,text,base,font}. + + * gtk/testgtk.c (create_styles): Add a test for modifying + the style through gtk_widget_modify_*. + + * gtk/gtkwidget.c (gtk_widget_get_modifier_style): Add + a function to get the current modifier style. + + * gtk/gtkwidget.c (gtk_widget_modify_style): Make a copy + of the passed in GtkRcStyle instead of ref'ing it. + + * gtk/gtkrc.[ch]: Add gtk_rc_style_copy(). + 2000-08-20 Tor Lillqvist <tml@iki.fi> * gdk/gdkimage.h diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 726a4970fd..c4d6fe9c5b 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,18 @@ +Mon Aug 21 22:39:18 2000 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkwidget.[ch]: Add gtk_widget_modify_{fg,bg,text,base,font}. + + * gtk/testgtk.c (create_styles): Add a test for modifying + the style through gtk_widget_modify_*. + + * gtk/gtkwidget.c (gtk_widget_get_modifier_style): Add + a function to get the current modifier style. + + * gtk/gtkwidget.c (gtk_widget_modify_style): Make a copy + of the passed in GtkRcStyle instead of ref'ing it. + + * gtk/gtkrc.[ch]: Add gtk_rc_style_copy(). + 2000-08-20 Tor Lillqvist <tml@iki.fi> * gdk/gdkimage.h diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 726a4970fd..c4d6fe9c5b 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,18 @@ +Mon Aug 21 22:39:18 2000 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkwidget.[ch]: Add gtk_widget_modify_{fg,bg,text,base,font}. + + * gtk/testgtk.c (create_styles): Add a test for modifying + the style through gtk_widget_modify_*. + + * gtk/gtkwidget.c (gtk_widget_get_modifier_style): Add + a function to get the current modifier style. + + * gtk/gtkwidget.c (gtk_widget_modify_style): Make a copy + of the passed in GtkRcStyle instead of ref'ing it. + + * gtk/gtkrc.[ch]: Add gtk_rc_style_copy(). + 2000-08-20 Tor Lillqvist <tml@iki.fi> * gdk/gdkimage.h diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 726a4970fd..c4d6fe9c5b 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,18 @@ +Mon Aug 21 22:39:18 2000 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkwidget.[ch]: Add gtk_widget_modify_{fg,bg,text,base,font}. + + * gtk/testgtk.c (create_styles): Add a test for modifying + the style through gtk_widget_modify_*. + + * gtk/gtkwidget.c (gtk_widget_get_modifier_style): Add + a function to get the current modifier style. + + * gtk/gtkwidget.c (gtk_widget_modify_style): Make a copy + of the passed in GtkRcStyle instead of ref'ing it. + + * gtk/gtkrc.[ch]: Add gtk_rc_style_copy(). + 2000-08-20 Tor Lillqvist <tml@iki.fi> * gdk/gdkimage.h diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c index 6b651a75ca..c31fc5062d 100644 --- a/gtk/gtkrc.c +++ b/gtk/gtkrc.c @@ -871,6 +871,29 @@ gtk_rc_style_new (void) return style; } +/** + * gtk_rc_style_copy: + * @orig: the style to copy + * + * Make a copy of the specified #GtkRcStyle. This function + * will correctly copy an rc style that is a member of a class + * derived from #GtkRcStyle. + * + * Return value: the resulting #GtkRcStyle + **/ +GtkRcStyle * +gtk_rc_style_copy (GtkRcStyle *orig) +{ + GtkRcStyle *style; + + g_return_if_fail (GTK_IS_RC_STYLE (orig)); + + style = GTK_RC_STYLE_GET_CLASS (orig)->clone (orig); + GTK_RC_STYLE_GET_CLASS (style)->merge (style, orig); + + return style; +} + void gtk_rc_style_ref (GtkRcStyle *rc_style) { diff --git a/gtk/gtkrc.h b/gtk/gtkrc.h index ebe1bf2c62..31ed606970 100644 --- a/gtk/gtkrc.h +++ b/gtk/gtkrc.h @@ -121,6 +121,7 @@ void gtk_rc_add_class_style (GtkRcStyle *rc_style, GType gtk_rc_style_get_type (void); GtkRcStyle* gtk_rc_style_new (void); +GtkRcStyle *gtk_rc_style_copy (GtkRcStyle *orig); void gtk_rc_style_ref (GtkRcStyle *rc_style); void gtk_rc_style_unref (GtkRcStyle *rc_style); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 4fb3feb01f..440cbbaa7c 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -3035,27 +3035,239 @@ gtk_widget_get_style (GtkWidget *widget) return widget->style; } +/** + * gtk_widget_modify_style: + * @widget: a #GtkWidget + * @style: the #GtkRcStyle holding the style modifications + * + * Modify style values on the widget. Modifications made using this + * technique take precendence over style values set via an RC file, + * however, they will be overriden if a style is explicitely set on + * the widget using gtk_widget_set_style(). The #GtkRcStyle structure + * is designed so each field can either be set or unset, so it is + * possible, using this function, to modify some style values and + * leave the others unchanged. + * + * Note that modifications made with this function are not cumulative + * with previous calls to gtk_widget_modify_style() or with such + * functions as gtk_widget_modify_fg(). If you wish to retain + * previous values, you must first call gtk_widget_get_modifier_style(), + * make your modifications to the returned style, then call + * gtk_widget_modify_style() with that style. On the other hand, + * if you first call gtk_widget_modify_style(), subsequent calls + * to such functions gtk_widget_modify_fg() will be have a cumulative + * effect with the inital modifications. + **/ void gtk_widget_modify_style (GtkWidget *widget, GtkRcStyle *style) { GtkRcStyle *old_style; + + g_return_if_fail (GTK_IS_RC_STYLE (style)); if (!rc_style_key_id) rc_style_key_id = g_quark_from_static_string (rc_style_key); - old_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), rc_style_key_id); + old_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), + rc_style_key_id); if (style != old_style) + gtk_object_set_data_by_id_full (GTK_OBJECT (widget), + rc_style_key_id, + gtk_rc_style_copy (style), + (GtkDestroyNotify)gtk_rc_style_unref); + + if (GTK_WIDGET_RC_STYLE (widget)) + gtk_widget_set_rc_style (widget); +} + +/** + * gtk_widget_get_modifier_style: + * @widget: a #GtkWidget + * + * Return the current modifier style for the widget. (As set by + * gtk_widget_modify_style().) If no style has previously set, a new + * #GtkRcStyle will be created with all values unset, and set as the + * modifier style for the widget. If you make changes to this rc + * style, you must call gtk_widget_modify_style(), passing in the + * returned rc style, to make sure that your changes take effect. + * + * Return value: the modifier style for the widget. This rc style is + * owned by the widget. If you want to keep a pointer to value this + * around, you must add a refcount using gtk_rc_style_ref(). + **/ +GtkRcStyle * +gtk_widget_get_modifier_style (GtkWidget *widget) +{ + GtkRcStyle *rc_style; + + if (!rc_style_key_id) + rc_style_key_id = g_quark_from_static_string (rc_style_key); + + rc_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), + rc_style_key_id); + + if (!rc_style) { - gtk_rc_style_ref (style); - + rc_style = gtk_rc_style_new(); gtk_object_set_data_by_id_full (GTK_OBJECT (widget), rc_style_key_id, - style, + rc_style, (GtkDestroyNotify)gtk_rc_style_unref); } + return rc_style; +} + +static void +gtk_widget_modify_color_component (GtkWidget *widget, + GtkRcFlags component, + GtkStateType state, + GdkColor *color) +{ + GtkRcStyle *rc_style = gtk_widget_get_modifier_style (widget); + + switch (component) + { + case GTK_RC_FG: + rc_style->fg[state] = *color; + break; + case GTK_RC_BG: + rc_style->bg[state] = *color; + break; + case GTK_RC_TEXT: + rc_style->text[state] = *color; + break; + case GTK_RC_BASE: + rc_style->base[state] = *color; + break; + default: + g_assert_not_reached(); + } + + rc_style->color_flags[state] |= component; + + if (GTK_WIDGET_RC_STYLE (widget)) + gtk_widget_set_rc_style (widget); +} + +/** + * gtk_widget_modify_fg: + * @widget: a #GtkWidget + * @state: the state for which to set the foreground color. + * @color: the color to assign (does not need to be allocated) + * + * Set the foreground color for a widget in a particular state. All + * other style values are left untouched. See also + * gtk_widget_modify_style(). + **/ +void +gtk_widget_modify_fg (GtkWidget *widget, + GtkStateType state, + GdkColor *color) +{ + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE); + g_return_if_fail (color != NULL); + + gtk_widget_modify_color_component (widget, GTK_RC_FG, state, color); +} + +/** + * gtk_widget_modify_bg: + * @widget: a #GtkWidget + * @state: the state for which to set the foreground color. + * @color: the color to assign (does not need to be allocated) + * + * Set the background color for a widget in a particular state. All + * other style values are left untouched. See also + * gtk_widget_modify_style(). + **/ +void +gtk_widget_modify_bg (GtkWidget *widget, + GtkStateType state, + GdkColor *color) +{ + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE); + g_return_if_fail (color != NULL); + + gtk_widget_modify_color_component (widget, GTK_RC_BG, state, color); +} + +/** + * gtk_widget_modify_base: + * @widget: a #GtkWidget + * @state: the state for which to set the foreground color. + * @color: the color to assign (does not need to be allocated) + * + * Set the text color for a widget in a particular state. All other + * style values are left untouched. The text color is the foreground + * color used along with the base color (see gtk_widget_modify_base) + * for widgets such as #GtkEntry and #GtkTextView. See also + * gtk_widget_modify_style(). + **/ +void +gtk_widget_modify_text (GtkWidget *widget, + GtkStateType state, + GdkColor *color) +{ + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE); + g_return_if_fail (color != NULL); + + gtk_widget_modify_color_component (widget, GTK_RC_TEXT, state, color); +} + +/** + * gtk_widget_modify_base: + * @widget: a #GtkWidget + * @state: the state for which to set the foreground color. + * @color: the color to assign (does not need to be allocated) + * + * Set the text color for a widget in a particular state. + * All other style values are left untouched. The base color + * is the background color used along with the text color + * (see gtk_widget_modify_text) for widgets such as #GtkEntry + * and #GtkTextView. See also gtk_widget_modify_style(). + **/ +void +gtk_widget_modify_base (GtkWidget *widget, + GtkStateType state, + GdkColor *color) +{ + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE); + g_return_if_fail (color != NULL); + + gtk_widget_modify_color_component (widget, GTK_RC_BASE, state, color); +} + +/** + * gtk_widget_modify_font: + * @widget: a #GtkWidget + * @font: the font description to use + * + * Set the font to use for a widget. All other style values are left + * untouched. See also gtk_widget_modify_style(). + **/ +void +gtk_widget_modify_font (GtkWidget *widget, + PangoFontDescription *font_desc) +{ + GtkRcStyle *rc_style; + + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (font_desc != NULL); + + rc_style = gtk_widget_get_modifier_style (widget); + + if (rc_style->font_desc) + pango_font_description_free (rc_style->font_desc); + + rc_style->font_desc = pango_font_description_copy (font_desc); + if (GTK_WIDGET_RC_STYLE (widget)) gtk_widget_set_rc_style (widget); } diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 0d754ef022..2b10f071a6 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -572,8 +572,23 @@ void gtk_widget_ensure_style (GtkWidget *widget); GtkStyle* gtk_widget_get_style (GtkWidget *widget); void gtk_widget_restore_default_style (GtkWidget *widget); -void gtk_widget_modify_style (GtkWidget *widget, - GtkRcStyle *style); +void gtk_widget_modify_style (GtkWidget *widget, + GtkRcStyle *style); +GtkRcStyle *gtk_widget_get_modifier_style (GtkWidget *widget); +void gtk_widget_modify_fg (GtkWidget *widget, + GtkStateType state, + GdkColor *color); +void gtk_widget_modify_bg (GtkWidget *widget, + GtkStateType state, + GdkColor *color); +void gtk_widget_modify_text (GtkWidget *widget, + GtkStateType state, + GdkColor *color); +void gtk_widget_modify_base (GtkWidget *widget, + GtkStateType state, + GdkColor *color); +void gtk_widget_modify_font (GtkWidget *widget, + PangoFontDescription *font_desc); PangoContext *gtk_widget_create_pango_context (GtkWidget *widget); PangoContext *gtk_widget_get_pango_context (GtkWidget *widget); diff --git a/gtk/testgtk.c b/gtk/testgtk.c index 924221fbc9..0f01ddf714 100644 --- a/gtk/testgtk.c +++ b/gtk/testgtk.c @@ -8472,6 +8472,125 @@ void create_layout (void) gtk_widget_destroy (window); } +void +create_styles (void) +{ + static GtkWidget *window = NULL; + GtkWidget *label; + GtkWidget *button; + GtkWidget *entry; + GtkWidget *vbox; + static GdkColor red = { 0, 0xffff, 0, 0 }; + static GdkColor green = { 0, 0, 0xffff, 0 }; + static GdkColor blue = { 0, 0, 0, 0xffff }; + static GdkColor yellow = { 0, 0xffff, 0xffff, 0 }; + static GdkColor cyan = { 0, 0 , 0xffff, 0xffff }; + PangoFontDescription *font_desc; + + GtkRcStyle *rc_style; + + if (!window) + { + window = gtk_dialog_new (); + gtk_signal_connect (GTK_OBJECT (window), "destroy", + GTK_SIGNAL_FUNC(gtk_widget_destroyed), + &window); + + + button = gtk_button_new_with_label ("Close"); + gtk_signal_connect_object (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC(gtk_widget_destroy), + GTK_OBJECT (window)); + GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), + button, TRUE, TRUE, 0); + gtk_widget_show (button); + + vbox = gtk_vbox_new (FALSE, 5); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0); + + label = gtk_label_new ("Font:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18"); + + button = gtk_button_new_with_label ("Some Text"); + gtk_widget_modify_font (GTK_BIN (button)->child, font_desc); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + label = gtk_label_new ("Foreground:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + button = gtk_button_new_with_label ("Some Text"); + gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + label = gtk_label_new ("Background:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + button = gtk_button_new_with_label ("Some Text"); + gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + label = gtk_label_new ("Text:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + entry = gtk_entry_new (); + gtk_entry_set_text (GTK_ENTRY (entry), "Some Text"); + gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue); + gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0); + + label = gtk_label_new ("Base:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + entry = gtk_entry_new (); + gtk_entry_set_text (GTK_ENTRY (entry), "Some Text"); + gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow); + gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0); + + label = gtk_label_new ("Multiple:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + button = gtk_button_new_with_label ("Some Text"); + + rc_style = gtk_rc_style_new (); + + rc_style->font_desc = font_desc; + rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG; + rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG; + rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG; + rc_style->fg[GTK_STATE_NORMAL] = yellow; + rc_style->bg[GTK_STATE_NORMAL] = blue; + rc_style->fg[GTK_STATE_PRELIGHT] = blue; + rc_style->bg[GTK_STATE_PRELIGHT] = yellow; + rc_style->fg[GTK_STATE_ACTIVE] = red; + rc_style->bg[GTK_STATE_ACTIVE] = cyan; + rc_style->xthickness = 5; + rc_style->ythickness = 5; + + gtk_widget_modify_style (button, rc_style); + gtk_widget_modify_style (GTK_BIN (button)->child, rc_style); + + g_object_unref (G_OBJECT (rc_style)); + + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + pango_font_description_free (font_desc); + } + + if (!GTK_WIDGET_VISIBLE (window)) + gtk_widget_show_all (window); + else + gtk_widget_destroy (window); +} + /* * Main Window and Exit */ @@ -8529,6 +8648,7 @@ create_main_window (void) { "shapes", create_shapes }, { "spinbutton", create_spins }, { "statusbar", create_statusbar }, + { "styles", create_styles }, { "test idle", create_idle_test }, { "test mainloop", create_mainloop }, { "test scrolling", create_scroll_test }, diff --git a/tests/testgtk.c b/tests/testgtk.c index 924221fbc9..0f01ddf714 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -8472,6 +8472,125 @@ void create_layout (void) gtk_widget_destroy (window); } +void +create_styles (void) +{ + static GtkWidget *window = NULL; + GtkWidget *label; + GtkWidget *button; + GtkWidget *entry; + GtkWidget *vbox; + static GdkColor red = { 0, 0xffff, 0, 0 }; + static GdkColor green = { 0, 0, 0xffff, 0 }; + static GdkColor blue = { 0, 0, 0, 0xffff }; + static GdkColor yellow = { 0, 0xffff, 0xffff, 0 }; + static GdkColor cyan = { 0, 0 , 0xffff, 0xffff }; + PangoFontDescription *font_desc; + + GtkRcStyle *rc_style; + + if (!window) + { + window = gtk_dialog_new (); + gtk_signal_connect (GTK_OBJECT (window), "destroy", + GTK_SIGNAL_FUNC(gtk_widget_destroyed), + &window); + + + button = gtk_button_new_with_label ("Close"); + gtk_signal_connect_object (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC(gtk_widget_destroy), + GTK_OBJECT (window)); + GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), + button, TRUE, TRUE, 0); + gtk_widget_show (button); + + vbox = gtk_vbox_new (FALSE, 5); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0); + + label = gtk_label_new ("Font:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18"); + + button = gtk_button_new_with_label ("Some Text"); + gtk_widget_modify_font (GTK_BIN (button)->child, font_desc); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + label = gtk_label_new ("Foreground:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + button = gtk_button_new_with_label ("Some Text"); + gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + label = gtk_label_new ("Background:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + button = gtk_button_new_with_label ("Some Text"); + gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + label = gtk_label_new ("Text:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + entry = gtk_entry_new (); + gtk_entry_set_text (GTK_ENTRY (entry), "Some Text"); + gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue); + gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0); + + label = gtk_label_new ("Base:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + entry = gtk_entry_new (); + gtk_entry_set_text (GTK_ENTRY (entry), "Some Text"); + gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow); + gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0); + + label = gtk_label_new ("Multiple:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + button = gtk_button_new_with_label ("Some Text"); + + rc_style = gtk_rc_style_new (); + + rc_style->font_desc = font_desc; + rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG; + rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG; + rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG; + rc_style->fg[GTK_STATE_NORMAL] = yellow; + rc_style->bg[GTK_STATE_NORMAL] = blue; + rc_style->fg[GTK_STATE_PRELIGHT] = blue; + rc_style->bg[GTK_STATE_PRELIGHT] = yellow; + rc_style->fg[GTK_STATE_ACTIVE] = red; + rc_style->bg[GTK_STATE_ACTIVE] = cyan; + rc_style->xthickness = 5; + rc_style->ythickness = 5; + + gtk_widget_modify_style (button, rc_style); + gtk_widget_modify_style (GTK_BIN (button)->child, rc_style); + + g_object_unref (G_OBJECT (rc_style)); + + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + pango_font_description_free (font_desc); + } + + if (!GTK_WIDGET_VISIBLE (window)) + gtk_widget_show_all (window); + else + gtk_widget_destroy (window); +} + /* * Main Window and Exit */ @@ -8529,6 +8648,7 @@ create_main_window (void) { "shapes", create_shapes }, { "spinbutton", create_spins }, { "statusbar", create_statusbar }, + { "styles", create_styles }, { "test idle", create_idle_test }, { "test mainloop", create_mainloop }, { "test scrolling", create_scroll_test }, |