SuperCat's Home

今日も頑張ろね~

在GTK+ 2.0应用程序中使用自定义RC主题

| Comments

在编写带GUI的应用程序时,有时会需要使用自定义主题。而GTK+就提供了强大的主题系统支持。在GTK+ 2.0中,使用RC文件作为主题文件。RC文件的写法可参考GNOME 2或更新版本中的附带主题,或者是从gnome-look.org上下载主题做为参考,此处不做概述。本文意在描述如何将已经写好的RC主题文件应用到自己的应用程序中。

GTK+ 2.0中,使用gtk_rc_*的一系列函数来管理主题。其中,直接使用gtk_rc_parse()即可直接使用所设定的主题文件,但是使用该函数会有一个问题,便是无法还原主题设定,一旦设定了新的主题,便无法撤销它。因此,我们要使用gtk_rc_add_default_file()函数来应用主题设定。而该函数在添加主题后,并不会立刻应用到当前主题设定中,所以,我们需要通知GTK+来刷新当前已存在的控件的主题设定,使用gtk_rc_reparse_all_for_settings()和gtk_rc_reparse_all()这2个函数即可实现。而清除主题设定,可用gtk_rc_set_default_files()来实现,通过在程序初始化时使用gtk_settings_get_default()函数,获取默认主题文件列表,当需要还原主题设定时,即可用默认主题列表,配合gtk_rc_set_default_files()函数来实现。程序实现代码如下:

GTK+ 2.0自定义主题实现代码
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
35
36
37
38
39
40
void app_set_theme(const gchar *theme_path)
{
        GtkSettings *settings;
        static gchar **default_list = NULL;
        gchar **tmp_list;
        guint i = 0, len = 0;
        settings = gtk_settings_get_default();
        if(default_list==NULL)
        {
            tmp_list = gtk_rc_get_default_files();
            len = g_strv_length(tmp_list);
            default_list = g_new0(gchar *, len+1);
            for(i=0;i<len;i++)
            {
                default_list[i] = g_strdup(tmp_list[i]);
            }
        }
        if(theme_path!=NULL)
        {
            g_printf("Loading GTK2 RC File: %s\n", theme_path);
            gtk_rc_set_default_files(default_list);
            gtk_rc_add_default_file(theme_path);
            if(settings!=NULL)
            {
                gtk_rc_reparse_all_for_settings(settings, TRUE);
            }
            gtk_rc_reparse_all();
            g_printf("Loaded GTK2 RC Theme successfully!\n");
        }
        else
        {
            gtk_rc_set_default_files(default_list);
            if(settings!=NULL)
            {
                gtk_rc_reset_styles(settings);
                gtk_rc_reparse_all_for_settings(settings, TRUE);
            }
            gtk_rc_reparse_all();
        }
}

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

Comments