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

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

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

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

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

Редактировать:

Вот скрипт для открытия файла с именем 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
3
задан 10.06.2015, 22:57

3 ответа

Для расположения окна можно использовать инструмент, который управляет X событиями такой как xdotool или wmctrl. Например, с wmctrl, можно использовать -e:

   -e <MVARG>
          Resize  and  move  a  window  that  has been specified with a -r
          action according to the <MVARG> argument.
   <MVARG>
          A move and resize argument has the format 'g,x,y,w,h'.  All five
          components are integers. The first value, g, is the  gravity  of
          the  window,  with  0  being  the most common value (the default
          value for the window). Please see  the  EWMH  specification  for
          other values.

          The four remaining values are a standard geometry specification:
          x,y is the position of the top left corner of  the  window,  and
          w,h  is  the  width and height of the window, with the exception
          that the value of -1 in any position is interpreted to mean that
          the current geometry value should not be modified.

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

wmctrl -r :ACTIVE: -e 1,1,1,1200,700

Эти -r позволяет, Вы выбрать окно и :ACTIVE: имеете в виду в настоящее время фокусируемое окно.

можно также упростить сценарий. Нет никакой причины проанализировать ps, специальная переменная $! содержит PID задания, последний раз помещенного в фоновом режиме. В любом случае парсинг ps часто перестанет работать, так как могло бы быть несколько процессов, соответствующих Thesis.pdf. Всегда будет два: evince и grep Thesis.pdf Вы просто работали.

Так, со всем, что в памяти, Вы могли сделать:

#! /bin/bash
while true; do
    ## Open the pdf
    evince ~/doc/a.pdf &
    ## Save the PID of evince
    pid="$!"
    ## Wait for a 1.5 seconds. This is to give the window time to
    ## appear. Change it to a higher value if your system is slower. 
    sleep 1.5
    ## Get the X name of the evince window
    name=$(wmctrl -lp | awk -vpid="$pid" '$3==pid{print $1}')
    ## Position the window
    wmctrl -ir "$name" -e 1,1,1,1200,700
    ## Wait
    sleep 5m
    ## Close it
    kill "$pid"
done

Примечание, которое я удалил exit 0 с тех пор из-за Вашего while true, это никогда не будет достигаться и нет никакого смысла к нему. Можно играть с позиционными параметрами для выяснения, где Вы хотите поместить окно.

Наконец, примечание по [1 117]. Это переменные указывает на X дисплеев. Это не экран, это - активный X-сервер. Многие пользователи могли бы идти параллельно X-серверы на единственной машине, это позволяет Вам выбирать, на каком из них окно должно быть отображено. Это абсолютно не имеет никакого отношения к тому, сколько физических экранов соединено, если каждый экран не выполняет отдельное X сессий.

0
ответ дан 17.04.2019, 22:27
  • 1
    That' s путь I' d делают это. +1! – Luis Muñiz 11.06.2015, 03:31
  • 2
    Работавший безупречно, я просто должен настроить размеры окна. – Son Pham 15.06.2015, 23:25

Здесь я делаю абсолютный выстрел в темноте, но временным решением может быть следующий сценарий:

#!/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
ответ дан 17.04.2019, 22:27
  • 1
    Спасибо, я надеялся, что это будет работать, но к сожалению это didn' t. Я выполнил команды в терминале, и программы все еще следуют за мышью... – mdurant 11.06.2015, 00:06

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

С чем вы столкнетесь при написании скрипта для открытия приложения на определенном экране или в позиции

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

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

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

Скрипт

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


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

  1. установить оба xdotool и [115 ]. Я использовал и , так как изменение размера с wmctrl может вызвать некоторые особенности (в частности) Unity.

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  2. Скопируйте приведенный ниже скрипт в пустой файл, сохраните его как setwindow (без расширения) в ~/bin; при необходимости создайте каталог.

  3. Сделайте скрипт исполняемым (!)
  4. Если вы только что создали ~bin, запустите: source ~/.profile
  5. Протестируйте скрипт с помощью команды, например (например)

    setwindow 0 0 50 100 gedit /path/to/file.txt
    

    Другими словами:

    setwindow <horizontal-position> <vertical-position> <horizontal-size (%)> <vertical-size (%)> <application> <file_to_open>
    

Если все работает нормально, используйте команду там, где вам нужно.

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

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

enter image description here

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

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

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

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

0
ответ дан 17.04.2019, 22:27

Теги

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