Вопрос или проблема
Я использую Xubuntu 11.10 с настройкой с двумя мониторами. Я ищу способ создать сочетание клавиш (может быть, CTRL + ALT + SPACE), которое позволит отправлять выбранное окно на следующий монитор.
В GNOME есть пакет под названием swapmonitor
, который способен отправить окно на другой монитор. Вызов этой программы с помощью сочетания клавиш дает тот же эффект.
Как это сделать в XFCE/Xubuntu?
Данное сообщение было опубликовано какое-то время назад, и я уверен, что вы уже получили ответ, но для тех, кто еще не получил.
Запустите эти команды
sudo apt-get install xdotool
sudo apt-get install wmctrl
Затем скачайте bash-скрипт по следующей ссылке (автор — jc00ke)https://github.com/jc00ke/move-to-next-monitor
Лично у меня есть директория в корне, где я храню все свои личные скрипты. Однако, где вы его скачаете, зависит от вас. Измените права доступа, чтобы вы могли его выполнить. Например, сохраните скрипт как move-to-next-monitor.sh и выполните следующее
chmod 755 move-to-next-monitor.sh
- менеджер настроек -> клавиатура -> сочетания приложений
- Нажмите “Добавить”
- Нажмите “Открыть” и укажите путь к вашему скрипту
- Назначьте ему сочетание клавиш, и вуаля!
Теперь у вас есть сочетание клавиш для переключения окна с одного экрана на другой. Я не уверен, как это работает с более чем двумя экранами.
Я внес некоторые изменения в указанный выше скрипт, изначально написанный jc00ke.
- Мой скрипт настроен для трех мониторов.
- Он сохраняет, было ли окно максимизировано или нет.
- Он используется для перемещения окна влево или вправо с помощью команды
script-name -l
иscript-name -r
соответственно. - Если у вас два монитора, вы используете
script-name -a
. - Я добавил исправление, когда приложения Chromium, будучи свернутыми, слишком малы и не разворачиваются на новом мониторе.
Я переписывался с jc00ke. Хотя это отлично работает на Xfce, он сказал, что у него были проблемы с его скриптом в Unity. Конечно, для других окружений рабочего стола, таких как Unity, этот скрипт не нужен, потому что такие опции встроены в оконный менеджер.
Чтобы использовать скрипт, сделайте его исполняемымchmod +x script-name
и установите следующие две программы,sudo apt install xdotool wmctrl
.
#!/bin/bash
#
# Перемещение текущего окна на следующий монитор.
#
# Также работает только на одном X экране (что является наиболее распространенным случаем).
#
# Спасибо
# http://icyrock.com/blog/2012/05/xubuntu-moving-windows-between-monitors/
#
# К сожалению, "xdotool getwindowgeometry --shell $window_id" и
# проверка "-geometry" в "xwininfo -id $window_id" недостаточны, так как
# первая команда не учитывает смещения панелей/украшений, а вторая
# иногда дает "геометрию -0-0". Именно поэтому мы используем "xwininfo".
screen_width=$(xdpyinfo | awk -F" |x" '/dimensions:/ { print $7 }')
screen_height=$(xdpyinfo | awk -F" |x" '/dimensions:/ { print $8 }')
window_id=$(xdotool getactivewindow)
case $1 in
-l )
display_width=$((screen_width / 3 * 2))
;;
-r )
display_width=$((screen_width / 3))
;;
-a )
display_width=$((screen_width / 2))
;;
esac
# Запомнить, было ли окно максимизировано.
window_state=$(xprop -id $window_id _NET_WM_STATE | awk '{ print $3 }')
# Размаксимизировать текущее окно, чтобы мы могли его переместить
wmctrl -ir $window_id -b remove,maximized_vert,maximized_horz
# Прочитать позицию окна
x=$(xwininfo -id $window_id | awk '/Absolute upper-left X:/ { print $4 }')
y=$(xwininfo -id $window_id | awk '/Absolute upper-left Y:/ { print $4 }')
# Вычесть любые смещения, вызванные украшениями окон и панелями
x_offset=$(xwininfo -id $window_id | awk '/Relative upper-left X:/ { print $4 }')
y_offset=$(xwininfo -id $window_id | awk '/Relative upper-left Y:/ { print $4 }')
x=$((x - x_offset))
y=$((y - y_offset))
# Исправить проблему с малым размером несвернутого окна в Chromium
width=$(xdotool getwindowgeometry $window_id | awk -F" |x" '/Geometry:/ { print $4 }')
if [ "$width" -lt "150" ]; then
display_width=$((display_width + 150))
fi
# Вычислить новую X позицию
new_x=$((x + display_width))
# Вычислить новую Y позицию
new_y=$((y + screen_height))
# Если мы переместим за пределы правого монитора, установим его на левый.
# Мы также учитываем ширину окна здесь: перемещение окна за пределы более чем половины его ширины не произойдет.
if [ $((new_x + width / 2)) -gt $screen_width ]; then
new_x=$((new_x - screen_width))
fi
height=$(xdotool getwindowgeometry $window_id | awk -F" |x" '/Geometry:/ { print $5 }')
if [ $((new_y + height / 2)) -gt $screen_height ]; then
new_y=$((new_y - screen_height))
fi
# Не двигаться за пределы левой стороны.
if [ $new_x -lt 0 ]; then
new_x=0
fi
# Не двигаться за пределы нижней стороны
if [ $new_y -lt 0 ]; then
new_y=0
fi
# Переместить окно
xdotool windowmove $window_id $new_x $new_y
# Сохранить, было ли окно максимизировано
if [[ "${window_state}" == _NET_WM_STATE_MAXIMIZED* ]]; then
wmctrl -ir $window_id -b add,maximized_vert,maximized_horz
fi
Я также создал свой собственный скрипт на Python для перемещения окон между мониторами.
https://github.com/calandoa/movescreen
Использование:
movescreen.py <up|down|left|right>
Интересные особенности:
- обработка четырех направлений
- обработка некоторых особых случаев, таких как окна, перекрывающие несколько мониторов
- восстановление независимо состояний полный экран, максимизирован по горизонтали и по вертикали
- отладка или добавление новых функций легко с помощью Python.
Другая альтернатива, не полагающаяся на какие-либо “бинарные” зависимости (например, xdotool или wmctrl): https://github.com/AlexisBRENON/ewmh_m2m
- Вы можете установить его с помощью
pip
(нет необходимости копировать вручную, делать исполняемым и т. д.) - Он поддерживает несколько экранов с разными макетами (горизонтальный, вертикальный, смешанный)
- Сохранять соотношение окна/экрана при перемещении между экранами разного размера
- Восстановление максимально возможных состояний (по горизонтали, по вертикали)
С уважением.
Я использую Xfce 4.18 на Debian (Bookworm). Чтобы переместить окно с одного монитора на другой, перейдите в Настройки > Управление окнами > Клавиатура. Здесь указаны опции для перемещения окна влево, вправо, вверх и вниз, все, что вам нужно сделать, это выбрать нужное движение, нажать “Изменить” внизу и слева, затем нажмите нужное сочетание клавиш.
Ответ или решение
Для пользователей XFCE и Xubuntu, которые желают автоматизировать процесс перемещения окон между несколькими мониторами с помощью горячих клавиш, существует несколько подходов и решений. Рассмотрим, как это можно реализовать, используя командную строку и инструменты для управления окнами в среде XFCE.
Теория
XFCE — это легковесная и гибкая среда рабочего стола, которая предоставляет пользователям возможность настроить рабочее пространство под свои нужды. Однако в стандартной комплектации XFCE нет встроенных средств для перемещения окон между мониторами с помощью одной горячей клавиши. Для этого часто используются сторонние утилиты такие как xdotool
и wmctrl
. Эти программы позволяют управлять фокусом и положением окон через скрипты, что делает возможным создание пользовательских решений для управления окнами.
Пример
Решение на основе скрипта, который позволяет перемещать окна между мониторами, может быть реализовано следующим образом:
-
Установка необходимых утилит: Для начала, установим
xdotool
иwmctrl
, которые необходимы для управления окнами:sudo apt-get install xdotool wmctrl
-
Скачивание и настройка скрипта: Скачайте и настройте Bash-скрипт, который будет выполнять перемещение окна. Например, можно воспользоваться скриптом от пользователя
jc00ke
, который доступен на GitHub. -
Настройка прав и создание шортката:
- Сохраните скрипт под именем
move-to-next-monitor.sh
и сделайте его исполняемым:
chmod 755 move-to-next-monitor.sh
- Откройте "Настройки клавиатуры" в XFCE (Settings Manager -> Keyboard -> Application Shortcuts). Добавьте новый шорткат, указав путь к вашему скрипту и выбрав желаемую комбинацию клавиш, например,
CTRL + ALT + SPACE
.
- Сохраните скрипт под именем
Применение
После настройки необходимо протестировать работу скрипта, чтобы убедиться, что окно действительно перемещается на другой монитор при нажатии заданной комбинации клавиш. Это решение особенно полезно в случаях, когда приходится часто переключаться между мониторами и нужно поддерживать порядок на рабочем пространстве.
Кроме этого, вы можете настроить данный скрипт для работы с тремя и более мониторами, добавив дополнительные логические проверки в скрипт. Также можно использовать Python для создания более сложных скриптов, которые могут учитывать больше факторов, такие как состояния окон (максимизированные, полные экраны и т. д.) и топология дисплея.
Альтернативные решения
Если вы ищете более гибкое и расширяемое решение, стоит рассмотреть использование Python-скрипта, такого как movescreen.py
, который предоставляет более богатый функционал и возможность настройки. Этот скрипт можно настроить для движения окон в четырех направлениях (вверх, вниз, влево, вправо), а также для обработки особых случаев, таких как окна, пересекающие несколько мониторов.
Еще одним возможным решением может быть установка пакета ewmh_m2m
, который не требует установки бинарных зависимостей и может быть установлен через pip
. Этот пакет способен обрабатывать экраны с различными компоновками и размерами и сохраняет отношения размеров окна.
Заключение
Перемещение окон между мониторами в XFCE с помощью горячих клавиш можно реализовать посредством различных методов, в зависимости от ваших потребностей и технических предпочтений. Независимо от выбранного метода, важно помнить о том, что правильно настроенное рабочее пространство не только повышает продуктивность, но и делает использование компьютера более удобным и приятным.