Apri la finestra dell'applicazione nella stessa schermata in cui è stata avviata


8

Sto usando una configurazione a doppio schermo. Ubuntu 14.10 / Unity. Ogni schermata ha il suo launcher / Dash. Le applicazioni predefinite come Firefox, nautilus, terminal e thunderbird vengono visualizzate sullo schermo in cui ho utilizzato il programma di avvio. Quindi..quando uso il launcher per Firefox nella schermata di destra, il browser si apre nella schermata di destra. Come dovrebbe essere.

Vorrei quel comportamento con altre applicazioni come Google Chrome. Non riesco a trovare una soluzione adeguata.

Risposte:


5

Reindirizzamento del comando per eseguire un'applicazione

La maggior parte delle applicazioni apre la finestra sullo schermo da cui sono state avviate (da Dash o dal programma di avvio). Alcune applicazioni tuttavia non lo fanno, ma possono essere forzate, reindirizzando il comando per eseguire l'applicazione tramite lo script seguente. Per fare ciò, dovrai modificare il .desktopfile corrispondente (launcher).

L'installazione sembra un po 'complicata, ma se si segue la procedura ("Come usare"), non dovrebbe essere affatto troppo difficile.

Come funziona

  • Lo script legge la posizione del mouse nel momento in cui fai clic sul pulsante di avvio o scegli l'applicazione da Dash e determina su quale schermo si trova (sinistra / destra).
  • Successivamente, attende che appaia la nuova finestra, di proprietà dell'applicazione (pid) avviata.
  • Una volta visualizzata la finestra, controlla se la posizione della finestra (schermo) corrisponde alla posizione iniziale del mouse (schermo).
  • In caso contrario, sposta la finestra sullo schermo da cui è stata avviata l'applicazione. Nella maggior parte dei casi, l'azione sarà in una fase (molto) precoce dell'esistenza della finestra, quindi non la noterai nemmeno.

Problema / soluzione

C'è un aspetto negativo: se si sostituisce il comando principale.desktop del file con il comando per chiamare questo script, il clic destro "apri con" non funzionerà correttamente. Nel caso di un browser web come Google Chrome, questo non sarà un grosso problema. Con altre applicazioni, una soluzione semplice sarebbe quella di aggiungere un'opzione per aprire una nuova finestra nella schermata corrente come collegamento (vedere più avanti).

<Image>

Come usare:

  • Lo script utilizza sia wmctrle xautomation:

    sudo apt-get install xautomation
    sudo apt-get install wmctrl
    
  • Crea una directory ~/binse non esiste ancora.

  • Copia lo script in un file vuoto, salvalo come open_oncurrent(nessuna estensione) in~/bin

  • Renderlo eseguibile (!)
  • Copia il .desktopfile corrispondente da /usr/share/applicationsa ~/.local/share/applications:

    cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
    
  • Apri la copia locale in ~/.local/share/applications:

    gedit ~/.local/share/applications/google-chrome.desktop
    
  • Modifica il file (due opzioni):

    1. Per modificare il comando principale del programma di avvio:

      • trova la linea:

        Exec=/usr/bin/google-chrome-stable %U
        
      • cambiarlo in

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. Per aggiungere l'opzione come scorciatoia (come nell'immagine sopra):

      • trova la linea:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
        
      • sostituirlo con:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
        
      • Quindi aggiungi la seguente sezione alla fine del file:

        [New window on this screen Shortcut Group]
        Name=New window on this screen
        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        TargetEnvironment=Unity
        

Come usare con altre applicazioni:

Allo stesso modo, è possibile applicare la soluzione ad altre applicazioni. La sintassi del comando da utilizzare nel .desktopfile è come nell'esempio:

Exec=/bin/bash -c "open_oncurrent <command>"

Una piccola spiegazione aggiuntiva su come gestire le eccezioni è nello script.

Il copione

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

t = 0; user = getpass.getuser(); application = sys.argv[1]
"""
In most cases, the command to run an application is the same as the process
name. There are however exceptions, to be listed below, if you use these appli-
cations i.c.w. this script. Just add an item to the list in the format:
["<command>", "<process_name>"],
"""
exceptions = [
    ["/usr/bin/google-chrome-stable", "chrome"],
    ]
try:
    procname = [app[1] for app in exceptions if app[0] == application][0]
except IndexError:
    procname = application

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
# initial position of the mouse (click position)
start_pos = int(get("xmousepos").strip().split()[0])
# x- position of right side of the screen  
x_res = [int(s.split("x")[0]) for s in get("xrandr").split() if s.endswith("+0+0")][0]
# current windows
start_windows = get("wmctrl -l")
# open application
subprocess.call(["/bin/bash", "-c", application+"&"])
while t < 30:
    procs = get("ps -u "+user).splitlines()
    new = [w for w in get("wmctrl -lpG").splitlines() if not w.split()[0] in start_windows]
    match = sum([[line for line in procs if w.split()[2] in line and procname[:15] in line] for w in new], [])
    if len(match) == 1:
        data = new[0].split(); curr_pos = int(data[3]); compare = (start_pos > x_res, curr_pos > x_res)
        if compare[0] == compare[1]:
            pass
        else:
            if compare[0] == True:
                data[3] = str(int(data[3])+x_res)
            else:
                data[3] = str(int(data[3])-x_res)
            cmd1 = "wmctrl -r "+data[0]+" -b remove,maximized_vert,maximized_horz"
            cmd2 = "wmctrl -ir "+data[0]+" -e 0,"+(",").join(data[3:7])
            for cmd in [cmd1, cmd2]:
                subprocess.Popen(["/bin/bash", "-c", cmd])
        break
    t = t + 1
    time.sleep(0.5)

Grazie, funziona. Noto una seconda icona di Google Chrome sul programma di avvio quando è aperto.
Digiplace,

6

Unity usa Compiz come compositore e ha tutti i tipi di plugin per questo genere di cose. Per farla breve e semplice senza fare confusione nella riga di comando, installa Compiz Config Settings Manager (con sudo apt-get install compizconfig-settings-managero tramite Software Center) e cerca Place Windows, assicurati che sia selezionato

inserisci qui la descrizione dell'immagine

Sotto quel plugin ci saranno diverse opzioni per Multi Output Mode. Quello che vuoi è Use output device of focused window. Quindi posizionerà la finestra del file aperta ovunque si trovi il tuo file manager inserisci qui la descrizione dell'immagine

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.