XFCE – Отправить окно на другой монитор с помощью клавиши

Вопрос или проблема

Я использую 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
  1. менеджер настроек -> клавиатура -> сочетания приложений
  2. Нажмите “Добавить”
  3. Нажмите “Открыть” и укажите путь к вашему скрипту
  4. Назначьте ему сочетание клавиш, и вуаля!

Теперь у вас есть сочетание клавиш для переключения окна с одного экрана на другой. Я не уверен, как это работает с более чем двумя экранами.

Я внес некоторые изменения в указанный выше скрипт, изначально написанный 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. Эти программы позволяют управлять фокусом и положением окон через скрипты, что делает возможным создание пользовательских решений для управления окнами.

Пример

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

  1. Установка необходимых утилит: Для начала, установим xdotool и wmctrl, которые необходимы для управления окнами:

    sudo apt-get install xdotool wmctrl
  2. Скачивание и настройка скрипта: Скачайте и настройте Bash-скрипт, который будет выполнять перемещение окна. Например, можно воспользоваться скриптом от пользователя jc00ke, который доступен на GitHub.

  3. Настройка прав и создание шортката:

    • Сохраните скрипт под именем 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 с помощью горячих клавиш можно реализовать посредством различных методов, в зависимости от ваших потребностей и технических предпочтений. Независимо от выбранного метода, важно помнить о том, что правильно настроенное рабочее пространство не только повышает продуктивность, но и делает использование компьютера более удобным и приятным.

Оцените материал
Добавить комментарий

Капча загружается...