Программа 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 June 2015 в 12: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, это никогда не будет достигаться и нет никакого смысла к нему. Можно играть с позиционными параметрами для выяснения, где Вы хотите поместить окно.

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

5
ответ дан 10 June 2015 в 12:57

Этот ответ предполагает использование Единицы:

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

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

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

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

Сценарий

#!/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 и wmctrl. Я использовал обоих начиная с изменения размеров с 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

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

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

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

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

1
ответ дан 10 June 2015 в 12:57

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

#!/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
ответ дан 10 June 2015 в 12:57

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

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