GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak obnovit okno mimo obrazovku po odpojení druhého monitoru?

Používám Ubuntu 14.04 na svém notebooku u svého stolu s druhým monitorem. Když se bez problémů odpojím od druhého monitoru, moje okno pro Emacs se přesune mimo obrazovku.

Mohu Alt-TAB udělat z Emacsu aktivní okno, a když pracuji naslepo, zastavit Emacs, abych ho mohl restartovat, což způsobí, že se znovu objeví na obrazovce. Ale zdá se mi, že by v Ubuntu měl existovat způsob, jak vrátit okno mimo obrazovku zpět na obrazovku. Existuje?

Samozřejmě lepším řešením by bylo zabránit tomu, aby okna scházela z obrazovky v reakci na odpojení monitoru, a přijal bych řešení to problém.

AKTUALIZACE:

Výstup xrandr při připojení k druhému monitoru:

Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+1280+0 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080      60.0*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 376mm x 301mm
   1280x1024      60.0*+   75.0  
   1280x960       60.0  
   1152x864       75.0  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   640x480        75.0     72.8     66.7     60.0  
   720x400        70.1  
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Výstup xrandr po odpojení od druhého monitoru:

Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080      60.0*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Také jsem se pokusil prohodit levou a pravou pozici okna terminálu a okna Emacs a poté se odpojit. To umožňuje, aby okno Emacs zůstalo na obrazovce po odpojení od druhého monitoru. A okno Terminálu přežije v pozici, která eliminovala Emacs. Zdá se tedy, že aplikace s tím má něco společného.

Přijatá odpověď:

Přesuňte všechna okna do viditelné oblasti

Jak je navrženo/požadováno v komentáři, níže uvedený skript přesune všechna „normální“ okna do viditelné oblasti na aktuálním pracovním prostoru.

Řešením je řešení; informace na obrazovce se aktualizují správně, vzhledem k rozdílu ve výstupu xrandr , před a a po odpojení. Důvod, proč se okna sama nepohybují, je (momentálně) neznámý, pokud problém nevyřeší jiná odpověď.

Skript

#!/usr/bin/env python3
import subprocess

# get the resolution of the screen (+0+0)
res = [
    int(n) for n in [
        s.split("+")[0].split("x")\
        for s in subprocess.check_output(["xrandr"]).decode("utf-8").split()\
        if "+0+0" in s][0]
    ]
# create list of windows
w_list = [w.split() for w in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
# filter only "normal" ones
valid = [
    w for w in w_list if "_NET_WM_WINDOW_TYPE_NORMAL" in\
    subprocess.check_output(["xprop", "-id", w[0]]).decode("utf-8")
    ]
# get the number of valid windows and calculate a targeted position
# the targeted position is a hunch, it will be exact if the window fits completely inside the resolution
# it will work anyway
parts = len(valid)+2
positions = [(int(n*res[0]/parts), int(n*res[1]/parts)) for n in list(range(parts))[1:-1]]
# unmaximaize, move the windows to the visible area (current workspace)
for i, w in enumerate(valid):
    subprocess.Popen(["wmctrl", "-ir", w[0], "-b", "remove,maximized_vert,remove,maximized_horz"])
    # weird, but sometimes wmctrl refuses to move a window if it is not resized first (?)
    subprocess.Popen(["wmctrl", "-ir", w[0], "-e", "0,200,200,200,200"])      
    subprocess.Popen(["wmctrl", "-ir", w[0], "-e", (",").join(["0", str(positions[i][0]), str(positions[i][1]),w[4],w[5]])])

Jak používat

  1. Skript potřebuje wmctrl :

    sudo apt-get install wmctrl
    
  2. Zkopírujte skript do prázdného souboru a uložte jej jako move_windows.py

  3. Vyzkoušejte to:otevřete několik oken, umístěte je na různé pracovní plochy atd. nebo zkuste odpojit druhý monitor. Poté spusťte příkaz:

    python3 /path/to/move_windows.py
    

    Všechna „normální“ okna by se měla přesunout do viditelné oblasti aktuálního pracovního prostoru.

  4. Pokud vše funguje dobře, přidejte ji ke klávesové zkratce:zvolte:Nastavení systému> „Klávesnice“> „Zkratky“> „Vlastní zkratky“. Klikněte na „+“ a přidejte příkaz:

    python3 /path/to/move_windows.py
    

Nyní byste měli být schopni přesunout všechna okna do viditelné oblasti na aktuální pracovní ploše pomocí vaší klávesové zkratky.

Související:Kvm Network Bridge k přiřazení statické IP adresy v Ubuntu?
Ubuntu
  1. Jak obnovit/ukončit relaci Ssh po ztrátě připojení?

  2. Dvě obrazovky X, jak dostat správce oken na druhou obrazovku?

  3. Jak opravit Hibernate?

  1. Jak obnovit data Xfs po Rm?

  2. Jak obnovit po smazání symbolického odkazu libc.so.6?

  3. Jak zabránit změně MAC adresy po odpojení?

  1. Jak se zotavit poté, co Kate havaruje?

  2. Jak zobrazit seznam připojených monitorů pomocí Xrandr?

  3. Jak zakázat automatickou konfiguraci monitoru?