用musca的时候, 最喜欢它的手动分割.
后来找到了fspanel, 于是有了自己动手写个panel的想法, 看了fspanel和dwm的代码又google了无数资料, 终于搞明白了xlib和xft的那一堆东西, 第一次用xlib, 感觉有些蛋疼, 真不愧是号称比kernel还复杂的玩意. 不过好歹憋出来了, 发贴纪念下.
声明: 我从小美术课就不及格, 所以界面比较丑陋, 基本自己看着顺眼了.
主要有这些功能:
xft支持, 字体好了很多
中文支持, fspanel用XA_STRING通信, 不支持中文title, 这个问题折腾了我好几天
和dwm的状态栏基本一样的布局, 只不过会显示当前桌面的所有task, mix of fspanel & dwm
缺点:
无system tray, system tray还不清楚如何实现, 而且我个人不需要tray, 所以懒得加上了 代码在此处下载:
代码: 全选
git clone git://github.com/stesen/stp.git
慢慢hack去吧, 自己写的panel还是比较实用的, 至少不需要的功能可以去掉了
函数有这些:
get_prop_data() 获取x信息, 数据
set_foreground() 选择颜色
fill_rect() 填充矩形
generic_get_int() 获取x信息, id之类的整数
find_desktop() 查找windows所在的桌面
is_iconified() 是否最小化
get_current_desktop() 返回当前桌面号码
get_number_of_desktops() 返回桌面总数
add_task() 新建task
gui_sync() Xsync
set_prop() 设置x特性
gui_create_taskbar() 新建taskbar
statusloop() 执行外部程序/脚本, 获取其返回值, 显示在panel的右边
sigchld() dwm用它消除僵尸进程, 感觉可有可无, 不过就一开始执行一次, 也不影响效率
gui_init() gui相关的初始化, 包括xft初始化
draw_bigbox() 画大矩形, 高度撑满整个panel
draw_tinybox() 画小矩形, 用在pager上, 和dwm上的那个一样
default_status() 默认的状态信息
draw_status() 画状态信息
gui_draw_task() 画task栏
toggle_shade() 隐藏窗口
switch_desk() 跳到点中的pager
pager_draw_button() 画pager上的button
draw_pager() 画pager
gui_draw_taskbar() 画整个bar
find_task() 在当前的task表中找到该task
del_task() 在task表中删除task
taskbar_read_clientlist() 遍历链表, 刷新task list
handle_press() 鼠标点击事件处理
handle_focusin() 窗口focus处理
handle_propertynotify() property notify事件处理
handle_error() 错误处理
main() 程序入口
很少写gui程序, 一开始居然还有个memory leak, 检查了下, 是个低级错误. 由于对api不是很熟, 不清楚是不是还有其他的bug, 欢迎测试.