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.