[Gtk+2.24] GdkColor widget style property
Bonjour,
Je voudrai ajouter une propriété de style de type GdkColor à mon widget.
Code:
1 2 3 4 5
|
style "my_style" {
MyWidget::my-color = shade(@bg_color, 0.96)
}
widget_class "*<MyWidget>" style "my_style" |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
// ...
static void
my_widget_class_init (MyWidgetClass *klass)
{
GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
//...
gtk_widget_class_install_style_property(widget_class,
g_param_spec_boxed("my-color",
"My color",
"Display my color",
GDK_TYPE_COLOR,
G_PARAM_WRITABLE|G_PARAM_READABLE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB
)
);
}
// ...
static void
my_widget_expose (MyWidget *my)
{
GdkColor color_property;
gtk_widget_style_get (widget,
"my-color", &color_property,
NULL);
g_print("my-color: {red: %x, green: %x, blue: %x}\n", color_property.red, color_property.green, color_property.blue);
} |
Mais j'obtiens cette erreur:
Citation:
Failed to retrieve property `MyWidget::my-color' of type `GdkColor' from rc file value "((GString*) 0x7f8fe00018a0)" of type `GString'
Pouvez-vous m'aider a trouver mon erreur ?
Edit:
Si, dans ma feuille de style, je remplace "shade(@bg_color, 0.96)" par "@bg_color" Alors là ca marche ...
J'ai un peu triché en faite ...
Voici mon vrai fichié (J'utilise dark_bg_color et non pas bg_color)
Code:
1 2 3 4 5 6
| # @file: my-prog.rc
gtk-color-scheme = "dark_bg_color:#3c3b37\ndark_fg_color:#dfdbd2"
style "my_style" {
MyWidget::my-color = shade(0.96, @dark_bg_color)
}
widget_class "*<MyWidget>" style "my_style" |
J'ai fait un petit test en utilisant @bg_color et j'obtiens l'erreur :
Citation:
themes/Ambiance/gtk-2.0/apps/my-prog.rc:12: Invalid symbolic color 'bg_color'
themes/Ambiance/gtk-2.0/apps/my-prog.rc:12: error: invalid identifier 'bg_color', expected valid identifier
Donc on ne peut pas utiliser les couleurs définie dans le fichier gtkrc (Mais en utilisant sont propre parseur on peut la retrouver grace a un style_lookup )
Quoi qu'il en soit. Quand je fais un shade(1.09, @dark_bg_color) la couleur vire au violet (un bug c sûr) Mais peut être pas de gtk
J'utilise cette fonction pour convertir une couleur Gdk en cairo :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| typedef struct _MurrineRGB {
gdouble r;
gdouble g;
gdouble b;
} MurrineRGB;
void
my_style_color_get_rgb(guint32 *color, MurrineRGB *rgb) {
rgb->r = (gdouble) (((*color)&0xFF0000) >> 16)/G_MAXUINT8;
rgb->g = (gdouble) (((*color)&0x00FF00) >> 8)/G_MAXUINT8;
rgb->b = (gdouble) (((*color)&0x0000FF) >> 0)/G_MAXUINT8;
} |
Voyez-vous l'erreur ?
Jetez y un oeil rien que le temps d'une https://www.youtube.com/watch?v=HS7MCeOfOYU ...
Un petit mot pour finir: Conversion INT16 -> INT8
Mon erreur était dans le code que je n'ai pas montré :
Code:
1 2 3 4 5 6 7 8 9
| void
my_style_color_set_from_gdk(MyStyleColor *color, GdkColor *gdk)
{
color->type = MY_STYLE_COLOR_RGB;
color->value = 0x000000;
color->value |= (gdk->red/G_MAXUINT16*G_MAXUINT8) << 16;// gdk->red/G_MAXUINT16 == 0x00
color->value |= (gdk->green/G_MAXUINT16*G_MAXUINT8) << 8;// gdk->green/G_MAXUINT16 == 0x00
color->value |= (gdk->blue/G_MAXUINT16*G_MAXUINT8) << 0;// gdk->blue/G_MAXUINT16 == 0x00
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void
my_style_color_set_from_gdk(MyStyleColor *color, GdkColor *gdk)
{
gdouble maxuint16 = G_MAXUINT16;
guint red = gdk->red/maxuint16*G_MAXUINT8;
guint green = gdk->green/maxuint16*G_MAXUINT8;
guint blue = gdk->blue/maxuint16*G_MAXUINT8;
color->type = MY_STYLE_COLOR_RGB;
color->value = 0x000000;
color->value |= red << 16;
color->value |= green << 8;
color->value |= blue << 0;
} |
et maintenant shade (0.7, "#FF0000") me retourne #98511ae11ae1 soit #971a1a
http://thumbs.dreamstime.com/t/missi...e-19922492.jpg