Я написал небольшой скрипт на 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
Для расположения окна можно использовать инструмент, который управляет 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 сессий.
Этот ответ предполагает использование Единицы:
Если Вы хотите назвать приложение и, впоследствии, поместить его окно в определенное положение и размер, время между вызовом приложения и момент, окно на самом деле появляется, важно, но непредсказуемо; если Ваша система занята, это может быть значительно длиннее, чем если бы это неактивно.
Вам нужно (предпочтительно "умный") способ удостовериться, что расположение/изменение размеров сделано (сразу) после того, как окно появляется.
Сценарий ниже (отредактированная версия этого) открывает приложение, возможно с файлом как аргумент, на любом месте на Вашем рабочем столе (на втором мониторе также). Это ожидает окна для появления, прежде чем это переместит окно в свое положение и размер, таким образом, это будет работать правильно, неважно, если система будет медленной (или занятый) или нет.
#!/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
Тестовый прогон сценарий с командой как (например).
setwindow 0 0 50 100 gedit /path/to/file.txt
Другими словами:
setwindow <horizontal-position> <vertical-position> <horizontal-size (%)> <vertical-size (%)> <application> <file_to_open>
Если все хорошо работает, используйте команду везде, где Вам нужна она.
Если у Вас есть второй подключенный монитор, необходимо думать об объединенных экранах как об одном большом виртуальном рабочем столе, как пример ниже.
В этом примере, для размещения окна в правильный экран просто необходимо сделать его x-position большее затем x-разрешением левого экрана. (> 1680 в этом случае).
Для открытия файла с приложением максимизируемым способом установите обоих <horizontal-size (%)>
и <vertical-size (%)>
кому: 100
.
В Единице, когда Вы (пере-) положение и (пере-) измеряете окно с также wmctrl
или xdotool
, окно будет всегда сохранять маленький marge к границам Вашего экрана, если Вы не установите его на 100%. Вы видите это в изображении (3) выше; в то время как inkscape
окно было помещено в x
положение 0, можно все еще видеть незначительный marge между Средством запуска Единицы и inkscape
окно.
Здесь я делаю абсолютный выстрел в темноте, но временным решением может быть следующий сценарий:
#!/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
Я считаю, что это сработало для меня, чтобы установить мою середину монитор вместо моего ноутбука монитор на «основной монитор». Это, теоретически, откроет вашу программу на главном мониторе? - Я знаю, вы сказали, что она открывается там, где вы находитесь, но это стреляет ...
Надеюсь, вы решите это:)