On Mon, 2017-05-08 at 12:28 +0100, Emmanuele Bassi wrote:
> On 8 May 2017 at 12:04, Richard Shann <rich...@rshann.plus.com> wrote:
> 
> >> But I'd strongly recommend you use CSS classes instead of styling the
> >> bare element name.
> >>
> >> CSS selectors in GTK+ work exactly like the HTML counterpart; you can
> >> style "div" or "p" directly, but it's often much more appropriate to
> >> create a specific CSS class, like "green-background", and add it to
> >> the widget you wish to style.
> >
> > I didn't find anything describing creating a GtkWidgetClass in the
> > gtk3/stable documentation, it seems that there is a field in the
> > GtkWidget structure pointing to such a structure accessed via
> >
> > GTK_WIDGET_GET_CLASS (widget)
> 
> Yes, this is part of basic GObject usage: each instance has a pointer
> to its instantiating class structure.
> 
> > so I imagine that using
> >
> > gtk_widget_class_set_css_name (class, name)
> >
> > could mean you would get control over the style of that widget and any
> > others whose class you assigned that name.
> 
> You don't have *control* over the style. You can *add* to the existing
> style — which may include undoing what the existing style does, but
> then you need to know what the style does, or essentially reset CSS
> properties by using their initial state, see:
> https://drafts.csswg.org/css-cascade-3/#initial
> 
> This is how CSS works. The only way for you to control the style of a
> GTK+ application

I haven't thought about trying to control the style of my application,
just do things like creating a label with a certain background color.


>  is to ship your own theme, and load it in place of
> the user theme.
> 
> CSS is a *very* powerful set of rules for rendering content using a
> declarative syntax; it's *really* not a bunch of color definitions,
> like the style system in GTK+ 2.x. You will need to learn how CSS
> works in order to use it.
> 
> > But I will have to wait for
> > Debian to catch up with Gtk 3.20 before I can seriously look at this.
> 
> And this is why I suggest you use a CSS class, instead;

Is that something different from the GtkWidgetClass that the widget has?
Are there a gtk_css_class_new() and a gtk_widget_assign_css_class()
functions to use them?
I'm completely at sea. Meanwhile for anyone with an application that has
to compile with versions of Gtk+ before and after version 3.20 here is
the code that is currently working for me to set the background color of
a widget:

8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><
static gchar *get_css_selector (GtkWidget *w)
{
static gchar *ret = NULL;

#if ((GTK_MAJOR_VERSION==3) && (GTK_MINOR_VERSION>=20))
  g_free (ret);
  ret = g_ascii_strdown (g_strdup (g_type_name (G_TYPE_FROM_INSTANCE (w))), -1);
  return ret+3;
#else
   ret = (gchar *)g_type_name (G_TYPE_FROM_INSTANCE (w));
   return ret;
#endif
}

void set_background_color(GtkWidget *w, gchar *color)
{
GtkCssProvider *gcp;
GtkStyleContext *gsc;
gsc = gtk_widget_get_style_context(w);
gchar *type = get_css_selector(w);
gchar *str = g_strdup_printf ("%s {background-color: %s;}", type, color); 
//g_print ("%s", str);
gcp= gtk_css_provider_new();
gtk_css_provider_load_from_data(gcp, str, -1, 0);
g_free (str);
gtk_style_context_add_provider(gsc, GTK_STYLE_PROVIDER(gcp), 
    GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
}
8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><

Thank you for your patience,

Richard Shann



_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to