2011-03-24 20 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