Re: is it possible to have a widget act as insensitive but look as it is sensitive?



Sorry for posting back but my code failed.... :)

On 28/12/05, Tristan Van Berkom <tristan van berkom gmail com > wrote:

Heh,
     I was just jotting it down from memory; I didn't actually
expect it to compile out of the box ;-)

I don't expect answers out of the box.... :). I do check with the documentation and the source code.... :) So here we go..... Firstly let me paste Tristan's previous reply to this email too:

Tristan said:
you can:
    o Create a sample GtkToggleButton
    o Make copies of the GdkColor structs on widget->style.bg[GTK_STATE_NORMAL]
      (or is it ACTIVE ?), you might also want the .fg, .base & .text members.
      you'd want to do this post gtk_rc_parse().
    o Use gtk_widget_modify_bg (widget, GTK_STATE_INSENSITIVE, sensitive_bg)
      (and friends) to set the sensitive graphic state onto the insensitive state.
    o gtk_widget_set_sensitive (widget, FASLE);


Now, what I tried so far has failed. Here we go:

Modifying directly the values of widget->style:

widget->style->bg[GTK_STATE_INSENSITIVE] = widget->style->bg[GTK_STATE_NORMAL];
widget->style->fg[GTK_STATE_INSENSITIVE] = widget->style->fg[GTK_STATE_NORMAL];
widget->style->base[GTK_STATE_INSENSITIVE] = widget->style->base[GTK_STATE_NORMAL];
widget->style->fg_rc[GTK_STATE_INSENSITIVE] = widget->style->fg_rc[GTK_STATE_NORMAL];

using the gtk_widget_modify_xx functions:
gtk_widget_modify_bg(widget, GTK_STATE_INSENSITIVE, &(widget->style->bg[GTK_STATE_NORMAL]));
gtk_widget_modify_fg(widget, GTK_STATE_INSENSITIVE, &(widget->style->fg[GTK_STATE_NORMAL]));
gtk_widget_modify_base(widget, GTK_STATE_INSENSITIVE, &(widget->style->base[GTK_STATE_NORMAL]));
gtk_widget_modify_text(widget, GTK_STATE_INSENSITIVE, &(widget->style->text[GTK_STATE_NORMAL]));


Copying firstly the GtkStyle, modifying the new one and passing it back to the widget (using gtk_widget_set_style...) even if this method is not recommended in the API:
GtkStyle *style = gtk_style_copy(widget->style);
style->fg[GTK_STATE_INSENSITIVE] = style->fg[GTK_STATE_NORMAL];
style->bg[GTK_STATE_INSENSITIVE] = style->bg[GTK_STATE_NORMAL];
style->base[GTK_STATE_INSENSITIVE] = style->base[GTK_STATE_NORMAL];
gtk_widget_set_style(widget, style);


Copying the GtkRcStyle and then using gtk_widget_modify_style to pass it back... according to the API this is the "recommended" method as subsequent calls to gtk_widget_modify_XX are cummulative leaving the rest of the attributes unchanged.

GtkRcStyle *rcstyle = gtk_widget_get_modifier_style(widget);
rcstyle->bg[GTK_STATE_INSENSITIVE] = rcstyle->bg[GTK_STATE_NORMAL];
rcstyle->fg[GTK_STATE_INSENSITIVE] = rcstyle->fg[GTK_STATE_NORMAL];
rcstyle->base[GTK_STATE_INSENSITIVE] = rcstyle->base[GTK_STATE_NORMAL];
gtk_widget_modify_style(widget, rcstyle);

In all cases I call thereafter
gtk_widget_set_sensitive(widget, FALSE);
to make the widget insensitive.

However, none of the above works.... the colours of the insensitive widget are still the ones of an insensitive widget....

Any clues?

The only thing I can think of is that I am not using the right attributes.... bg, fg, base.... however, I cannot find any documentation explaining each one of the members in the GtkStyle structure.... but the names are self-explanatory so they should be the correct ones.... One more thing I am not fully sure about is the RcStyle.... This is supposed some kind of file that is used to define a theme.... Does this affect the GtkStyle? Ie when I call
GtkRcStyle *rcstyle = gtk_widget_get_modifier_style(widget);
what I am copying is the widget->style data structure or something else??? Because the function return GtkRcStyle* but I cannot find any GtkRcStyle structure in the gtkwidget.h definition.





--
-- Yiannis

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]