Ubuntu 14.04と2台のモニターがあります。アプリケーションを開くとき、それらの一部はプライマリモニター上にあり、その他はセカンダリモニター上にある必要があります。
現在、アプリは常にプライマリモニターで開きます。
1つ(左)のディスプレイにのみダッシュアイコンがあるため、Compizのカーソルまたはアクティブウィンドウ設定を使用してアプリを起動できません。
これは、起動スクリプト、または少なくともウィンドウを初めて起動するショートカットにバインドできるスクリプトのアイデアです。
ステップ1
ルートウィンドウの幅と高さを確認します。これは
xwininfo -root | awk '/Width/,/Height/ {print}'
または
xprop -root | awk '$1~/NET_DESKTOP_GEOMETRY/ {print }
サンプル出力は以下です
$ xwininfo -root | awk '/Width/,/Height/ {print}'
Width: 1366
Height: 768
$ xprop -root | awk '$1~/NET_DESKTOP_GEOMETRY/ {print}'
_NET_DESKTOP_GEOMETRY(CARDINAL) = 1366, 768
ステップ2
Sudo apt-get install wmctrl
でwmctrl
をインストールします
このツールを使用すると、16進IDまたはウィンドウタイトルを参照することにより、一部のウィンドウプロパティを変更できます。別の質問でそれがどのように機能するかを説明しましたが、これは後でリンクします
ステップ~/bin
フォルダーまたはパスの一部にこのスクリプトを作成します。このスクリプトへのフルパスをショートカットにバインドするか、.desktop
ショートカットを作成することもできます。私の画面は1366 x 768であるため、最大右側xオフセットとして1300を使用していることに注意してください。手順1の仕様に従ってスクリプトを調整します。ウィンドウが重複している場合、これが壊れる可能性があるため、ほとんどの場合、2つのプログラムウィンドウを初めて起動するのに適しています。
#!/bin/sh
# Author: Serg Kolo
# Description: Send two different applications to different windows
set -x
LEFT=$(zenity --entry --text="What to put on the left?")
RIGHT=$(zenity --entry --text="What to put on the right?")
$LEFT &
$RIGHT &
sleep 1
if [ $? -eq 0 ]; then
# Get title of the left window
LEFT_TITLE="$(wmctrl -l | grep -i $LEFT | awk '{$1=$2=$3="";print}')"
# Get title of the right window
RIGHT_TITLE="$(wmctrl -l | grep -i $RIGHT | awk '{$1=$2=$3="";print }')"
printf "THIS IS A TEST %s",$LEFT_TITLE
printf "THIS IS A TEST 2 %s",$RIGHT_TITLE
wmctrl -r $LEFT_TITLE -e 0,0,0,600,600
sleep 0.5
wmctrl -r $RIGHT_TITLE -e 0,1300,0,600,600
fi
これで、このスクリプトを1つのウィンドウだけのランチャーとして動作するように調整し、それを右側または左側のどちらに配置するかを指定できます。私はこのアイデアに少し後日取り組みますが、基本的なアイデアは2つのポップアップとifステートメントを使用することです。もう1つのアイデアは、awkを使用して、単一のポップアップから関連情報を抽出することです。スクリプトを完了したら回答を編集します
編集
そして、これが単一ウィンドウ用のランチャーです。左に配置する場合はprogramname,L
、右に配置する場合はprogramname,R
を入力します
#!/bin/sh
# set -x
PROG=$(zenity --entry --text="Program,L or R ?")
NAME=$(echo $PROG | cut -d ',' -f1)
SIDE=$(echo $PROG | cut -d ',' -f2)
$NAME &
sleep 1
if [ $? -eq 0 ]
then
TITLE=$( wmctrl -l | grep -i $NAME| awk '{$1=$2=$3=""; print}' )
sleep 0.5
if [ $SIDE = "L" ];then
wmctrl -r $TITLE -e 0,0,0,600,600
else
wmctrl -r $TITLE -e 0,1300,0,600,600
fi
fi
以下のソリューションは次のように機能します。
または:
つまり、新しいアプリケーションウィンドウが最初の画面または2番目の画面のいずれかに表示されるようにするには、2つのキーの組み合わせが必要です。
スクリプトはxdotool
とwmctrl
の両方を使用します。
Sudo apt-get install xdotool
Sudo apt-get install wmctrl
次に:
preferred_screen
に~/bin
(拡張子なし)として保存します。必要に応じてディレクトリを作成します。ディレクトリ~bin
を作成したばかりの場合、ターミナルで実行します:
source ~/.profile
ターミナルウィンドウでコマンドを実行して、スクリプトをテスト実行します。
preferred_screen 1
(任意の)アプリケーションを開きます。最初の画面で開きます。
次のコマンドを使用して手順を繰り返します。
preferred_screen 2
これで、アプリケーションが2番目の画面で開かれます。
すべてが正常に機能する場合は、両方のコマンドを2つの異なるキーの組み合わせに追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します。
preferred_screen 1
preferred_screen 2
#!/usr/bin/env python3
import subprocess
import time
import sys
#--- enter the horizontal resolution of the left screen below
left_width = 1600
#---
target_screen = int(sys.argv[1])
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8")
def new_window(left_width):
w_list1 = get(["wmctrl", "-lG"]).splitlines()
while True:
time.sleep(1)
w_list2 = get(["wmctrl", "-lG"]).splitlines()
new = [w.split() for w in w_list2 if not w in w_list1]
if len(new) != 0:
data = new[0]
pos = 1 if int(data[2]) < left_width else 2
coords = data[2:4]
w_id = data[0]
return [w_id, pos, coords]
break
subject = new_window(left_width)
if not int(subject[1]) == target_screen:
move = -left_width if target_screen == 1 else left_width - int(subject[2][0])
subprocess.Popen(["xdotool", "windowmove", subject[0], str(int(subject[2][0])+move), subject[2][1]])
起動プロセス自体に侵入することは、この状況では私にはきれいな解決策ではないと思われたため、以下の解決策は「偶発的な」ベースで機能します(キーの組み合わせから呼び出す場合のみ)。
スクリプトが呼び出されると、新しいウィンドウが表示されるまで15秒間待機し、右または左の画面に移動して(対象の画面にまだない場合)、その後終了します。 15秒後、ウィンドウが表示されない場合に無限に実行されるのを防ぐため、とにかく終了します。
スクリプトは、画面が最上位にあると想定しています。大きな違いがある場合、他の画面の境界に対してウィンドウが「ぶつかる」のを防ぐために、スクリプトを少し調整する必要があるかもしれません。