Как я могу открыть окно на другом мониторе?

9

С несколькими мониторами я до сих пор перетаскивал окна вручную. Есть ли способ сделать окно открытым на определенном экране в установке с двумя головками? (Не путать с несколькими дисплеями X-сервера.)

Что-то вроде: SCREEN=2 firefoxили open-in-screen 2 firefox.

Если это имеет значение, моя среда - KDE, использующая оконный менеджер KWin. Правила окна KWin могут соответствовать только некоторым свойствам, таким как title, но я не смог найти переменную окружения в качестве фильтра.

Дополнительный дисплей расширяет основной экран:

$ xrandr -q
Screen 0: minimum 320 x 200, current 3520 x 1080, maximum 32767 x 32767
LVDS1 connected 1600x900+0+0 (normal left inverted right x axis y axis) 382mm x 214mm
   1600x900       60.1*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+1600+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080      60.0*    50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)
Lekensteyn
источник
2
Обычно я бы предложил использовать kstartдля этого, но, кажется, kstartподдерживает только определение определенного рабочего стола, но не экран, на котором должно быть запущено приложение. Вероятно, стоит сообщить об ошибке WISHLIST на bugs.kde.org .
Элиас Пробст
Отличный совет kstart, я тоже хотел это знать. Команда: kstart --desktop $N firefoxгде $Nчисло от 1 до общего количества виртуальных рабочих столов.
Лекенштейн
Что касается kstart, есть также отчет об ошибке на bugs.kde.org просят для этой функции.
Элиас Пробст
Как странно, я видел пост о wmctrl ранее сегодня, но у меня не было возможности протестировать его. Почему это было удалено?
Лекенштейн
Понятия не имею о посте wmctrl, не видел его.
Элиас Пробст

Ответы:

5

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

Разумные наборы инструментов поддерживают -geometryопцию, которая позволяет вашему приложению запрашивать размещение в определенной позиции. Если у вас нет этой опции, вы можете использовать ее, wmctrlесли у вас есть XW Manager, совместимый с EWMH / NetWM, для перемещения и изменения размера уже существующих окон (см. Wmctrl (1), вам нужны опции -rи -e). Я использую devilspieдля принудительного размещения некоторых окон, и, конечно, у вашего оконного менеджера может быть свое собственное средство для принудительного размещения окон.

devilspieпозволяет применять определенные действия к окнам X и может использовать свойства окна X, чтобы различать разные окна и приложения. Ключевое правило для вас будет geometry "<width>x<height>+<xoffset>+<yoffset>".

Тем не менее, вы всегда должны делать расчеты, когда и где другой физический монитор начинается самостоятельно. Но это не так уж сложно и xrandrговорит вам, как и где он использует мониторы в виде "<width>x<height>+<xoffset>+<yoffset>каждой строки, начиная с имени выхода.

Не существует надежного способа «просто будет работать», потому что реализации могут (и делают!) Различаться. wmctrlобычно работает над заголовком окна для определения цели. devilspieтакже может ссылаться на его класс, но я не знаю ни одного инструментария, который позволял бы вам указывать класс X windows, но не его геометрию.

Конечно, вы всегда можете запустить два xephyrэкземпляра и заставить один заполнить левый экран, а другой - правый, а затем обратиться к экранам через DISPLAYпеременную среды, но у этого решения есть и другие недостатки.

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

Тем не менее, если ваш конкретный вариант использования - это ваш эмулятор Android ... который сильно отличается от запроса опции для указания SCREEN=n fooappна оболочке, то это devilspieможет быть то, что вы ищете. Подсказка: я обнаружил, что лучше всего идентифицировать приложения по их классу окна.

Bananguin
источник
Спасибо за объяснение, почему это не простая функция. KWin также имеет правила окна, которые заставляют размещать на другом экране (это то, что я сейчас использую). Хотя по умолчанию нет функции для SCREEN=x app, возможно ли добавить свойство окна таким образом, чтобы оно могло быть отфильтровано KWin?
Лекенстейн
В теории да, но я не знаю ни одного существующего решения для этого. Я думаю, что вы не можете добавить свойства, но вы можете изменить существующие свойства, так что вы можете просто добавить строку в класс окна, который может обнаружить kwin.
Bananguin
Я присудил вам вознаграждение, потому что в противном случае SE предоставит его ответу, получившему наибольшее количество голосов, в то время как ваш ответ лучше описывает проблемы. Текущие ответы все еще не удовлетворяют все же.
Лекенштейн
4

Это конкретное решение для оконного менеджера. Вот как это сделать с помощью kwin, который является оконным менеджером KDE по умолчанию.

Если вы щелкните правой кнопкой мыши на строке заголовка приложения и выберите дополнительные настройки -> специальные настройки приложения.

Перейдите на вкладку «Соответствие окна». Нажмите кнопку «Определить свойства окна». Затем с помощью курсора мыши нажмите на главное окно приложения. Он выберет класс окна и т. Д., А также получит информацию о расположении окна и т. Д.

Затем нажмите на вкладку «Размер и положение». Щелкните Положение ящика и Размер ящика и раскрывающийся список справа от обоих и установите для запоминания.

Затем нажмите ОК.

При следующем запуске приложения оно должно быть того же размера и на том же мониторе.

Я использую это в KDE, чтобы открыть терминал uRxvt на моем левом мониторе в настройке с 3 мониторами, и это работает каждый раз.

Удачи.

очий
источник
Вот как я это делаю прямо сейчас, я надеялся, что есть более простой способ использования envvars.
Лекенштейн
Это правильный ответ для пользователя KDE KWin.
iLikeDirt
3

Это зависит от того, как настроены ваши два монитора.

Если вы используете XINERAMA для того, чтобы оба дисплея выглядели как один для X, вы можете использовать -geometryопцию, чтобы запросить приложения для отображения в определенном месте. Если вы настроили дисплеи как разные экраны, то вы будете использовать DISPLAYдля этого.

Дайте этим попробовать:

$ DISPLAY=0.0 xterm &
$ DISPLAY=0.1 xterm &

Если ваши мониторы имеют экран 0 и 1, это должно вызвать xterm на каждом мониторе.

Casey
источник
2
Я уже пробовал это, но эта конфигурация не относится ко мне, один экран расположен слева от другого. Я обновлю свой вопрос.
Лекенштейн
1
Вы пытались использовать опцию геометрии для приложений, которые ее поддерживают? Задание координаты х> 1600 должно поместить приложение во второе пространство мониторов. Вы также можете попробовать это вне kwin (просто чтобы посмотреть, работает ли он), как в моем опыте kwin и -geometryне всегда работает должным образом.
Кейси
Кейси, приложение, которое я пытаюсь позиционировать, не поддерживает такую ​​опцию (Android emulator, на основе QEMU). Программа открывается там, где находится мой курсор мыши.
Лекенштейн
2

Я сталкивалась с этим способом , который делает использование xdotool, xprop, и wmctrl.

Вот что будет делать следующий скрипт:

  1. Найти активное окно
  2. Получить его развернутое состояние и запомнить его
  3. Удалить максимизацию
  4. Получить его геометрию
  5. Рассчитайте новую позицию
  6. Подвинь это
  7. Максимизировать на основе предыдущего состояния
  8. Поднять его
  9. Вот скрипт, который делает это:

скрипт

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

wid=`xdotool getactivewindow`
max_state=`xprop -id $wid _NET_WM_STATE`

wmctrl -ir $wid -b remove,maximized_vert,maximized_horz
eval `xdotool getwindowgeometry --shell $wid`

new_x=1600
if [[ "$X" -ge "$new_x" ]]; then
  new_x=0
fi

xdotool windowmove $wid $new_x $Y
if [ -z "${max_state/*_NET_WM_STATE_MAXIMIZED_*/}" ]; then
  wmctrl -ir $wid -b add,maximized_vert,maximized_horz
fi

xdotool windowraise $wid

Источник: Xubuntu - перемещение окон между мониторами

SLM
источник
Это работает только после того, как приложение было открыто, не совсем то, что я ищу (хотя для этого можно было бы добавить привязку клавиш). Если я не ошибаюсь, это всегда помещает окно на левую сторону монитора?
Лекенштейн
@Lekensteyn - Да, целью этого решения является запуск приложения AppX, а затем запуск этого cmd для его перемещения. У меня нет двух мониторов 8- (поэтому у меня нет возможности проверить это, я просто нашел его и предоставил здесь детали для оценки. Это вариант, который можно адаптировать, но это «сырое» решение в его текущая форма.
slm
@Lekensteyn - это решение не сильно отличается от вашей SCREEN=2 appXконцепции, кроме как appX; sleep 1; moveWindow.sh.
SLM
@Lekensteyn - также я использовал devilspie, xdotool и т. Д., Чтобы делать точно такие же вещи (в пределах одного окна), этот A дополняет другой, в котором он показывает специфику, где другой только объясняет возможные подходы, но не показывает фактические детали реализации.
SLM
Это будет больше похоже на то, app & sleep 1; moveWindow.shкак программы не отсоединяются. Я не считаю это улучшением по сравнению с использованием оконных правил KWin. +1 за ваши усилия.
Лекенстейн
0

Была похожая проблема. Нашел следующее:

  1. Щелкните правой кнопкой мыши заголовок окна и выберите «Дополнительные действия» -> «Настройки диспетчера окон».
  2. Там выберите «Фокус» в колонке слева.
  3. Переключите опцию «Активный экран следует за мышью».

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

BiberBb
источник
Да, но это не работает, если я хочу сохранить курсор на текущем экране. Я думаю, что это даже вариант по умолчанию, но не все программы уважают его.
Лекенштейн