Запустите приложение на определенном мониторе

У меня есть Ubuntu 14.04 и два монитора. Когда я открываю приложения, мне нужны некоторые из них, чтобы быть на основном мониторе и других На вторичном устройстве.
В данный момент приложения всегда открываются в основном мониторе.

У меня есть значки тире только на одном, (слева) отображаются, таким образом, я не могу запустить приложения с помощью курсора или активного окна, сходящего с Compiz.

8
задан 29 April 2015 в 08:28

2 ответа

Вот идея для сценария запуска или по крайней мере сценария, который может быть обязан с ярлыком запустить окна впервые:

Шаг 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

Установка wmctrl с sudo apt-get install wmctrl

Этот инструмент допускает изменение некоторых свойств окон путем обращения к их шестнадцатеричному идентификатору или заголовку окна. Я объяснил, как это работает над другим вопросом, который я свяжу позже здесь

Шаг 3 Создайте этот сценарий в Вашем ~/bin папка или где-нибудь который является частью Вашего пути. Можно также связать полный путь с этим сценарием к ярлыку или создать a .desktop ярлык. Заметьте, что, так как мой экран составляет 1366 x 768, я использую 1300 в качестве своего макс. x-смещения правой стороны. Адаптируйте сценарий согласно своим спецификациям на шаге 1. Заметьте что, если у Вас есть дублирующиеся окна, это могло бы повредиться, таким образом, это хорошо главным образом для запуска двух окон программы впервые

#!/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

Теперь, Вы могли адаптировать этот сценарий, чтобы вести себя как средство запуска всего для одного окна и указать, хотите ли Вы, чтобы это было на правой стороне или оставлено. Я буду работать над этой идеей немного позже в тот же день, но основная идея к снова, используйте два всплывающих окна и если оператор. Другая идея, что я имею, состоит в том, чтобы использовать 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
ответ дан 23 November 2019 в 08:00

Решение ниже работ следующим образом:

  1. Нажмите сочетание клавиш
  2. Первое приложение, которое запускается в течение 15 секунд, запустится на экране 1

или:

  1. Нажмите (nother) сочетание клавиш
  2. Первое приложение, которое запускается в течение 15 секунд, запустится на экране 2

Другими словами: Вам будут нужны два сочетания клавиш, чтобы удостовериться, что новое окно приложения появляется или на первом или на втором экране.

Как настроить

Сценарий использует обоих xdotool и wmctrl:

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
    

    теперь приложение shoulod открывается на втором экране.

  6. Если все хорошо работает, добавьте обе команды к двум различным сочетаниям клавиш: Выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команды:

    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 секунд это завершается так или иначе для предотвращения выполнения бесконечно, если никакое окно не появляется.

Примечание:

Сценарий предполагает, что экраны являются вершиной-alligned. Если существуют значительные различия, сценарию, возможно, понадобилось бы немного тонкой настройки, чтобы препятствовать тому, чтобы окна "натолкнулись" о границу другого экрана.

2
ответ дан 23 November 2019 в 08:00

Другие вопросы по тегам:

Похожие вопросы: