XFCE - Отправить окно на другой монитор при нажатии клавиши


27

Я использую Xubuntu 11.10 с настройкой двух мониторов. Я ищу, чтобы создать нажатие клавиши (возможно, CTRL+ ALT+, SPACEкоторый позволит мне отправить выбранное окно на следующий монитор.

В GNOME есть пакет, swapmonitorкоторый может отправить окно на другой монитор. Вызов этой программы нажатием клавиши дает тот же эффект.

Как это делается в XFCE / Xubuntu?


У вас нет доступа к swapmonitorпод Xubuntu? Или вы спрашиваете, как установить для него сочетание клавиш?
ire_and_curses

Кажется, он не работает на XFCE. Хотя хотелось бы узнать какие варианты есть.
гроб

Как вы настроили несколько мониторов? Как большой виртуальный экран или отдельные X-дисплеи? Вы используете nvidia twinview?
Кит

Это TwinView. У меня есть старая карта Nvidia GeForce с 2 19-
дюймовыми

Ответы:


27

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

Запустите эти команды

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. Назначьте ему сочетание клавиш и вуаля!

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


Связанный скрипт имел эту проблему для меня: github.com/jc00ke/bin/issues/1
thejoshwolfe

1
Пока у меня все в порядке с Mint 17.3 и xfce 4.12, видеокартой ATI и тремя мониторами. Не видеть проблему максимизации Джошволфа в моей системе. Спасибо за советы!
ether_joe

1
@thejoshwolfe Я добавил свою версию сценария, которая решает проблему максимизации для меня.
JBrock

1
@ether_joe Я добавил свою версию скрипта, которая может вам пригодиться, если у вас есть три монитора.
JBrock

Я в XFCE, и это зло. Он только переместит окно с левого монитора вправо, и однажды мой рабочий стол приведёт в действительно странное состояние.
Сава Б.

10

Я внес некоторые изменения в вышеупомянутый скрипт, изначально созданный jc00ke.
- Шахта настроена на три монитора.
- Он поддерживает, было ли окно развернуто или нет.
- Используется для перемещения окна влево или вправо с использованием script-name -lи script-name -rсоответственно.
- Я добавил исправление, при котором приложения Chromium, когда они свернуты, очень малы и больше не максимизируются на новом мониторе.
Я переписывался с jc00ke. Хотя это отлично работает на Xfce, он сказал, что у него есть проблемы со сценарием в Unity. Конечно, для других сред рабочего стола, таких как Unity, этот сценарий не понадобится, поскольку такие параметры встроены в оконный менеджер.
Чтобы использовать скрипт сделайте его исполняемым chmod +x script-nameи установить следующие две программы, sudo apt-get install xdotool wmctrl.

#!/bin/bash
#
# Move the current window to the next monitor.
#
# Also works only on one X screen (which is the most common case).
#
# Props to
# http://icyrock.com/blog/2012/05/xubuntu-moving-windows-between-monitors/
#
# Unfortunately, both "xdotool getwindowgeometry --shell $window_id" and
# checking "-geometry" of "xwininfo -id $window_id" are not sufficient, as
# the first command does not respect panel/decoration offsets and the second
# will sometimes give a "-0-0" geometry. This is why we resort to "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)) ;;
esac

# Remember if it was maximized.
window_state=$(xprop -id $window_id _NET_WM_STATE | awk '{ print $3 }')

# Un-maximize current window so that we can move it
wmctrl -ir $window_id -b remove,maximized_vert,maximized_horz

# Read window position
x=$(xwininfo -id $window_id | awk '/Absolute upper-left X:/ { print $4 }')
y=$(xwininfo -id $window_id | awk '/Absolute upper-left Y:/ { print $4 }')

# Subtract any offsets caused by window decorations and panels
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))

# Fix Chromium app view issue of small un-maximized size
width=$(xdotool getwindowgeometry $window_id | awk -F" |x" '/Geometry:/ { print $4 }')
if [ "$width" -lt "150" ]; then
  display_width=$((display_width + 150))
fi

# Compute new X position
new_x=$((x + display_width))
# Compute new Y position
new_y=$((y + screen_height))

# If we would move off the right-most monitor, we set it to the left one.
# We also respect the window's width here: moving a window off more than half its width won't happen.
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

# Don't move off the left side.
if [ $new_x -lt 0 ]; then
  new_x=0
fi

# Don't move off the bottom
if [ $new_y -lt 0 ]; then
  new_y=0
fi

# Move the window
xdotool windowmove $window_id $new_x $new_y

# Maintain if window was maximized or not
if [ "${window_state}" = "_NET_WM_STATE_MAXIMIZED_HORZ," ]; then
    wmctrl -ir $window_id -b add,maximized_vert,maximized_horz
fi

7

Я также создал свой собственный скрипт Python для перемещения окон между мониторами.

https://github.com/calandoa/movescreen

Использование:

movescreen.py <up|down|left|right>

Интересные особенности:

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

1

Другая альтернатива, которая не зависит от какой-либо «двоичной» зависимости (например, xdotool или wmctrl): https://github.com/AlexisBRENON/ewmh_m2m

  • Вы можете установить его с помощью pip(не нужно копировать его вручную, сделать его исполняемым и т. Д.)
  • Он обрабатывает несколько экранов с разным расположением (горизонтальный, вертикальный, смешанный)
  • Сохраняйте соотношение окна / экрана при перемещении между экранами разных размеров
  • Восстановить развернутые состояния (горизонтальный, вертикальный)

Добрый.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.