Come posso aprire una finestra su un monitor diverso?


9

Con più monitor, finora ho trascinato le finestre manualmente. C'è un modo per aprire una finestra su uno schermo specifico in una configurazione a doppia testa? (Da non confondere con più display del server X.)

Qualcosa del tipo: SCREEN=2 firefoxo open-in-screen 2 firefox.

Se è importante, il mio ambiente è KDE usando il gestore delle finestre di KWin. Le regole della finestra di KWin possono corrispondere solo ad alcune proprietà come il titolo, ma non sono riuscito a trovare una variabile d'ambiente come filtro.

Il display secondario estende la schermata principale:

$ xrandr -q
Screen 0: minimum 320 x 200, current 3520 x 1080, maximum 32767 x 32767
LVDS1 connected 1600x900+0+0 (normal left inverted right x axis y axis) 382mm x 214mm
   1600x900       60.1*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+1600+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080      60.0*    50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)

2
Di solito, suggerirei di usarlo kstartper questo, ma sembra kstartsupportare solo la definizione di un desktop specifico, ma non uno schermo su cui avviare l'applicazione. Probabilmente vale la pena segnalare un bug report su bugs.kde.org .
Elias Probst,

Ottimo consiglio kstart, volevo anche saperlo. Il comando è: kstart --desktop $N firefoxdove $Nè un numero compreso tra 1 e il numero totale di desktop virtuali .
Lekensteyn,

Per quanto riguarda kstart, c'è anche un bugreport su bugs.kde.org che richiede questa funzione.
Elias Probst,

Che strano, ho visto un post su wmctrl oggi, ma non ho avuto la possibilità di testarlo. Perché è stato cancellato?
Lekensteyn,

Non ho idea del post di wmctrl, non l'ho visto.
Elias Probst,

Risposte:


5

No, non puoi farlo direttamente. Nell'architettura X, i due monitor fisici visualizzati non sono riconoscibili dalle applicazioni. Puoi solo aggirare questa astrazione, determinando quali aree dell'area di lavoro visibile corrispondono a quale monitor e quindi posizionano le finestre con l'offset corretto.

I toolkit sensibili supportano -geometryun'opzione che consente all'applicazione di richiedere di essere posizionata in una posizione specifica. Se questa opzione non è disponibile, è possibile utilizzare wmctrlse si dispone di un X Window Manager compatibile con EWMH / NetWM per spostare e ridimensionare le finestre già esistenti (vedere wmctrl (1), sono necessarie opzioni -re -e). Uso devilspieper forzare il posizionamento di alcune finestre e, naturalmente, il gestore delle finestre prescelto potrebbe avere una propria struttura per forzare il posizionamento delle finestre.

devilspieconsente di applicare determinate azioni su X windows e può utilizzare le proprietà di X window per discernere diverse finestre e applicazioni. La regola chiave per te sarebbe geometry "<width>x<height>+<xoffset>+<yoffset>".

Tuttavia, devi sempre fare i calcoli di quando e dove inizia un altro monitor fisico. Ma questo non è troppo difficile e xrandrti dice come e dove utilizza i monitor sotto forma di "<width>x<height>+<xoffset>+<yoffset>ogni linea che fissa con un nome di output.

Non esiste un metodo infallibile, perché le implementazioni possono (e fare!) Variare. wmctrldi solito funziona sul titolo della finestra per identificare l'obiettivo. devilspieposso anche fare riferimento alla sua classe, tuttavia, non sono a conoscenza di alcun toolkit che ti consenta di specificare una classe X windows ma non la sua geometria.

Ovviamente potresti sempre avviare due xephyristanze e fare in modo che una riempia la schermata sinistra e l'altra la schermata destra e quindi indirizzi le schermate tramite la DISPLAYvariabile d'ambiente, ma questa soluzione ha altri aspetti negativi.

In teoria, l'autorità che governa il posizionamento delle finestre è il gestore delle finestre. Di conseguenza, se vuoi cose che il tuo window manager non può fare, sarà confuso ed è anche il motivo per cui non esiste un modo generico per farlo.

Tuttavia, se il tuo caso d'uso concreto è l'emulatore Android ... che è molto diverso dal chiedere l'opzione da specificare SCREEN=n fooappsulla shell, allora devilspiepotrebbe essere quello che stai cercando. Suggerimento: ho scoperto che è meglio identificare le applicazioni in base alla loro classe di finestre.


Grazie per aver spiegato perché questa non è una funzione facile. KWin ha anche regole per le finestre che impongono il posizionamento su uno schermo diverso (che è quello che uso ora). Anche se non esiste una funzione predefinita per SCREEN=x app, è possibile aggiungere una proprietà della finestra in questo modo in modo che possa essere filtrata da KWin?
Lekensteyn,

In teoria sì, ma non sono a conoscenza di alcuna soluzione esistente per questo. Penso che non puoi aggiungere proprietà ma puoi modificare le proprietà esistenti, quindi potresti semplicemente aggiungere una stringa alla classe della finestra che kwin potrebbe rilevare.
Bananguin,

Ti ho assegnato la generosità perché SE l'avrebbe altrimenti concessa alla risposta più votata mentre la tua risposta descrive meglio i problemi. Tuttavia, le risposte attuali non sono ancora soddisfacenti.
Lekensteyn,

4

Questa è una soluzione specifica per il gestore delle finestre. Ecco come farlo con kwin che è il gestore delle finestre predefinito di KDE.

Se fai clic con il tasto destro sulla barra del titolo dell'applicazione e selezioni altre impostazioni -> impostazioni speciali dell'applicazione.

Vai alla scheda Abbinamento finestre. Fare clic sul pulsante Rileva proprietà finestra. Quindi con il cursore del mouse fare clic sulla finestra principale dell'applicazione. Seleziona la classe della finestra ecc. E ottiene anche informazioni sul posizionamento della finestra ecc.

Quindi fare clic sulla scheda Dimensioni e posizione. Fare clic sulla casella Posizione e casella Dimensioni e casella a discesa a destra di entrambi e impostare per ricordare.

Quindi fare clic su OK.

La prossima volta che avvii l'app dovrebbe avere le stesse dimensioni e sullo stesso monitor.

Lo uso in KDE per aprire il mio terminale uRxvt sul mio monitor sinistro su una configurazione a 3 monitor e funziona sempre.

In bocca al lupo.


Ecco come lo faccio adesso, speravo che ci fosse un modo più semplice di usare envvars.
Lekensteyn,

Questa è la risposta corretta per un utente KDE di KDE.
iLikeDirt,

3

Questo dipende da come sono configurati i tuoi doppi monitor.

Se stai usando XINERAMA per far sembrare entrambi i display come uno a X, allora useresti l' -geometryopzione per chiedere alle applicazioni di apparire in una posizione specifica. Se hai i display configurati come schermate diverse, utilizzerai DISPLAYper farlo.

Prova questi:

$ DISPLAY=0.0 xterm &
$ DISPLAY=0.1 xterm &

Se i tuoi monitor sono sullo schermo 0 e 1, questo dovrebbe generare un xterm su ciascun monitor.


2
L'ho già provato, ma questa configurazione non si applica a me, uno schermo è posizionato a sinistra da un altro. Aggiornerò la mia domanda.
Lekensteyn,

1
Hai provato a utilizzare l'opzione geometria per le app che la supportano? Dare una coordinata x> 1600 dovrebbe posizionare l'app nel secondo spazio dei monitor. Potresti anche provarlo al di fuori di kwin (solo per vedere se funziona) come nella mia esperienza kwin e -geometrynon sempre funziona correttamente.
Casey,

Casey, l'applicazione che sto cercando di posizionare non supporta tale opzione (Android emulator, basato su QEMU). Il programma si apre dove si trova il cursore del mouse.
Lekensteyn,

2

Io non sono venuto in questo metodo che fa uso di xdotool, xprop, e wmctrl.

Ecco cosa farà lo script seguente:

  1. Trova la finestra attiva
  2. Ottieni il suo stato massimizzato e ricordalo
  3. Rimuovi la massimizzazione
  4. Ottieni la sua geometria
  5. Calcola la nuova posizione
  6. Spostalo
  7. Massimizza in base allo stato precedente
  8. Sollevalo
  9. Ecco uno script che lo fa:

copione

Ciò sposterà la finestra attiva sull'altro monitor. Può gestire solo fianco a fianco, aka. orizzontale, configurazione dei monitor.

wid=`xdotool getactivewindow`
max_state=`xprop -id $wid _NET_WM_STATE`

wmctrl -ir $wid -b remove,maximized_vert,maximized_horz
eval `xdotool getwindowgeometry --shell $wid`

new_x=1600
if [[ "$X" -ge "$new_x" ]]; then
  new_x=0
fi

xdotool windowmove $wid $new_x $Y
if [ -z "${max_state/*_NET_WM_STATE_MAXIMIZED_*/}" ]; then
  wmctrl -ir $wid -b add,maximized_vert,maximized_horz
fi

xdotool windowraise $wid

Fonte: Xubuntu - spostare le finestre tra i monitor


Funziona solo dopo che è stata aperta un'applicazione, non proprio quello che sto cercando (probabilmente potrebbe essere aggiunto un keybinding per questo). Se non sbaglio, questo posiziona sempre una finestra sul lato sinistro di un monitor?
Lekensteyn,

@Lekensteyn - Sì, l'intento di questa soluzione è avviare appX e quindi eseguire questo cmd per spostarlo. Non ho due monitor 8- (quindi non ho modo di testarlo, l'ho semplicemente trovato e ho fornito i dettagli qui per la valutazione. È un'opzione e probabilmente potrebbe essere adattata ma è una soluzione "grezza" nella sua forma attuale
slm

@Lekensteyn - questa soluzione non è molto diversa dal tuo SCREEN=2 appXconcetto, tranne che lo è appX; sleep 1; moveWindow.sh.
slm

@Lekensteyn - anche io ho usato devilspie, xdotool, ecc. Per fare esattamente le stesse cose (all'interno di una singola finestra), questa A complimenti l'altra, in quanto mostra le specifiche, dove l'altra spiega solo i possibili approcci ma non mostra i dettagli di implementazione effettivi.
slm

Sarà più come app & sleep 1; moveWindow.shse i programmi non si staccassero. Non considero questo un miglioramento rispetto all'uso delle regole della finestra di KWin. +1 per i tuoi sforzi.
Lekensteyn,

0

Ha avuto un problema simile. Trovato il seguente:

  1. Fare clic destro sulla barra del titolo della finestra e selezionare "Altre azioni" -> "Impostazioni di Gestione finestre".
  2. Lì scegli "Focus" nella colonna a sinistra.
  3. Attiva / disattiva l'opzione "La schermata attiva segue il mouse".

Se non vengono specificati altri valori predefiniti, le finestre vengono visualizzate nella schermata attualmente attiva. Con la procedura sopra descritta, la posizione del mouse definisce questa schermata attiva.


Bene, ma questo non funziona se voglio mantenere il cursore nella schermata corrente. Penso che questa sia anche l'opzione predefinita, ma non tutti i programmi la rispettano.
Lekensteyn,
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.