ターミナルコマンドを代わりに使用して、UnityのCtrl-Alt-Keypadショートカットの影響を達成する方法はありますか? guiウィンドウを画面の半分のサイズ(左揃えまたは右揃え)に設定するコマンドが必要です。
背景として、ログイン後に実行するスクリプトを記述しています。Zenityを使用して、開発環境(GVimとIPythonを並べて)を開くかどうかを尋ねます。 set lines= columns=
で.gvimrc
とc.IPythonWidget.width =
でc.IPythonWidget.height =
とipython_qtconsole_config.py
を使用して、これらのプログラムの2つの同じサイズのウィンドウを実現しようとしています。ただし、このアプローチには問題があります。
最初にアプリケーションを呼び出し、その後、そのウィンドウを特定の位置とサイズに配置する場合は、アプリケーションの呼び出しとウィンドウが実際に表示される瞬間の間の時間予測不能です。システムが占有されている場合、アイドル状態の場合よりも大幅に長くなる可能性があります。
ウィンドウappearsの後に(すぐに)位置決め/サイズ変更が行われることを確認するための「スマート」な方法が必要です。
次のスクリプトを使用すると、アプリケーションを呼び出して、コマンドで表示される位置とサイズを設定できます。
<script> <application> <x-position> <y-position> <h-size> <v-size>
いくつかの例:
gnome-terminal
を呼び出してウィンドウのサイズを50%に変更し、右半分に配置するには:
<script> gnome-terminal 840 0 50 100
gedit
を呼び出すには、ウィンドウを左側に配置しますおよびgnome-terminal
を呼び出し、右側に配置します(v-size
46%を設定して少しスペースを空けます)ウィンドウ間):
<script> gedit 0 0 46 100&&<script> gnome-terminal 860 0 46 100
Inkscapeを呼び出すには、ウィンドウを画面の左/上部に配置します。
<script> inkscape 0 0 50 50
xdotool
とwmctrl
の両方をインストールします。私はbothを使用しました。wmctrl
でサイズ変更すると、(具体的に)Unity
にいくつかの特異性が生じる可能性があるためです。
Sudo apt-get install wmctrl
Sudo apt-get install xdotool
~/bin
にsetwindow
(拡張子なし)として保存します。必要に応じてディレクトリを作成します。~bin
を作成したばかりの場合は、source ~/.profile
を実行しますコマンドでスクリプトをテスト実行します(例)
setwindow gnome-terminal 0 0 50 100
言い換えると:
setwindow <application> <horizontal-position> <vertical-position> <horizontal-size (%)> <vertical-size (%)>
すべてが正常に機能する場合は、必要な場所でコマンドを使用します。
#!/usr/bin/env python3
import subprocess
import time
import sys
app = sys.argv[1]
get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8")
ws1 = get("wmctrl -lp"); t = 0
subprocess.Popen(["/bin/bash", "-c", app])
while t < 30:
ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
procs = [[(p, w[0]) for p in get("ps -e ww").splitlines() \
if app in p and w[2] in p] for w in ws2]
if len(procs) > 0:
w_id = procs[0][0][1]
cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
cmd3 = "xdotool windowsize --sync "+procs[0][0][1]+" "+sys.argv[4]+"% "+sys.argv[5]+"%"
cmd4 = "xdotool windowmove "+procs[0][0][1]+" "+sys.argv[2]+" "+sys.argv[3]
for cmd in [cmd1, cmd2, cmd3, cmd4]:
subprocess.call(["/bin/bash", "-c", cmd])
break
time.sleep(0.5)
t = t+1
スクリプトが呼び出されると、次のようになります。
wmctrl -lp
)ps -ef ww
を使用して、ウィンドウのpidとアプリケーションのpidを比較します)Unityでは、wmctrl
またはxdotool
のいずれかを使用してウィンドウを(再)配置および(再)サイズ変更すると、設定しない限り、ウィンドウは常に画面の境界に小さな境界を保持します。それを100%にします。上記の画像(3)で確認できます。 inkscape
ウィンドウがx
位置0に配置されている間、Unityランチャーとinkscape
ウィンドウの間に小さなマージが見られます。
Unity用のWorksets( github )という名前のアプリケーションをビルドしました。これにより、グラフィカルユーザーインターフェイスを介して簡単にこれを行うことができます-無料でオープンソースです。
基本的には、ここに答えとしてリストされているwmctrlおよびxdotoolソリューションのラッパーであり、そのようなセットアップをすばやく作成して保存する簡単な方法を提供します。
あなたが望む実際のコマンドは次のようなものです
wmctrl -r :ACTIVE: -b add,maximized_vert &&
wmctrl -r :ACTIVE: -e 0,0,0,$HALF,-1
これにより、現在のウィンドウが画面の半分になり($HALF
を画面のサイズに変更)、左側にスナップします。右にスナップするには、次を使用します
wmctrl -r :ACTIVE: -b add,maximized_vert &&
wmctrl -r :ACTIVE: -e 0,$HALF,0,$HALF,-1
:ACTIVE:
を使用する代わりに、wmctrl
を操作して、目的のウィンドウのIDを取得することもできます。しかし、それは問題のウィンドウに依存するため、そこでは仕方がありません。詳細については、man wmctrl
をご覧ください。
そのためのスクリプトを作成しました。私はUnityを使用していないので、Unityが動作することを保証できませんが、Unityが動作しない理由はわかりません。 wmctrl
、xdpyinfo
およびdisper
をインストールする必要があります。
Sudo apt-get install wmctrl x11-utils disper
次に、以下のスクリプトを~/bin/snap_windows.sh
として保存し、chmod a+x ~/bin/snap_windows.sh
で実行可能にして実行できます。
snap_windows.sh r
右側にスナップします。ウィンドウを最大化するには、左側にl
を使用し、引数を使用しません。現在のウィンドウで実行されるため、端末以外で実行する場合はショートカットを割り当てる必要があることに注意してください。
このスクリプトは、シングルモニターとデュアルモニターの両方のセットアップで動作するように記述しているため、ユーザーが求めるものよりも少し複雑です。
#!/usr/bin/env bash
## If no side has been given, maximize the current window and exit
if [ ! $1 ]
then
wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz
exit
fi
## If a side has been given, continue
side=$1;
## How many screens are there?
screens=`disper -l | grep -c display`
## Get screen dimensions
WIDTH=`xdpyinfo | grep 'dimensions:' | cut -f 2 -d ':' | cut -f 1 -d 'x'`;
HALF=$(($WIDTH/2));
## If we are running on one screen, snap to Edge of screen
if [ $screens == '1' ]
then
## Snap to the left hand side
if [ $side == 'l' ]
then
## wmctrl format: gravity,posx,posy,width,height
wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,0,0,$HALF,-1
## Snap to the right hand side
else
wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,$HALF,0,$HALF,-1
fi
## If we are running on two screens, snap to Edge of right hand screen
## I use 1600 because I know it is the size of my laptop display
## and that it is not the same as that of my 2nd monitor.
else
LAPTOP=1600; ## Change this as approrpiate for your setup.
let "WIDTH-=LAPTOP";
SCREEN=$LAPTOP;
HALF=$(($WIDTH/2));
if [ $side == 'l' ]
then
wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,$LAPTOP,0,$HALF,-1
else
let "SCREEN += HALF+2";
wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,$SCREEN,0,$HALF,-1;
fi
fi
Jacob Vlijmの優れた投稿に直接コメントする担当者はいませんが、引数を使用してアプリケーションを開始できるようにスクリプトを変更しました(setwindow
でgedit --new-window
を使用する必要があります)。変化する:
if app in p and w[2] in p] for w in ws2]
に:
if app.split()[0] in p and w[2] in p] for w in ws2]
上からTerdonのスクリプトをいじって、いくつかの新しいことを追加しました(モニターを選択し、各モニターの高さを設定する機能)。私が思うに、モニターをさらに追加することも可能です。うまくいけば、他の人が役に立つと思います。
基本構文:
prog_name monitor l/r/m window_name (optional)
Prog_nameは、このコードを保存したものです。 monitorは、モニター番号です。 1または2。 l/r/mは左または右または最大です。 window_nameは、ターゲットウィンドウの名前(またはその一部)です。
例えば。:
setwindow 1 m chrome
#!/usr/bin/env bash
set -e
#######################- Early Definitions -#######################
snap () {
wmctrl -r ${WIN} -b toggle,add,maximized_vert && wmctrl -r ${WIN} -e 0,${WINX},0,${WINWIDTH},${WINHEIGHT}
}
DISPLAYWIDTH=`xdpyinfo | grep 'dimensions:' | cut -f 2 -d ':' | cut -f 1 -d 'x'`; ## Get screen dimensions
LEFTSCREENWIDTH=1024 ## user set
LEFTSCREENHEIGHT=720 ## user set
RIGHTSCREENHEIGHT=960 ## user set
let "RIGHTSCREENWIDTH=(DISPLAYWIDTH-LEFTSCREENWIDTH)"
#############################- Logic -#############################
if [ ! ${3} ]; then
WIN=":ACTIVE:"
else
WIN=${3}
fi
case ${1} in
1) # monitor one
LEFT=0
WINHEIGHT=${LEFTSCREENHEIGHT}
let "WINWIDTH=LEFTSCREENWIDTH/2"
;;
2) # monitor two
let "LEFT=LEFTSCREENWIDTH"
WINHEIGHT=${RIGHTSCREENHEIGHT}
let "WINWIDTH=RIGHTSCREENWIDTH/2"
;;
"") # error please select a monitor
echo "please select a monitor (1 or 2)"
exit 0
;;
esac
case ${2} in
l|L)
WINX=${LEFT}
snap
;;
r|R)
let "WINX=LEFT+WINWIDTH"
snap
;;
""|m|M)
WINX=${LEFT}
let "WINWIDTH=WINWIDTH*2"
snap
;;
esac
exit 0