让gtk+应用程序的主题风格即时生效
来源:互联网 发布:纪梵希散粉 知乎 编辑:程序博客网 时间:2024/06/01 08:00
主题风格似乎已是GUI应用程序必不可少的元素了,不同用户有不同的审美观,为用户提供多种的主题风格,或者让用户自己定制,都是比较好的选择。记得win95刚出来时,很多人总会把它弄出不同的外观,以显示的自己的水平和与众不同。
在gtk+应用程序中,用户可以定制主题风格:设置窗口/控件在不同状态下的颜色,背景图片等等。用户在修改完成后,如何让这些设置即时生效呢?让用户重起所有gtk+应用程序,未免有些不近人情,而且,用户可能只是想看一下预览的效果罢了。最近在做gtk+的嵌入式应用程序时,遇到了这个问题,没有找到相关的资料,只好自己去研究,花了一些时间,有一点心得,这里写出来和大家分享。
定制gtk+应用程序的主题风格很简单,gtk+的文档里写得很清楚,这里不再多说了。本文的焦点是,在不重起gtk+应用程序条件下,如何让设置即时生效?
Gtk+的主题风格数据是放在rc文件(如~/.gtkrc-2.0)里的,看了一下gtk+中rc相关的一些函数,里面有一个函数名为gtk_rc_reparse_all,猜想它的功能重新加载rc文件的,试了一下,没错,但它只是在当前应用程序生效了,其它应用程序没变化。
查找了调用gtk_rc_reparse_all的地方,发现在gtkwindow.c的client_message处理函数里有用到。原来gtk+应用程序在收到client_message后,如果消息的类型是_GTK_READ_RCFILES,就会重新重加载rc文件。于是猜想,如果发一个广播消息给所有的应用程序,那么这些应用程序都会重新加载rc文件了。写一个程序,其中,发送广播消息的代码如下:
static void on_apply_theme( GtkWidget *widget, gpointer data ) { int i; GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT); for (i = 0; i < 5; i++) send_event->client.data.l[i] = 0; send_event->client.data_format = 32; send_event->client.message_type=gdk_atom_intern("_GTK_READ_RCFILES", FALSE);; gdk_screen_broadcast_client_message(gdk_screen_get_default(), send_event); gdk_event_free (send_event); }
试了一下,OK,所有的gtk+应用程序都生效了。这种方法可以工作,但目前尚不知是否存在副作用。若有其它好的办法,望大家不吝赐教。
- 让gtk+应用程序的主题风格即时生效
- 让语言选择即时生效
- Java应用程序的 外观 主题 风格
- Java应用程序的 外观 主题 风格
- 让你的gtk应用程序全屏方法
- gtk-theme-switch 设置GTK应用程序主题
- 让BCB的工程具有XP主题风格
- Linux的NAT即时生效问题
- android 如何让自己开发的Application,能适应主题管理(ThemeManager)中的各种主题风格?
- gtk主题
- Gentoo Linux KDE 下设置GTK应用程序主题
- 校准触摸屏即时生效
- 使环境变量即时生效
- DNS修改即时生效
- XP主题风格的绘制
- XP主题风格的绘制
- 主题和风格的使用
- APP的主题背景风格
- Big-endia与Little-endian
- JAVA相关基础知识
- 不死帐号的制作 【我记得原作者好像是mix吧】
- 常用商务英语语句
- 在一个软件开发项目中进行实际日程安排的十二点提示(转)
- 让gtk+应用程序的主题风格即时生效
- 与关键字的高亮显示相关
- 英语谚语精选(English Proverb Collection)
- 汉字输入教学系统中词组切分方法的设计
- 有趣的String类
- 练习使用HashMap
- Linux中的Ramdisk与Initrd
- 根据性格选择运动
- 练习使用工具类Collections