XFCE - Wyślij okno do innego monitora po naciśnięciu klawisza


27

Używam Xubuntu 11.10 z konfiguracją podwójnego monitora. Chcę utworzyć naciśnięcie klawisza (może CTRL+ ALT+, SPACEco pozwoli mi wysłać wybrane okno do następnego monitora).

W GNOME istnieje pakiet o nazwie, swapmonitorktóry może wysłać okno do drugiego monitora. Wywołanie tego programu jednym naciśnięciem klawisza osiąga ten sam efekt.

Jak to się robi w XFCE / Xubuntu?


Nie masz dostępu do swapmonitorXubuntu? A może pytasz, jak ustawić skrót klawiaturowy?
— ire_and_curses,

Wygląda na to, że nie działa na XFCE. Chociaż chciałbym wiedzieć, jakie są dostępne opcje.
— boffin

Jak skonfigurowano wiele monitorów? Jako duży wirtualny ekran lub osobne wyświetlacze X? Czy używasz nvidii twinview?
— Keith

To jest TwinView. Mam starą kartę Nvidia GeForce z 2 monitorami Dell 19 "
— boffin

Odpowiedzi:


27

Zostało to opublikowane jakiś czas temu i jestem pewien, że otrzymałeś już odpowiedź, ale dla tych, którzy jej nie otrzymali.

Uruchom te polecenia

sudo apt-get install xdotool
sudo apt-get install wmctrl

Następnie pobierz skrypt bash z następującego linku (kredyt dla jc00ke) https://github.com/jc00ke/move-to-next-monitor

Osobiście mam katalog w katalogu głównym, w którym przechowuję wszystkie osobiste skrypty. Jednak to, gdzie pobierzesz, zależy od Ciebie. Zmień go, aby mieć uprawnienia do wykonywania. Na przykład zapisz skrypty jako move-to-next-monitor.sh, a następnie wykonaj następujące czynności

chmod 755 move-to-next-monitor.sh
  1. Menedżer ustawień -> klawiatura -> skróty do aplikacji
  2. Kliknij Dodaj
  3. Kliknij Otwórz i skieruj go do skryptu
  4. Przypisz do niego skrót klawiaturowy i voilà!

Teraz masz skrót klawiaturowy, aby przełączyć okno z jednego ekranu na inny. Nie jestem pewien, jak to działa z więcej niż 2 ekranami.


Połączony skrypt miał dla mnie ten problem: github.com/jc00ke/bin/issues/1
— thejoshwolfe

1
Do tej pory działało mi dobrze z Mint 17.3 i Xfce 4.12, kartą graficzną ATI i trzema monitorami. Nie widzę problemu maksymalizacji w joshwolfe w moim systemie. Dzięki za wskazówki!
— ether_joe

1
@thejoshwolfe Dodałem moją wersję skryptu, która rozwiązuje dla mnie problem maksymalizacji.
— jbrock

1
@ether_joe Dodałem moją wersję skryptu, która może ci pomóc, ponieważ masz trzy monitory.
— jbrock

Jestem w Xfce, a ta rzecz jest zła. Przesunie tylko okno z lewego monitora w prawo i raz wprowadzi mój pulpit w naprawdę dziwny stan.
— Sava B.,

10

Dokonałem pewnych zmian w wyżej wspomnianym skrypcie, pierwotnie autorstwa jc00ke.
- Mój jest ustawiony na trzy monitory.
- Utrzymuje, czy okno zostało zmaksymalizowane, czy nie.
- Służy do przesuwania okna w lewo lub w prawo przy użyciu script-name -li script-name -rodpowiednio.
- Dodałem poprawkę, w której zminimalizowane aplikacje Chromium są bardzo małe i nie będą się maksymalizować na nowym monitorze.
Korespondowałem z jc00ke. Chociaż działa to świetnie na Xfce, powiedział, że ma problemy ze skryptem w Unity. Oczywiście inne środowiska pulpitu, takie jak Unity, nie potrzebują tego skryptu, ponieważ takie opcje są wbudowane w menedżera okien.
Aby użyć skryptu make to wykonywalne chmod +x script-namei zainstalować następujące dwa programy 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

Stworzyłem również własny skrypt Pythona do przenoszenia okien między monitorami.

https://github.com/calandoa/movescreen

Stosowanie:

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

Ciekawe funkcje:

  • obsłużyć 4 kierunki
  • obsłużyć niektóre specjalne przypadki, takie jak okna nakładające się na kilka monitorów
  • przywrócić niezależnie na pełnym ekranie , maksymalne poziomo i pionowo stany
  • łatwe debugowanie lub dodawanie nowych funkcji za pomocą Pythona.

1

Inna alternatywa, która nie opiera się na żadnej „binarnej” zależności (np. Xdotool lub wmctrl): https://github.com/AlexisBRENON/ewmh_m2m

  • Możesz go zainstalować przy pomocy pip(nie trzeba go kopiować ręcznie, aby był wykonywalny itp.)
  • Obsługuje wiele ekranów o różnych układach (poziomy, pionowy, mieszany)
  • Zachowaj proporcje okna / ekranu podczas przechodzenia między ekranami o różnych rozmiarach
  • Przywróć zmaksymalizowane stany (poziomy, pionowy)

Uprzejmy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.