web-dev-qa-db-ja.com

特定のモニターでアプリケーションを起動する

Ubuntu 14.04と2台のモニターがあります。アプリケーションを開くとき、それらの一部はプライマリモニター上にあり、その他はセカンダリモニター上にある必要があります。
現在、アプリは常にプライマリモニターで開きます。

1つ(左)のディスプレイにのみダッシュアイコンがあるため、Compizのカーソルまたはアクティブウィンドウ設定を使用してアプリを起動できません。

6
Fiona

これは、起動スクリプト、または少なくともウィンドウを初めて起動するショートカットにバインドできるスクリプトのアイデアです。

ステップ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 wmctrlwmctrlをインストールします

このツールを使用すると、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

以下のソリューションは次のように機能します。

  1. キーの組み合わせを押す
  2. 15秒以内に起動する最初のアプリケーションは画面1で起動します

または:

  1. a(nother)キーの組み合わせを押します
  2. 15秒以内に起動する最初のアプリケーションは、画面2で起動します

つまり、新しいアプリケーションウィンドウが最初の画面または2番目の画面のいずれかに表示されるようにするには、2つのキーの組み合わせが必要です。

設定方法

スクリプトはxdotoolwmctrlの両方を使用します。

Sudo apt-get install xdotool
Sudo apt-get install wmctrl

次に:

  1. 以下のスクリプトを空のファイルにコピーし、preferred_screen~/bin(拡張子なし)として保存します。必要に応じてディレクトリを作成します。
  2. スクリプトを実行可能にする
  3. ヘッドセクションで、左画面の水平解像度を設定します(既に1600に設定しています)
  4. ディレクトリ~binを作成したばかりの場合、ターミナルで実行します:

    source ~/.profile
    
  5. ターミナルウィンドウでコマンドを実行して、スクリプトをテスト実行します。

    preferred_screen 1
    

    (任意の)アプリケーションを開きます。最初の画面で開きます。

    次のコマンドを使用して手順を繰り返します。

    preferred_screen 2
    

    これで、アプリケーションが2番目の画面で開かれます。

  6. すべてが正常に機能する場合は、両方のコマンドを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秒後、ウィンドウが表示されない場合に無限に実行されるのを防ぐため、とにかく終了します。

注意

スクリプトは、画面が最上位にあると想定しています。大きな違いがある場合、他の画面の境界に対してウィンドウが「ぶつかる」のを防ぐために、スクリプトを少し調整する必要があるかもしれません。

2
Jacob Vlijm