Программа Bash для открытия файлов на втором мониторе

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

Проблема в том, что если мышь указала, что программа открывается, я бы хотел, чтобы она открывалась на моем втором мониторе, который является идеальным размером для просмотра файла.

Я попытался использовать отображаемые переменные следующим образом (в командной строке) export DISPLAY =: 0.1. Но тогда любая программа, которую я вызываю из CLI после этого, возвращает ошибку. (Ошибка: невозможно открыть дисплей: 0.1)

У кого-нибудь есть предложение?

edit:

Вот скрипт, чтобы открыть файл под названием thesis.pdf каждые пять минут

#! /bin/bash

while true; do
    evince /home/adam/Desktop/Thesis.pdf &
    sleep 5m
    ps -ef | grep "Thesis.pdf" | awk '{print $2}' | xargs kill
done

exit 0
1
задан 10 June 2015 в 12:57

2 ответа

Этот ответ предполагает, что вы используете Unity:

То, что вы натолкнулись при написании скрипта, чтобы открыть приложение на определенном экране или positon

Если вы хотите позвонить приложение и, впоследствии, поместить свое окно в определенную позицию и размер, время между вызовом приложения и моментом появления окна действительно важно, но непредсказуемо; если ваша система занята, она может быть значительно длиннее, чем если она не работает.

Вам нужен (желательно «умный») способ убедиться, что позиционирование / изменение размера (сразу) после появления окна .

Скрипт ниже (отредактированная версия этого) открывает приложение, возможно, с файлом как аргумент, в любом месте вашего рабочего стола (также на втором мониторе). Он ждет появления окна до того, как он переместит окно в его положение и размер, поэтому он будет работать правильно, независимо от того, будет ли ваша система медленной (или занятой) или нет.

Сценарий [!d8 ]
#!/usr/bin/env python3
import subprocess
import time
import sys

app = (" ").join(sys.argv[5:])

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[3]+"% "+sys.argv[4]+"%"
        cmd4 = "xdotool windowmove "+procs[0][0][1]+" "+sys.argv[1]+" "+sys.argv[2]
        for cmd in [cmd1, cmd2, cmd3, cmd4]:   
            subprocess.call(["/bin/bash", "-c", cmd])
        break
    time.sleep(0.5)
    t = t+1

Как использовать

установить как xdotool, так и wmctrl. Я использовал оба, поскольку изменение размера с помощью wmctrl может вызвать некоторые особенности (в частности) Unity.
sudo apt-get install wmctrl
sudo apt-get install xdotool
Скопируйте сценарий ниже в пустой файл, сохраните его как setwindow (без расширения) в ~/bin; при необходимости создайте каталог. Сделайте скрипт исполняемым (!) Если вы только что создали ~bin, запустите: source ~/.profile. Запустите сценарий с помощью команды like (например)
setwindow 0 0 50 100 gedit /path/to/file.txt
. Другими словами:
setwindow <horizontal-position> <vertical-position> <horizontal-size (%)> <vertical-size (%)> <application> <file_to_open>

Если

Чтобы открыть приложение на мониторе справа

Если вы подключили второй монитор, вы должны подумать о комбинированном экраны как один большой виртуальный рабочий стол, как пример ниже.

В этом примере, чтобы поместить окно на правый экран, вам просто нужно сделать его x-положение большим, чем x-разрешение левого экрана. (> 1680 в этом случае).

Чтобы открыть файл с вашим приложением максимально эффективным образом, установите для параметра <horizontal-size (%)> и <vertical-size (%)> значение 100.

Незначительная проблема

В Unity, когда вы (повторно) позиционируете и (повторно) меняете окно с помощью wmctrl или xdotool, окно всегда будет держать маленькую маржу до границ вашего экрана, если вы не установите его на 100%. Вы можете видеть это на изображении (3) выше; в то время как окно inkscape было помещено в позицию x 0, вы все равно можете видеть незначительную границу между Unity Launcher и inkscape.

1
ответ дан 23 May 2018 в 19:58

Я беру абсолютный выстрел в темноте, здесь, но обходным решением для этого может быть этот скрипт:

#!/bin/bash
# Author: Andrew Martin
# Credit: http://ubuntuforums.org/showthread.php?t=1309247
echo "Enter the primary display from the following:"            # prompt for the display
xrandr --prop | grep "[^dis]connected" | cut --delimiter=" " -f1    # query connected monitors
read choice                             # read the users's choice of monitor
xrandr --output $choice --primary                   # set the primary monitor

Я считаю, что это сработало для меня, чтобы установить мои средний монитор вместо моего монитора ноутбука на «главный монитор». Это, теоретически, откроет вашу программу на главном мониторе? - Я знаю, что вы сказали, что он открывается, где вы на мыши, но это выстрел ...

Надеюсь, вы его решите: )

0
ответ дан 23 May 2018 в 19:58
  • 1
    Спасибо, я надеялся, что это сработает, но, к сожалению, этого не произошло. Я запускал команды в терминале, и программы по-прежнему следуют за мышью ... – Adam 10 June 2015 в 14:06

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

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