SuperCat's Home

今日も頑張ろね~

在GTK+ 3.0应用程序中使用自定义CSS主题

| Comments

在编写带GUI的应用程序时,有时会需要使用自定义主题。而GTK+就提供了强大的主题系统支持。在GTK+ 3.0中,使用CSS作为主题文件的格式。CSS主题文件的编写方法可以参考GNOME3默认自带的主题Adwaita,此处不作详细概述。本文意在描述如何将已经写好的CSS主题文件应用到自己的应用程序中。

GTK+ 3.0中,提供了GtkStyleContext, GtkCssProvider, GtkStyleProvider等数个类来提供主题支持。其中,使用GtkCssProvider来保存CSS主题的内容(其同时也是GtkStyleProvider的子类),而GtkStyleContext保存了当前程序的主题上下文。我们要做的,就是将CSS文件内容交给GtkCssPrivider,然后将其应用到当前的GdkScreen上。实现代码如下:

GTK+ 3自定义主题实现代码
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
27
28
29
30
31
32
33
34
void app_set_theme(const gchar *theme_path)
{
    static GtkCssProvider *provider = NULL;
    GFile *file;
    GdkScreen *screen;
    screen = gdk_screen_get_default();
    if(theme_path!=NULL)
    {
        file = g_file_new_for_path(theme_path);
        g_printf("Loading GTK3 CSS File: %s\n", theme_path);
        if(file!=NULL)
        {
            if(provider==NULL)
                provider = gtk_css_provider_new();
            gtk_css_provider_load_from_file(provider, file, NULL);
            gtk_style_context_add_provider_for_screen(screen,
                GTK_STYLE_PROVIDER(provider),
                GTK_STYLE_PROVIDER_PRIORITY_USER);
            gtk_style_context_reset_widgets(screen);
            g_printf("Loaded GTK3 CSS File Successfully!\n");
        }
    }
    else
    {
        if(provider!=NULL)
        {
            gtk_style_context_remove_provider_for_screen(screen,
                GTK_STYLE_PROVIDER(provider));
            g_object_unref(provider);
            provider = NULL;
        }
        gtk_style_context_reset_widgets(screen);
    }
}

该代码中,传入的参数为主题路径。若传入空指针,则撤销之前的自定义主题。

Comments