自己动手写panel

各种窗口管理器和美化相关
回复
头像
stesen
帖子: 397
注册时间: 2008-11-16 11:11

自己动手写panel

#1

帖子 stesen » 2011-03-11 22:38

用dwm的时候, 最喜欢它的状态栏.
用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, 所以懒得加上了
stp.png
(10.12 KiB) 已下载 6 次
代码在此处下载:

代码: 全选

git clone git://github.com/stesen/stp.git
其中的sysres-xfce.pl是打印信息用的, 可以自己修改扩充, 调用的程序名在config.h中改

慢慢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, 欢迎测试.
等俺有钱了,俺把M$买来好好搓搓
usbtopc
帖子: 96
注册时间: 2009-06-30 23:05

Re: 自己动手写panel

#2

帖子 usbtopc » 2011-03-11 23:44

不错的创意,加油! :em11
裸跑X可能是最后的选择......
目前使用dwm-plus: http://code.google.com/p/dwm-plus/
usbtopc
帖子: 96
注册时间: 2009-06-30 23:05

Re: 自己动手写panel

#3

帖子 usbtopc » 2011-03-12 10:06

我编译运行之后,出现sh: sysres-xfce.pl: 未找到命令。

我是直接./stp运行它的,目录里面也有sysres-xfce-pl这个文件。

谢谢!
裸跑X可能是最后的选择......
目前使用dwm-plus: http://code.google.com/p/dwm-plus/
头像
leeaman
帖子: 30702
注册时间: 2007-02-02 18:14
系统: debian sid

Re: 自己动手写panel

#4

帖子 leeaman » 2011-03-12 11:14

支持一下 :em11 systray还是应该有...不过估计很麻烦
醉了星星,醉月亮●●●●●The Long Way To Go(*^_^*)
头像
stesen
帖子: 397
注册时间: 2008-11-16 11:11

Re: 自己动手写panel

#5

帖子 stesen » 2011-03-12 12:40

usbtopc 写了:我编译运行之后,出现sh: sysres-xfce.pl: 未找到命令。

我是直接./stp运行它的,目录里面也有sysres-xfce-pl这个文件。

谢谢!
我的sysres-xfce.pl加在$PATH中的
等俺有钱了,俺把M$买来好好搓搓
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: 自己动手写panel

#6

帖子 月下叹逍遥 » 2011-03-12 12:42

:em11
浮生七十今三十,从此凄惶未可知
usbtopc
帖子: 96
注册时间: 2009-06-30 23:05

Re: 自己动手写panel

#7

帖子 usbtopc » 2011-03-12 13:54

stesen 写了:
usbtopc 写了:我编译运行之后,出现sh: sysres-xfce.pl: 未找到命令。

我是直接./stp运行它的,目录里面也有sysres-xfce-pl这个文件。

谢谢!
我的sysres-xfce.pl加在$PATH中的
原来这样,已经正常运行。
裸跑X可能是最后的选择......
目前使用dwm-plus: http://code.google.com/p/dwm-plus/
头像
stesen
帖子: 397
注册时间: 2008-11-16 11:11

Re: 自己动手写panel

#8

帖子 stesen » 2011-03-14 14:45

再附一个c语言的status信息, 自己用的话可以直接写在panel的代码里了, 在代码根目录下的sysres/中

代码: 全选

git clone git://github.com/stesen/stp.git
等俺有钱了,俺把M$买来好好搓搓
头像
wlzyan
帖子: 504
注册时间: 2008-08-16 15:09
来自: 没有海一样的胸怀,哪能有海一样的事业.

Re: 自己动手写panel

#9

帖子 wlzyan » 2011-03-14 15:27

:em11 ,纯路过帮顶.
usbtopc
帖子: 96
注册时间: 2009-06-30 23:05

Re: 自己动手写panel

#11

帖子 usbtopc » 2011-03-14 22:07

stesen 写了:再附一个c语言的status信息, 自己用的话可以直接写在panel的代码里了, 在代码根目录下的sysres/中

代码: 全选

git clone git://github.com/stesen/stp.git
学习一下,感谢分享!
裸跑X可能是最后的选择......
目前使用dwm-plus: http://code.google.com/p/dwm-plus/
回复