There are some features in GtkStyleContext that were not available in GtkStyle, or were made available over time for certain widgets through extending the detail string in obscure ways. There is a lot more information available when rendering UI elements, and it is accessible in more uniform, less hacky ways. By going through this list you'll ensure your widget is a good citizen in a fully themable user interface.
gtk_style_context_add_region()
. These regions can be
referenced in CSS and the :nth-child pseudo-class may be used to match
the elements depending on the flags passed.
Example 50. Theming widget regions
1 2 3 4 5 6 7 |
GtkNotebook tab { background-color: #f3329d; } GtkTreeView row::nth-child (even) { background-color: #dddddd; } |
If your container renders child widgets within different regions, make it implement GtkContainer get_path_for_child(). This function lets containers assign a special GtkWidgetPath to child widgets depending on their role/region. This is necessary to extend the concept above throughout the widget hierarchy.
For example, a GtkNotebook modifies the tab labels' GtkWidgetPath so the "tab" region is added. This makes it possible to theme tab labels through:
Example 51. Theming a widget within a parent container region
1 2 3 |
GtkNotebook tab GtkLabel { font: Sans 8; } |
gtk_style_context_set_junction_sides()
. It is of course up to the
theme to make use of this information or not.
GtkStyleContext supports implicit animations on state changes for
the most simple case out-of-the-box: widgets with a single animatable
area, whose state is changed with gtk_widget_set_state_flags()
or
gtk_widget_unset_state_flags()
. These functions trigger animated
transitions for the affected state flags. Examples of widgets for
which this kind of animation may be sufficient are GtkButton or
GtkEntry.
If your widget consists of more than a simple area, and these areas
may be rendered with different states, make sure to mark the rendered
areas with gtk_style_context_push_animatable_region()
and
gtk_style_context_pop_animatable_region()
.
gtk_style_context_notify_state_change()
may be used to trigger a
transition for a given state. The region ID will determine the
animatable region that is affected by this transition.