2011-03-24 19 views
1

我写了几个剧本的一个窗口最大化到屏幕的一半大小(以使其易于放置窗口并排侧)使用xrandr,grep和wmctrl如下:通过编译代码在Linux操作窗口大小?

#!/bin/bash 

w=`xrandr 2> /dev/null | grep '*' | grep -Po '\d+(?=x)'` 
h=`xrandr 2> /dev/null | grep '*' | grep -Po '(?<=x)\d+'` 
wmctrl -r :ACTIVE: -b remove,maximized_horz,maximized,vert 
wmctrl -r :ACTIVE: -e 0,0,0,$((w/2)),$h 

有没有办法更原生地做到这一点?该脚本在我的桌面上运行良好,但在我的笔记本电脑上有半秒的延迟,这有点令人讨厌。

+0

你能告诉我们从xrandr的输出吗?应该可以将其重写为w_h = $(xrander ... | nawk'....'),从而减少显着启动的进程数量。但是,我怀疑它会对你的体验产生很大的影响。 1/2秒的延迟听起来像操作系统分页,你可能无法消除。 – shellter 2011-03-24 23:29:05

+0

xrandr输出看起来大致类似于'1280x1024 0.0 *',然后是一些附加行,未加星号。 – jonderry 2011-03-25 00:08:31

回答

1

测试代码

# w_h="$(print -- "1280x1024 0.0*" | awk '/.*\*$/{sub(/ .*$/, "");sub("x"," ");$1=$1/2 ;print}')" 
# w="${w_h% *}" ; h="${w_h#* }" 

实际代码

# awk matches only line ending with '*', remove everything from last space to EOL, replace X with " " 
# w_H looks like "640 1040", below splits on space char populating correct var 
w_h="$(xrandr | awk '/\*/{sub(/[0-9\.*\+]*$/, ""); sub("x", " "); $1=$1/2; print}')" 
w="${w_h% *}" ; h="${w_h#* }" 
wmctrl -r :ACTIVE: -b remove,maximized_horz,maximized,vert 
wmctrl -r :ACTIVE: -e 0,0,0,${w},${h} 

请注意,我也做了DIV里面AWK W上。而且,反引号在posix外壳中已弃用。让你的生活更轻松,并使用$()作为命令substituton ;-)

我希望这有助于。

+0

我不得不稍微调整一下这段代码,以使它与我的xrandr输出一起工作(并且移除最大化状态对于调整窗口大小是必要的),但它确实使脚本的运行时间从0.574秒降低到了0.253秒。我的目标是让它达到0.1秒,所以滞后是不可察觉的。 – jonderry 2011-03-26 18:23:13

+0

@jonderry:1.您可以发布您所做的更改,我会将其纳入解决方案。 2.所以你说第一行不是评论。你不能把两条线合在一起吗?wmctrl ... -b删除... -e 0,0 ...?有一个awkcc程序,它将把awk代码变成可以编译的C代码,这可能会缩短你的运行时间,但是我认为你必须编译awkcc才能做到这一点。 – shellter 2011-03-26 19:34:52

+0

#!/ bin/bash w_h = $(xrandr | awk'/\*/{sub(/[0-9\.\*\+]*$/,“”); sub(“x”, “”); $ 1 = $ 1/2; print}') w = $ {w_h%*}; h = $ {w_h#*} wmctrl -r:ACTIVE:-b remove,maximized_horz,maximized,vert wmctrl -r:ACTIVE:-e 0,$ {w},0,$ {w},$ { H} – jonderry 2011-03-26 20:04:14