Hi all,
My GTK+3 app includes several GtkButton widgets which I am setting to
specific background and foreground (i.e., label) colors. Furthermore, the
colors of each of these buttons are changed over time in response to user
activity. My current code seems to work OK but I have a few questions re:
optimization vs. safety in my use of the GTK style routines.
Here is a condensed version of the relevant code (questions follow below):
GtkWidget *button;
GtkCssProvider *gcp;
GtkStyleContext *gsc;
char fgrgbtext[10], bgrgbtext[10], cssbuf[512];
button= gtk_button_new_with_label((gchar *) "yadayada");
gsc= gtk_widget_get_style_context(button);
/* set arbitrary hex color strings */
(void) strcpy(fgrgbtext, "#000000");
(void) strcpy(bgrgbtext, "#d264ff");
(void) sprintf(cssbuf, "GtkButton {\ncolor: %s;\nbackground-color:
%s;\nbackground-image: -gtk-gradient(linear, center top, center bottom,
from(%s), to(%s));\n}\n", fgrgbtext, bgrgbtext, bgrgbtext, bgrgbtext);
gcp= gtk_css_provider_new();
gtk_css_provider_load_from_data(gcp, cssbuf, -1, 0);
gtk_style_context_add_provider(gsc, GTK_STYLE_PROVIDER(gcp),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
Keeping in mind that I am repeatedly changing the colors of several of
these buttons over and over again under user control, my questions are:
(1) It seemed safest to statically allocate and maintain a distinct
GtkCssProvider object for each of my buttons, otherwise multiple buttons
might somehow wind up referencing the same style setting, i.e., colors. Or
is this unnecessary, i.e., perhaps gtk_style_context_add_provider() copies
the GtkCssProvider's contents into the widget and then the latter never
references the actual GtkCssProvider object again?
(2) The GTK manual says a widget's GtkStyleContext is owned by the widget
and should not be freed. Will the pointer to a particular widget's
GtkStyleContext returned by gtk_widget_get_style_context() be unchanging
over the life of the app or is it possible that it may change over time
for whatever reason (e.g., by GTK internally destroying and recreating the
widget's style context)? Is it safe for me to maintain my own static
pointers to my various buttons' style contexts, or should I always
retrieve the necessary context via gtk_widget_get_style_context() just
prior to altering a particular button's style?
(3) Do I need to call gtk_style_context_add_provider() every time I want
to change the same button's color, or should (must?) I only call that
function once the very first time I set the button's colors, and then just
call gtk_css_provider_load_from_data() with my updated cssbuf style
description string containing the new colors every time I want to
subsequently alter the colors? Will a bad thing happen if I repeatedly
call gtk_style_context_add_provider() with the very same
GtkStyleContext/GtkCssProvider object pair?
(4) Is there an authoritative reference on the syntax of style description
strings created for use with gtk_css_provider_load_from_data()? Is there
somewhere I can find a complete listing of every single property substring
that might impact the appearance of a GtkButton, for example? I had to
puzzle this stuff out from a half-dozen blog posts in various places,
which was quite a pain in the ass. (Although I am infinitely grateful to
the bloggers, of course!) I can never find my own
phone/glasses/keys/whatever, though, so I freely admit the possibility
that I'm missing the obvious somewhere in the existing GTK+3 manual.
Thanks!
Roger Davis
Univ. of Hawaii
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list