type Gtk_Style_Context_Record is new GObject_Record with null record;
type Gtk_Style_Context is access all Gtk_Style_Context_Record'Class;
type Cb_Gtk_Style_Context_Void is not null access procedure (Self : access Gtk_Style_Context_Record'Class);
type Cb_GObject_Void is not null access procedure (Self : access Glib.Object.GObject_Record'Class);
Direction_Property : constant Gtk.Enums.Property_Gtk_Text_Direction;
Paint_Clock_Property : constant Glib.Properties.Property_Boxed;
Parent_Property : constant Glib.Properties.Property_Object;
Screen_Property : constant Glib.Properties.Property_Object;
Signal_Changed : constant Glib.Signal_Name := "changed";
procedure Gtk_New
( | Self | : out Gtk_Style_Context); |
procedure Initialize
( | Self | : not null access Gtk_Style_Context_Record'Class); |
function Gtk_Style_Context_New return Gtk_Style_Context;
function Get_Type return Glib.GType;
procedure Add_Class
( | Self | : not null access Gtk_Style_Context_Record; |
Class_Name | : UTF8_String); |
procedure Add_Provider
( | Self | : not null access Gtk_Style_Context_Record; |
Provider | : Gtk.Style_Provider.Gtk_Style_Provider; | |
Priority | : Guint); |
procedure Add_Region
( | Self | : not null access Gtk_Style_Context_Record; |
Region_Name | : UTF8_String; | |
Flags | : Gtk.Enums.Gtk_Region_Flags); |
procedure Cancel_Animations
( | Self | : not null access Gtk_Style_Context_Record; |
Region_Id | : System.Address); |
procedure Get_Background_Color
( | Self | : not null access Gtk_Style_Context_Record; |
State | : Gtk.Enums.Gtk_State_Flags; | |
Color | : out Gdk.RGBA.Gdk_RGBA); |
procedure Get_Border
( | Self | : not null access Gtk_Style_Context_Record; |
State | : Gtk.Enums.Gtk_State_Flags; | |
Border | : out Gtk.Style.Gtk_Border); |
procedure Get_Border_Color
( | Self | : not null access Gtk_Style_Context_Record; |
State | : Gtk.Enums.Gtk_State_Flags; | |
Color | : out Gdk.RGBA.Gdk_RGBA); |
procedure Get_Color
( | Self | : not null access Gtk_Style_Context_Record; |
State | : Gtk.Enums.Gtk_State_Flags; | |
Color | : out Gdk.RGBA.Gdk_RGBA); |
function Get_Direction
( | Self | : not null access Gtk_Style_Context_Record) return Gtk.Enums.Gtk_Text_Direction; |
procedure Set_Direction
( | Self | : not null access Gtk_Style_Context_Record; |
Direction | : Gtk.Enums.Gtk_Text_Direction); |
function Get_Font
( | Self | : not null access Gtk_Style_Context_Record; |
State | : Gtk.Enums.Gtk_State_Flags) return Pango.Font.Pango_Font_Description; |
function Get_Frame_Clock
( | Self | : not null access Gtk_Style_Context_Record) return Gdk.Frame_Clock.Gdk_Frame_Clock; |
procedure Set_Frame_Clock
( | Self | : not null access Gtk_Style_Context_Record; |
Frame_Clock | : not null access Gdk.Frame_Clock.Gdk_Frame_Clock_Record'Class); |
function Get_Junction_Sides
( | Self | : not null access Gtk_Style_Context_Record) return Gtk.Enums.Gtk_Junction_Sides; |
procedure Set_Junction_Sides
( | Self | : not null access Gtk_Style_Context_Record; |
Sides | : Gtk.Enums.Gtk_Junction_Sides); |
procedure Get_Margin
( | Self | : not null access Gtk_Style_Context_Record; |
State | : Gtk.Enums.Gtk_State_Flags; | |
Margin | : out Gtk.Style.Gtk_Border); |
procedure Get_Padding
( | Self | : not null access Gtk_Style_Context_Record; |
State | : Gtk.Enums.Gtk_State_Flags; | |
Padding | : out Gtk.Style.Gtk_Border); |
function Get_Parent
( | Self | : not null access Gtk_Style_Context_Record) return Gtk_Style_Context; |
procedure Set_Parent
( | Self | : not null access Gtk_Style_Context_Record; |
Parent | : access Gtk_Style_Context_Record'Class); |
function Get_Path
( | Self | : not null access Gtk_Style_Context_Record) return Gtk.Widget.Gtk_Widget_Path; |
procedure Set_Path
( | Self | : not null access Gtk_Style_Context_Record; |
Path | : Gtk.Widget.Gtk_Widget_Path); |
procedure Get_Property
( | Self | : not null access Gtk_Style_Context_Record; |
Property | : UTF8_String; | |
State | : Gtk.Enums.Gtk_State_Flags; | |
Value | : out Glib.Values.GValue); |
function Get_Screen
( | Self | : not null access Gtk_Style_Context_Record) return Gdk.Screen.Gdk_Screen; |
procedure Set_Screen
( | Self | : not null access Gtk_Style_Context_Record; |
Screen | : not null access Gdk.Screen.Gdk_Screen_Record'Class); |
function Get_Section
( | Self | : not null access Gtk_Style_Context_Record; |
Property | : UTF8_String) return Gtk.Css_Section.Gtk_Css_Section; |
function Get_State
( | Self | : not null access Gtk_Style_Context_Record) return Gtk.Enums.Gtk_State_Flags; |
procedure Set_State
( | Self | : not null access Gtk_Style_Context_Record; |
Flags | : Gtk.Enums.Gtk_State_Flags); |
procedure Get_Style_Property
( | Self | : not null access Gtk_Style_Context_Record; |
Property_Name | : UTF8_String; | |
Value | : in out Glib.Values.GValue); |
function Has_Class
( | Self | : not null access Gtk_Style_Context_Record; |
Class_Name | : UTF8_String) return Boolean; |
procedure Has_Region
( | Self | : not null access Gtk_Style_Context_Record; |
Region_Name | : UTF8_String; | |
Flags_Return | : out Gtk.Enums.Gtk_Region_Flags; | |
Is_Defined | : out Boolean); |
procedure Invalidate
( | Self | : not null access Gtk_Style_Context_Record); |
function List_Classes
( | Self | : not null access Gtk_Style_Context_Record) return Gtk.Enums.String_List.Glist; |
function List_Regions
( | Self | : not null access Gtk_Style_Context_Record) return Gtk.Enums.String_List.Glist; |
procedure Lookup_Color
( | Self | : not null access Gtk_Style_Context_Record; |
Color_Name | : UTF8_String; | |
Color | : out Gdk.RGBA.Gdk_RGBA; | |
Found | : out Boolean); |
procedure Notify_State_Change
( | Self | : not null access Gtk_Style_Context_Record; |
Window | : Gdk.Gdk_Window; | |
Region_Id | : System.Address; | |
State | : Gtk.Enums.Gtk_State_Type; | |
State_Value | : Boolean); |
procedure Pop_Animatable_Region
( | Self | : not null access Gtk_Style_Context_Record); |
procedure Push_Animatable_Region
( | Self | : not null access Gtk_Style_Context_Record; |
Region_Id | : System.Address); |
procedure Remove_Class
( | Self | : not null access Gtk_Style_Context_Record; |
Class_Name | : UTF8_String); |
procedure Remove_Provider
( | Self | : not null access Gtk_Style_Context_Record; |
Provider | : Gtk.Style_Provider.Gtk_Style_Provider); |
procedure Remove_Region
( | Self | : not null access Gtk_Style_Context_Record; |
Region_Name | : UTF8_String); |
procedure Restore
( | Self | : not null access Gtk_Style_Context_Record); |
procedure Save
( | Self | : not null access Gtk_Style_Context_Record); |
procedure Scroll_Animations
( | Self | : not null access Gtk_Style_Context_Record; |
Window | : Gdk.Gdk_Window; | |
Dx | : Gint; | |
Dy | : Gint); |
procedure Set_Background
( | Self | : not null access Gtk_Style_Context_Record; |
Window | : Gdk.Gdk_Window); |
procedure State_Is_Running
( | Self | : not null access Gtk_Style_Context_Record; |
State | : Gtk.Enums.Gtk_State_Type; | |
Progress | : out Gdouble; | |
Is_Running | : out Boolean); |
function Get_Style_Context
( | Widget | : not null access Gtk_Widget_Record'Class) return Gtk_Style_Context; |
procedure Add_Provider_For_Screen
( | Screen | : not null access Gdk.Screen.Gdk_Screen_Record'Class; |
Provider | : Gtk.Style_Provider.Gtk_Style_Provider; | |
Priority | : Guint); |
procedure Remove_Provider_For_Screen
( | Screen | : not null access Gdk.Screen.Gdk_Screen_Record'Class; |
Provider | : Gtk.Style_Provider.Gtk_Style_Provider); |
procedure Reset_Widgets
( | Screen | : not null access Gdk.Screen.Gdk_Screen_Record'Class); |
procedure Render_Handle
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble); |
procedure Render_Check
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble); |
procedure Render_Option
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble); |
procedure Render_Arrow
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
Angle | : Gdouble; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Size | : Gdouble); |
procedure Render_Background
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble); |
procedure Render_Frame
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble); |
procedure Render_Expander
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble); |
procedure Render_Focus
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble); |
procedure Render_Layout
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Layout | : not null access Pango.Layout.Pango_Layout_Record'Class); |
procedure Render_Line
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X0 | : Gdouble; | |
Y0 | : Gdouble; | |
X1 | : Gdouble; | |
Y1 | : Gdouble); |
procedure Render_Slider
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble; | |
Orientation | : Gtk.Enums.Gtk_Orientation); |
procedure Render_Frame_Gap
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble; | |
Gap_Side | : Gtk.Enums.Gtk_Position_Type; | |
Xy0_Gap | : Gdouble; | |
Xy1_Gap | : Gdouble); |
procedure Render_Extension
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble; | |
Gap_Side | : Gtk.Enums.Gtk_Position_Type); |
procedure Render_Activity
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
X | : Gdouble; | |
Y | : Gdouble; | |
Width | : Gdouble; | |
Height | : Gdouble); |
procedure Render_Icon
( | Context | : not null access Gtk_Style_Context_Record'Class; |
Cr | : Cairo.Cairo_Context; | |
Pixbuf | : not null access Gdk.Pixbuf.Gdk_Pixbuf_Record'Class; | |
X | : Gdouble; | |
Y | : Gdouble); |
procedure On_Changed
( | Self | : not null access Gtk_Style_Context_Record; |
Call | : Cb_Gtk_Style_Context_Void; | |
After | : Boolean := False); |
procedure On_Changed
( | Self | : not null access Gtk_Style_Context_Record; |
Call | : Cb_GObject_Void; | |
Slot | : not null access Glib.Object.GObject_Record'Class; | |
After | : Boolean := False); |
Gtk.Style_Context.Gtk_Style_Context is an object that stores styling information affecting a widget defined by Gtk.Widget.Gtk_Widget_Path.
In order to construct the final style information, Gtk.Style_Context.Gtk_Style_Context queries information from all attached Gtk_Style_Providers. Style providers can be either attached explicitly to the context through Gtk.Style_Context.Add_Provider, or to the screen through Gtk.Style_Context.Add_Provider_For_Screen. The resulting style is a combination of all providers' information in priority order.
For GTK+ widgets, any Gtk.Style_Context.Gtk_Style_Context returned by gtk_widget_get_style_context will already have a Gtk.Widget.Gtk_Widget_Path, a Gdk.Screen.Gdk_Screen and RTL/LTR information set. The style context will be also updated automatically if any of these settings change on the widget.
If you are using the theming layer standalone, you will need to set a widget path and a screen yourself to the created style context through Gtk.Style_Context.Set_Path and Gtk.Style_Context.Set_Screen, as well as updating the context yourself using Gtk.Style_Context.Invalidate whenever any of the conditions change, such as a change in the Gtk.Settings.Gtk_Settings:gtk-theme-name setting or a hierarchy change in the rendered widget. == Transition animations == Gtk.Style_Context.Gtk_Style_Context has built-in support for state change transitions. Note that these animations respect the Gtk.Settings.Gtk_Settings:gtk-enable-animations setting.
For simple widgets where state changes affect the whole widget area, calling Gtk.Style_Context.Notify_State_Change with a null region is sufficient to trigger the transition animation. And GTK+ already does that when Gtk.Widget.Set_State or Gtk.Widget.Set_State_Flags are called.
If a widget needs to declare several animatable regions (i.e. not affecting the whole widget area), its Gtk.Widget.Gtk_Widget::draw signal handler needs to wrap the render operations for the different regions with calls to Gtk.Style_Context.Push_Animatable_Region and Gtk.Style_Context.Pop_Animatable_Region. These functions take an identifier for the region which must be unique within the style context. For simple widgets with a fixed set of animatable regions, using an enumeration works well: == Using an enumeration to identify animatable regions == enum { REGION_ENTRY, REGION_BUTTON_UP, REGION_BUTTON_DOWN }; ... gboolean spin_button_draw (GtkWidget *widget, cairo_t *cr) { GtkStyleContext *context; context = gtk_widget_get_style_context (widget); gtk_style_context_push_animatable_region (context, GUINT_TO_POINTER (REGION_ENTRY)); gtk_render_background (cr, 0, 0, 100, 30); gtk_render_frame (cr, 0, 0, 100, 30); gtk_style_context_pop_animatable_region (context); ... } For complex widgets with an arbitrary number of animatable regions, it is up to the implementation to come up with a way to uniquely identify each animatable region. Using pointers to internal structs is one way to achieve this: == Using struct pointers to identify animatable regions == void notebook_draw_tab (GtkWidget *widget, NotebookPage *page, cairo_t *cr) { gtk_style_context_push_animatable_region (context, page); gtk_render_extension (cr, page->x, page->y, page->width, page->height); gtk_style_context_pop_animatable_region (context); } The widget also needs to notify the style context about a state change for a given animatable region so the animation is triggered. == Triggering a state change animation on a region == gboolean notebook_motion_notify (GtkWidget *widget, GdkEventMotion *event) { GtkStyleContext *context; NotebookPage *page; context = gtk_widget_get_style_context (widget); page = find_page_under_pointer (widget, event); gtk_style_context_notify_state_change (context, gtk_widget_get_window (widget), page, GTK_STATE_PRELIGHT, TRUE); ... } Gtk.Style_Context.Notify_State_Change accepts null region IDs as a special value, in this case, the whole widget area will be updated by the animation. == Style classes and regions == Widgets can add style classes to their context, which can be used to associate different styles by class (see <xref linkend="gtkcssprovider-selectors"/>). Theme engines can also use style classes to vary their rendering. GTK+ has a number of predefined style classes: GTK_STYLE_CLASS_CELL, GTK_STYLE_CLASS_ENTRY, GTK_STYLE_CLASS_BUTTON, GTK_STYLE_CLASS_COMBOBOX_ENTRY, GTK_STYLE_CLASS_CALENDAR, GTK_STYLE_CLASS_SLIDER, GTK_STYLE_CLASS_BACKGROUND, GTK_STYLE_CLASS_RUBBERBAND, GTK_STYLE_CLASS_TOOLTIP, GTK_STYLE_CLASS_MENU, GTK_STYLE_CLASS_MENUBAR, GTK_STYLE_CLASS_MENUITEM, GTK_STYLE_CLASS_TOOLBAR, GTK_STYLE_CLASS_PRIMARY_TOOLBAR, GTK_STYLE_CLASS_INLINE_TOOLBAR, GTK_STYLE_CLASS_RADIO, GTK_STYLE_CLASS_CHECK, GTK_STYLE_CLASS_TROUGH, GTK_STYLE_CLASS_SCROLLBAR, GTK_STYLE_CLASS_SCALE, GTK_STYLE_CLASS_SCALE_HAS_MARKS_ABOVE, GTK_STYLE_CLASS_SCALE_HAS_MARKS_BELOW, GTK_STYLE_CLASS_HEADER, GTK_STYLE_CLASS_ACCELERATOR, GTK_STYLE_CLASS_GRIP, GTK_STYLE_CLASS_DOCK, GTK_STYLE_CLASS_PROGRESSBAR, GTK_STYLE_CLASS_SPINNER, GTK_STYLE_CLASS_EXPANDER, GTK_STYLE_CLASS_SPINBUTTON, GTK_STYLE_CLASS_NOTEBOOK, GTK_STYLE_CLASS_VIEW, GTK_STYLE_CLASS_SIDEBAR, GTK_STYLE_CLASS_IMAGE, GTK_STYLE_CLASS_HIGHLIGHT, GTK_STYLE_CLASS_FRAME, GTK_STYLE_CLASS_DND, GTK_STYLE_CLASS_PANE_SEPARATOR, GTK_STYLE_CLASS_SEPARATOR, GTK_STYLE_CLASS_INFO, GTK_STYLE_CLASS_WARNING, GTK_STYLE_CLASS_QUESTION, GTK_STYLE_CLASS_ERROR, GTK_STYLE_CLASS_HORIZONTAL, GTK_STYLE_CLASS_VERTICAL, GTK_STYLE_CLASS_TOP, GTK_STYLE_CLASS_BOTTOM, GTK_STYLE_CLASS_LEFT, GTK_STYLE_CLASS_RIGHT, Widgets can also add regions with flags to their context. The regions used by GTK+ widgets are: <thead> Region Flags Macro Used by </thead> row even, odd GTK_STYLE_REGION_ROW Gtk.Tree_View.Gtk_Tree_View column first, last, sorted GTK_STYLE_REGION_COLUMN Gtk.Tree_View.Gtk_Tree_View column-header GTK_STYLE_REGION_COLUMN_HEADER tab even, odd, first, last GTK_STYLE_REGION_TAB Gtk.Notebook.Gtk_Notebook == Custom styling in UI libraries and applications == If you are developing a library with custom Gtk.Widget.Gtk_Widget<!-- -->s that render differently than standard components, you may need to add a Gtk.Style_Provider.Gtk_Style_Provider yourself with the GTK_STYLE_PROVIDER_PRIORITY_FALLBACK priority, either a Gtk.Css_Provider.Gtk_Css_Provider or a custom object implementing the Gtk.Style_Provider.Gtk_Style_Provider interface. This way theming engines may still attempt to style your UI elements in a different way if needed so.
If you are using custom styling on an applications, you probably want then to make your style information prevail to the theme's, so you must use a Gtk.Style_Provider.Gtk_Style_Provider with the GTK_STYLE_PROVIDER_PRIORITY_APPLICATION priority, keep in mind that the user settings in '<replaceable>XDG_CONFIG_HOME</replaceable>/gtk-3.0/gtk.css' will still take precedence over your changes, as it uses the GTK_STYLE_PROVIDER_PRIORITY_USER priority.
If a custom theming engine is needed, you probably want to implement a Gtk.Style_Provider.Gtk_Style_Provider yourself so it points to your Gtk.Theming_Engine.Gtk_Theming_Engine implementation, as Gtk.Css_Provider.Gtk_Css_Provider uses Gtk.Theming_Engine.Load which loads the theming engine module from the standard paths.