C'è un modo per impedire alle finestre di muoversi quando è collegato un monitor esterno?


9

Quindi, sto usando Ubuntu 14.10 sul mio laptop e ogni tanto lo collego alla mia TV per un secondo schermo. La mia TV è a sinistra della mia scrivania. Quando lo abilito come monitor esterno a sinistra dello schermo del mio laptop, tutte le finestre che erano sullo schermo del mio laptop si spostano sullo schermo della TV. Posso spostarli indietro, ma è davvero fastidioso doverlo fare ogni volta, specialmente quando ci sono più finestre aperte.

TV a sinistra

Le finestre non si muovono, tuttavia, se imposto lo schermo della TV a destra dello schermo del laptop (praticamente). Ma questo è comprensibilmente confuso da usare poiché è l'opposto della configurazione fisica. Inoltre, non voglio spostare la mia scrivania.

TV a destra

Sembra che Ubuntu o il server di visualizzazione presumano semplicemente che il monitor più a sinistra sia quello principale e dove dovrebbero essere tutte le finestre. C'è un modo per disabilitare questo comportamento?

Ho controllato questi forum ma non ho visto nessuno postare su questo. Il thread più vicino che ho trovato è stato questo, anche se non è proprio lo stesso problema.

Fai in modo che Ubuntu NON sposti Windows quando spegni uno di più monitor

Qualcuno ha qualche idea? Per favore fatemi sapere se lo fate. Grazie!

Risposte:


2

Non ho trovato un'impostazione "segreta" per modificare il comportamento del comportamento, a quanto sembra, progettato. Sembra infatti che lo schermo di sinistra sia considerato lo schermo di "base".

È comunque molto possibile creare una soluzione alternativa, con essenzialmente lo stesso risultato. È possibile creare uno script che, in occasione della connessione di una seconda schermata, elenca tutte le finestre. Successivamente, tutte le finestre che vengono spostate inizialmente sullo schermo di sinistra, vengono spostate di nuovo sullo schermo di destra, entro un secondo o due. Le dimensioni di tutte le finestre verranno mantenute.
Questo è ciò che fa lo script qui sotto.

Due versioni

Puoi ripristinare le finestre organizzate in due modi:

  • Occasionalmente, con un tasto di scelta rapida da eseguire dopo aver collegato la seconda schermata.
  • Automaticamente, eseguendo lo script in background, in attesa che lo schermo sia collegato.

Come usare

preparativi

  • Installare wmctrl

    sudo apt-get install wmctrl

  • Cerca i nomi dei tuoi due schermi con l'aiuto di xrandr, i nomi degli schermi saranno appena prima della parola "connesso".

  • Copia Uno dei seguenti script, nella sezione head, sostituisce in queste due righe i nomi delle schermate con quelli corretti:

    screen_1 = "LVDS1"     # your main screen (laptop)
    screen_2 = "VGA1"      # secundary screen (on the left)
    

    salva lo script come move_windows.py

  • Assicurati che nelle impostazioni di visualizzazione la schermata secondaria sia a sinistra. Le linee superiori delle due schermate devono essere allineate (come nella prima immagine della domanda).

Esegui lo script
: se si utilizza quello per l'esecuzione occasionale, eseguirlo dopo aver collegato la seconda schermata.

    python3 /path/to/move_windows.py

Potresti volerlo aggiungere a una scorciatoia da tastiera se pensi che faccia quello che dovrebbe fare, Scegli: Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate". Fai clic su "+" e aggiungi il comando:

  • Se si utilizza quello per l'esecuzione in background, eseguirlo anche con il comando:

    python3 /path/to/move_windows.py
    

    Se funziona come previsto, aggiungilo alle applicazioni di avvio: Dash> Applicazioni di avvio> Aggiungi

Ho testato la sceneggiatura con il mio laptop (a destra) e due diversi schermi (a sinistra). Il risultato è stato lo stesso.

schermo del computer portatile

inserisci qui la descrizione dell'immagine

connettersi senza script

inserisci qui la descrizione dell'immagine

connettersi con lo script in esecuzione

inserisci qui la descrizione dell'immagine

Dopo che lo script ha fatto il suo lavoro, Windows sarà "lasciato solo" (ovviamente) e potrai sistemare le finestre a modo tuo.

La sceneggiatura

1. Versione "Manuale", da eseguire dopo aver collegato lo schermo

#!/usr/bin/env python3
import subprocess
import time

#--
screen_2 = "LVDS1"       # replace with your internal screen (right)
screen_2 = "VGA1"        # replace with your external screen (left)
#--

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shift(xr_output):
    lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows(shift):
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    relevant = []
    for w in w_data:
        props = get("xprop -id "+w[0])
        if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])

shift_windows(get_shift(get("xrandr")))

2. Versione automatica, per l'esecuzione in background

#!/usr/bin/env python3
import subprocess
import time

#--
screen_2 = "LVDS1"       # replace with your internal screen (right)
screen_2 = "VGA1"        # replace with your external screen (left)
#--

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shift(xr_output):
    lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows(shift):
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    relevant = []
    for w in w_data:
        props = get("xprop -id "+w[0])
        if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])

while True:
    try:
        screen_info1 = get("xrandr")
        time.sleep(5)
        screen_info2 = get("xrandr")
        check = screen_2+" connected"
        if (check in screen_info1, check in screen_info2) == (False, True):
            time.sleep(5)
            shift_windows(get_shift(screen_info2))
    except:
        pass

Abilità seriamente malate, Jacob!
don.joey,

@ K0j0 Sei riuscito?
Jacob Vlijm,

@JacobVlijm Non sono sicuro che il polling ogni 5 secondi sia la soluzione migliore (non esiste una possibilità guidata dagli eventi?). Ad ogni modo, se sei interessato a trasformare questo script in un indicatore Unity ( come questi qui ), ti preghiamo di contattarci.
Peterino,

@Peterino Se esiste un segnale guidato dagli eventi, sarebbe la mia prima scelta. Allo stesso tempo: se uno script in background è ben scritto, il suo onere aggiuntivo dovrebbe (e può) essere praticamente nessuno, e testerò sempre i miei script in modo specifico. Gestisco personalmente un numero variabile di script in background. Anche tutti insieme non hanno alcun effetto evidente. Ricorda che numerosi loop sono in esecuzione per definizione sul tuo sistema. Informazioni sul suggerimento dell'indicatore Unity: Sono decisamente interessato a imparare a creare un indicatore, sia per questa che per un'altra situazione :).
Jacob Vlijm,

@JacobVlijm Sembra che il posizionamento automatico di Windows avverrà automaticamente a partire da una delle prossime versioni di Ubuntu ("work in progress"), secondo una fonte di Canonical . Probabilmente non vale la pena investire nei restanti pochi mesi nella versione attuale. Però ricontrollerò con gli sviluppatori Mir su IRC # ubuntu-mir @ freenode.
Peterino,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.