Come avviare app sempre su display specifico?


11

Ho una configurazione a doppio display e voglio che tutte le applicazioni nuove e vecchie si avviino sul display principale, che si trova sulla destra. Tuttavia, alcune app si avviano sulla seconda schermata, indipendentemente da dove si trovi il puntatore di focus / mouse. Penso che questo sia perché in alto: l'angolo sinistro 0: 0 è sul secondo monitor. Ed è più grande quindi primario, può essere una causa?

Secondario è una TV in cui eseguo Kodi, che ha un'impostazione per scegliere il display.

Potrebbe esserci qualche app che ricorda per ogni posizione e display di app, e anche fare attenzione quando il secondo è spento - significa ricordare la posizione fino a quando il monitor è di nuovo acceso. Nelle versioni precedenti di Ubuntu Compiz farlo, ma non di più.

Aggiornamento: modificato da DE a cannella


Sto anche cercando questo, hai avuto fortuna?
Felipe

@Felipe Nessuna fortuna
LeonidMew,

Nell'elenco delle applicazioni in cannella, ho un'opzione di menu per spostare l'app su monitor diversi, è utile soprattutto quando il secondario è disattivato. Ma questa non è una soluzione a una domanda.
LeonidMew

1
Una soluzione potrebbe essere un piccolo processo simile a un demone, per fare attenzione alle nuove finestre, spostarle sullo schermo principale. Sarebbe una soluzione accettabile? Probabilmente non lo vedresti nemmeno spostato.
Jacob Vlijm,

@JacobVlijm Sì, questa può essere una soluzione. Ma non so come scriverlo, puoi per favore dare due pezzi di codice - come determinare una nuova finestra e come spostare
LeonidMew

Risposte:


13

Preparati a sporcarti le mani
Al limite di ciò che sento potremmo chiedere agli utenti di fare, ma d'altra parte, quando le istruzioni sono chiare, perché no? Quindi eccoci qui ...


Processo in background per impostare su quale monitor dovrebbero apparire nuove finestre

Lo snippet di Vala

using Wnck;
using Gdk;
using Gtk;

// compile:
// valac --pkg gtk+-3.0 --pkg gio-2.0 --pkg libwnck-3.0 -X "-D WNCK_I_KNOW_THIS_IS_UNSTABLE" 'file.vala'

namespace move_newwins {

    private int[] monitor_geo_x;
    private int[] monitor_geo_y;
    private int monitorindex;
    private string currmon;

    private void getwins() {
        var dsp = Gdk.Display.get_default();
        unowned Wnck.Screen scr = Wnck.Screen.get_default();
        scr.force_update();
        get_monitors(dsp);
        scr.window_opened.connect(newwin);
    }

    private void newwin (Wnck.Window newwin) {
        newwin.unmaximize();
        int winx;
        int winy;
        int winwidth;
        int winheight;
        newwin.get_geometry(out winx, out winy, out winwidth, out winheight);
        Wnck.WindowType type = newwin.get_window_type();
        if (type == Wnck.WindowType.NORMAL) {
            newwin.set_geometry(
                Wnck.WindowGravity.NORTHWEST,
                Wnck.WindowMoveResizeMask.X |
                Wnck.WindowMoveResizeMask.Y |
                Wnck.WindowMoveResizeMask.WIDTH |
                Wnck.WindowMoveResizeMask.HEIGHT,
                monitor_geo_x[monitorindex] + 100,
                monitor_geo_y[monitorindex] + 100,
                winwidth, winheight
            );
        }
    }

    private int get_stringindex (string s, string[] arr) {
        for (int i=0; i < arr.length; i++) {
            if(s == arr[i]) return i;
        } return -1;
    }

    private void get_monitors(Gdk.Display dsp) {
        int nmons = dsp.get_n_monitors();
        string[] monitornames = {};
        for (int i=0; i < nmons; i++) {
            Gdk.Monitor newmon = dsp.get_monitor(i);
            monitornames += newmon.get_model();
            Rectangle geo = newmon.get_geometry();
            monitor_geo_x += geo.x;
            monitor_geo_y += geo.y;
            monitorindex = get_stringindex(
                currmon, monitornames
            );
        }
    }

    public static void main (string[] args) {
        currmon = args[1];
        Gtk.init(ref args);
        getwins();
        Gtk.main();
    }
}
  1. Lo snippet di Vala deve essere compilato. Per fare ciò è necessario installare alcune cose:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Copia lo snippet di seguito, salvalo come win_tomonitor.vala

  3. Compilare lo snippet con il comando:

    valac --pkg gtk+-3.0 --pkg gio-2.0 --pkg libwnck-3.0 -X "-D WNCK_I_KNOW_THIS_IS_UNSTABLE" '/path/to/win_tomonitor.vala' 
    

    (Lo so, l'argomento wnck è sciocco, ma necessario), un eseguibile verrà prodotto nella directory di lavoro.

  4. Scopri il nome del tuo monitor principale eseguendo il comando xrandrnel terminale.
  5. Esegui l'eseguibile con il monitor di destinazione come argomento, ad es

    /path/to/win_tomonitor HDMI-1
    

Nuove finestre ("normali") appariranno su 100 px (x + y) dalla parte superiore del monitor target.

NB

Quando si aggiunge questo come elemento di avvio, potrebbe essere necessario aggiungere un'interruzione di alcuni secondi prima di eseguirlo. Se si verificano problemi durante l'accesso / l'avvio, si prega di menzionare.


MODIFICARE

Di seguito una versione modificata (su richiesta). differenze:

  • Questa versione salta l'azione su Windows che si trovano già sul monitor di destinazione.
  • Questa versione consente di impostare gli esclusi WM_CLASS. Per escludere una o più classi: aggiungere ulteriori argomenti dopo l'argomento monitor mirato. Un esempio:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    per escludere sia le finestre Tilix che gedit dallo spostamento.

L'installazione è esattamente la stessa della prima versione. Divertiti!

Scopri WM_CLASS di una finestra

  • Apri una finestra del terminale
  • Digitare xprop, premereReturn
  • fare clic sulla finestra target, il WM_CLASSappare nel terminale

Il codice

using Wnck;
using Gdk;
using Gtk;

// compile:
// valac --pkg gtk+-3.0 --pkg gio-2.0 --pkg libwnck-3.0 -X "-D WNCK_I_KNOW_THIS_IS_UNSTABLE" 'file.vala'

namespace move_newwins {

    private int[] monitor_geo_x;
    private int[] monitor_geo_y;
    private int monitorindex;
    private string currmon;
    Gdk.Display dsp;
    string[] blacklist;

    private void getwins() {
        dsp = Gdk.Display.get_default();
        unowned Wnck.Screen scr = Wnck.Screen.get_default();
        scr.force_update();
        get_monitors(dsp);
        scr.window_opened.connect(newwin);
    }

    private void newwin (Wnck.Window newwin) {
        newwin.unmaximize();
        int winx;
        int winy;
        int winwidth;
        int winheight;
        newwin.get_geometry(out winx, out winy, out winwidth, out winheight);
        string wins_monitor = dsp.get_monitor_at_point(winx, winy).get_model();
        Wnck.WindowType type = newwin.get_window_type();
        string wm_class = newwin.get_class_group_name();
        bool blacklisted = get_stringindex(wm_class, blacklist) != -1;

        if (
            type == Wnck.WindowType.NORMAL &&
            wins_monitor != currmon &&
            !blacklisted
        ) {
            newwin.set_geometry(
                Wnck.WindowGravity.NORTHWEST,
                Wnck.WindowMoveResizeMask.X |
                Wnck.WindowMoveResizeMask.Y |
                Wnck.WindowMoveResizeMask.WIDTH |
                Wnck.WindowMoveResizeMask.HEIGHT,
                monitor_geo_x[monitorindex] + 100,
                monitor_geo_y[monitorindex] + 100,
                winwidth, winheight
            );
        }
    }

    private int get_stringindex (string s, string[] arr) {
        for (int i=0; i < arr.length; i++) {
            if(s == arr[i]) return i;
        } return -1;
    }

    private void get_monitors(Gdk.Display dsp) {
        int nmons = dsp.get_n_monitors();
        string[] monitornames = {};
        for (int i=0; i < nmons; i++) {
            Gdk.Monitor newmon = dsp.get_monitor(i);
            monitornames += newmon.get_model();
            Rectangle geo = newmon.get_geometry();
            monitor_geo_x += geo.x;
            monitor_geo_y += geo.y;
            monitorindex = get_stringindex(
                currmon, monitornames
            );
        }
    }

    public static void main (string[] args) {
        currmon = args[1];
        blacklist = args[1:args.length];
        Gtk.init(ref args);
        getwins();
        Gtk.main();
    }
}

Comando valac non trovato. Quando provo a installarlo con apt install valac, lo script non trova alcuni IP
Rodolfo Velasco il
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.