web-dev-qa-db-ja.com

定義済みのウィンドウサイズと位置でアプリケーションを起動するにはどうすればよいですか?

ターミナルコマンドを代わりに使用して、UnityのCtrl-Alt-Keypadショートカットの影響を達成する方法はありますか? guiウィンドウを画面の半分のサイズ(左揃えまたは右揃え)に設定するコマンドが必要です。

背景として、ログイン後に実行するスクリプトを記述しています。Zenityを使用して、開発環境(GVimとIPythonを並べて)を開くかどうかを尋ねます。 set lines= columns=.gvimrcc.IPythonWidget.width =c.IPythonWidget.height =ipython_qtconsole_config.pyを使用して、これらのプログラムの2つの同じサイズのウィンドウを実現しようとしています。ただし、このアプローチには問題があります。

20
STim

何に出会うか

最初にアプリケーションを呼び出し、その後、そのウィンドウを特定の位置とサイズに配置する場合は、アプリケーションの呼び出しウィンドウが実際に表示される瞬間の間の時間予測不能です。システムが占有されている場合、アイドル状態の場合よりも大幅に長くなる可能性があります。

ウィンドウappearsの後に(すぐに)位置決め/サイズ変更が行われることを確認するための「スマート」な方法が必要です。

アプリケーションを呼び出し、表示されるのを待って画面に配置するスクリプト

次のスクリプトを使用すると、アプリケーションを呼び出して、コマンドで表示される位置とサイズを設定できます。

<script> <application> <x-position> <y-position> <h-size> <v-size>

いくつかの例:

  • gnome-terminalを呼び出してウィンドウのサイズを50%に変更し、右半分に配置するには:

    <script> gnome-terminal 840 0 50 100
    

    enter image description here

  • geditを呼び出すには、ウィンドウを左側に配置しますおよびgnome-terminalを呼び出し、右側に配置します(v-size 46%を設定して少しスペースを空けます)ウィンドウ間):

    <script> gedit 0 0 46 100&&<script> gnome-terminal 860 0 46 100
    

    enter image description here

  • Inkscapeを呼び出すには、ウィンドウを画面の左/上部に配置します。

    <script> inkscape 0 0 50 50
    

    enter image description here

スクリプトとその使用方法

  1. xdotoolwmctrlの両方をインストールします。私はbothを使用しました。wmctrlでサイズ変更すると、(具体的に)Unityにいくつかの特異性が生じる可能性があるためです。

    Sudo apt-get install wmctrl
    Sudo apt-get install xdotool
    
  2. 以下のスクリプトを空のファイルにコピーし、~/binsetwindow(拡張子なし)として保存します。必要に応じてディレクトリを作成します。
  3. スクリプトを実行可能にします(!)
  4. ~binを作成したばかりの場合は、source ~/.profileを実行します
  5. コマンドでスクリプトをテスト実行します(例)

    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

何をする

スクリプトが呼び出されると、次のようになります。

  1. アプリケーションを起動します
  2. ウィンドウリストを監視します(usingwmctrl -lp
  3. 新しいウィンドウが表示される場合、新しいウィンドウが呼び出されたアプリケーションに属するかどうかを確認します(ps -ef wwを使用して、ウィンドウのpidとアプリケーションのpidを比較します)
  4. その場合、引数に従ってサイズと位置を設定します。アプリケーションがappr内に「表示」されない場合。 15秒、スクリプトは、エラーのためにアプリケーションが実行されないと想定します。その後、スクリプトは終了し、新しいウィンドウが無限に待機するのを防ぎます。

軽微な問題

Unityでは、wmctrlまたはxdotoolのいずれかを使用してウィンドウを(再)配置および(再)サイズ変更すると、設定しない限り、ウィンドウは常に画面の境界に小さな境界を保持します。それを100%にします。上記の画像(3)で確認できます。 inkscapeウィンドウがx位置0に配置されている間、Unityランチャーとinkscapeウィンドウの間に小さなマージが見られます。

17
Jacob Vlijm

Unity用のWorksets( github )という名前のアプリケーションをビルドしました。これにより、グラフィカルユーザーインターフェイスを介して簡単にこれを行うことができます-無料でオープンソースです。

tTray menu

基本的には、ここに答えとしてリストされているwmctrlおよびxdotoolソリューションのラッパーであり、そのようなセットアップをすばやく作成して保存する簡単な方法を提供します。

3
Tumult

あなたが望む実際のコマンドは次のようなものです

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が動作しない理由はわかりません。 wmctrlxdpyinfoおよび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
3
terdon

Jacob Vlijmの優れた投稿に直接コメントする担当者はいませんが、引数を使用してアプリケーションを開始できるようにスクリプトを変更しました(setwindowgedit --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]
1
D. Hancock

上からTerdonのスクリプトをいじって、いくつかの新しいことを追加しました(モニターを選択し、各モニターの高さを設定する機能)。私が思うに、モニターをさらに追加することも可能です。うまくいけば、他の人が役に立つと思います。

基本構文:

prog_name monitor l/r/m window_name (optional)

Prog_nameは、このコードを保存したものです。 monitorは、モニター番号です。 1または2。 l/r/mは左または右または最大です。 window_nameは、ターゲットウィンドウの名前(またはその一部)です。

例えば。:

setwindow 1 m chrome

Bashスクリプト

#!/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
0
Philosopher Rex