GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Come avviare le app sempre su un display specifico?

Ho una configurazione a doppio display e voglio che tutte le nuove e vecchie applicazioni inizino sul display principale, che si trova sulla destra. Ma alcune app si avviano sul secondo schermo, indipendentemente da dove si trovi lo stato attivo/il puntatore del mouse. Penso che ciò sia dovuto al fatto che in alto:l'angolo sinistro 0:0 è sul secondo monitor. Ed è più grande della primaria, può essere una causa?

Il secondario è un televisore su cui eseguo kodi, che ha un'impostazione per scegliere il display.

Potrebbero esserci alcune app che ricordano per ogni posizione e display dell'app, e anche fare attenzione quando il secondo è spento:significa ricordare la posizione fino a quando il monitor non si riaccende. Nelle versioni precedenti di ubuntu compiz fallo, ma non di più.

Aggiornamento:DE modificato in cannella

Risposta accettata:

Preparati a sporcarti le mani
Al limite di quello che penso 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 devono apparire le nuove finestre

Il frammento 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 Vala deve essere compilato. Per farlo devi installare alcune cose:

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

  3. Compila 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), verrà prodotto un eseguibile nella directory di lavoro.

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

    /path/to/win_tomonitor HDMI-1
    

Nuove finestre ("normali") appariranno a 100 px (x + y) dall'alto a sinistra del monitor di destinazione.

NB

Quando lo aggiungi come elemento di avvio, potresti dover aggiungere un'interruzione di alcuni secondi prima di eseguirlo. Se riscontri problemi durante l'accesso/avvio, menziona.

Correlati:modificare il suono di notifica (avviso) in Ubuntu?

MODIFICA

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

  • Questa versione salta l'azione sulle finestre che sono già sul monitor di destinazione.
  • Questa versione permette di impostare il WM_CLASS escluso -es. Per escludere una o più classi:aggiungi argomenti extra dopo l'argomento monitor mirato. Un esempio:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    per escludere le finestre di Tilix e gedit dallo spostamento.

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

Scopri la WM_CLASS di una finestra

  • Apri una finestra di terminale
  • Digita xprop , Premi Invio
  • fai clic sulla finestra di destinazione, The WM_CLASS appare 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();
    }
}

Ubuntu
  1. Come eseguire app Windows sul tuo PC Ubuntu

  2. Come visualizzare la percentuale della batteria nella barra delle applicazioni di Ubuntu 22.04

  3. Come avviare automaticamente i programmi in aree di lavoro specifiche all'avvio?

  4. Come avviare il server Vnc all'avvio?

  5. Come visualizzare righe specifiche di un file nella riga di comando di Linux

Come ripristinare la griglia delle app in GNOME 3.38

Come avviare TeamViewer su Debian 11

Come visualizzare i PPID in Linux

Come visualizzare o installare le app Ubuntu Touch?

Come rigenerare una miniatura specifica in Nautilus?

Come visualizzare i testi delle canzoni?