|
我常尝试了wmctrl和devilspie两种方式,感觉各有优缺
1、devilspie是一个后台进程,通过.devilspie/下的配置文件运行,比wmctrl多个decoratea功能,强调实时性,感觉配置文件过于简单,但不灵活,最主要的是实现同软件多窗口管理难,所以我先用wmctrl。
这是个简单的配置,随便起个名放到~/.devilspie/即可(还没发现能注释):
(if (is (application_name) " idgin")
(begin
(if (is (window_role) "conversation")
(begin
(undecorate)
(skip_tasklist)
(below)
(geometry "960x400+1920+800")
)
)
)
if (is (window_class) "Terminal")
(begin
(undecorate)
(skip_tasklist)
(below)
(geometry "960x600+2880+600")
)
if (is (window_class) "Thunar")
(begin
(undecorate)
(skip_tasklist)
(below)
(geometry "960x600+2880+0")
)
if (is (window_class) "SeaMonkey")
(begin
(undecorate)
(skip_tasklist)
(below)
(geometry "960x800+1920+0")
)
)
2、wmctrl是个命令行工具,配合bash灵活程度很高,下面是我的命令文件:
#!/bin/bash
t=(`xdpyinfo |grep dimensions |cut -d ' ' -f 7 | sed 's/x/ /g'`)
desktop=(0 0 ${t[0]} ${t[1]})
#平铺桌面定义:显示X起点 显示y起点 显示宽 显示高
win=("SeaMonkey" " idgin" "Terminal" "Thunar" "Gedit" "libreoffice-startcenter" "Gnumeric")
#查询窗口名列表
x=(0.5 0.5 0.75 0.75 0.25 0 0.25)
#窗口x位于平铺桌面宽的比率
y=(0 0.65 0.5 0 0 0 0.5)
#窗口y位于平铺桌面高的比率
w=(0.25 0.25 0.25 0.25 0.25 0.25 0.25)
#窗口宽占平铺桌面宽的比率
h=(0.65 0.35 0.5 0.5 0.5 1 0.5)
#窗口高占平铺桌面高的比率
if [ -n "$1" ];then
wmid=`printf "0x%08x" $1`
if [ -z "`wmctrl -l | grep $wmid`" ];then
wid=`xprop | grep _NET_WM_USER_TIME_WINDOW | cut -d '#' -f 2`
wmid=`printf "0x%08x" $[wid-1]`
fi
echo $wmid
wmctrl -i -r $wmid -b remove,below,skip_taskbar
if [ -n "$2" ];then
wx=`echo $2 |cut -d ',' -f 1`
wy=`echo $2 |cut -d ',' -f 2`
ww=`echo $2 |cut -d ',' -f 3`
wh=`echo $2 |cut -d ',' -f 4`
if [ $[wx-0] -eq 0 ];then
wx=0
fi
if [ $[wy-0] -eq 0 ];then
wy=0
fi
if [ $[ww-0] -eq 0 ];then
ww=-1
fi
if [ $[wh-0] -eq 0 ];then
wh=-1
fi
wmctrl -i -r $wmid -e 1,$wx,$wy,$ww,$wh
fi
exit
fi
t=`xprop | sed 's/ /~/g'`
#根据鼠标取窗口
wid=`echo $t | sed 's/ /\n/g' | grep _NET_WM_USER_TIME_WINDOW | sed 's/~/ /g' | cut -d '#' -f 2`
#取窗口id (左框像素 右框像素 上框像素 下边像素)
wmid=`printf "0x%08x" $[wid-1]`
#转换为wmctrl需要的id
#WM_CLASS=`wmctrl -l -x |grep $wmid | cut -d ' ' -f 4`
WM_CLASS=`echo $t | sed 's/ /\n/g' | grep WM_CLASS | sed 's/~/ /g' | cut -d '=' -f 2`
#取窗口class
bln=(`echo $t | sed 's/ /\n/g' | grep _NET_FRAME_EXTENTS | sed 's/~/ /g' | cut -d '=' -f 2 | sed 's/,/
/g'`)
#取窗口边框信息
echo $wid $wmid $WM_CLASS ${bln[0]} ${bln[1]} ${bln[2]} ${bln[3]}
i=0
while [ -n "${win}" ];do
if [ -n "`echo $WM_CLASS | grep \"${win}\"`" ];then
wmctrl -i -r $wmid -b add,below,skip_taskbar
wx=`echo "${desktop[0]}+${desktop[2]}*${x}"|bc | cut -d '.' -f 1`
wy=`echo "${desktop[1]}+${desktop[3]}*${y}"|bc | cut -d '.' -f 1`
ww=`echo "${desktop[2]}*${w}-${bln[0]}-${bln[1]}"|bc | cut -d '.' -f 1`
wh=`echo "${desktop[3]}*${h}-${bln[2]}-${bln[3]}"|bc | cut -d '.' -f 1`
echo $wx,$wy,$ww,$wh
wmctrl -i -r $wmid -e 1,$wx,$wy,$ww,$wh
fi
i=$[i+1]
done
排满了我常用的软件,原理是根据屏幕宽度(可以自定义),采用鼠标取窗口的方法(避免了软件多开麻烦),用占屏百分比来控制窗口位置及大小。缺点是不能去除窗口border,计算时要剔除边框像素,而且显示也占用屏幕(希望有高手指点一下),有点没明白的是:为什么xprop取出的窗口id比wmctrl -m 取出的id大1?这个bash命令用法很简单:
命令 [窗口id] [x,y,w,h]
有参数时是撤消锁屏,无参数才是控制窗口
以上配置是静态控制,我想配合xdotools应该可以实现动态控制,最想的就是把focus窗口固定到某相对较大范围区,其它窗口按顺序排布于旁边,有点象panel了,有时间再玩。。。。。。非gentoo技术能加精不 |
|