web-dev-qa-db-fra.com

Comment démarrer des applications toujours sur un écran spécifique?

J'ai une configuration à double affichage et je veux que toutes les applications nouvelles et anciennes démarrent sur l'affichage principal, qui est à droite. Mais certaines applications démarrent sur le deuxième écran, quel que soit l'emplacement du pointeur/pointeur de la souris. Je pense que c'est parce que le coin supérieur: gauche 0: 0 est sur le deuxième moniteur. Et c'est plus gros que primaire, cela peut-il être une cause?

Secondaire est un téléviseur où je lance Kodi, qui a un paramètre pour choisir l'affichage.

Il peut y avoir une application dont vous vous souvenez pour chaque position et affichage de l'application, et faites également attention lorsque la seconde est désactivée - rappelez-vous la position jusqu'à ce que le moniteur soit à nouveau allumé. Dans les versions antérieures d'ubuntu compiz, faites cela, mais pas plus.

Mise à jour: changé DE en cannelle

11
LeonidMew

Soyez prêt à vous salir les mains
À la limite de ce que je pense que nous pourrions demander aux utilisateurs de faire, mais d'un autre côté, lorsque les instructions sont claires, pourquoi pas? Alors c'est parti ...


Processus d'arrière-plan pour définir sur quel moniteur de nouvelles fenêtres doivent apparaître

L'extrait de 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. L'extrait Vala doit être compilé. Pour ce faire, vous devez installer quelques éléments:

    Sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Copiez l'extrait ci-dessous, enregistrez-le sous win_tomonitor.vala

  3. Compilez l'extrait avec la commande:

    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' 
    

    (Je sais, l'argument wnck est idiot, mais nécessaire), un exécutable sera produit dans le répertoire de travail.

  4. Découvrez le nom de votre moniteur principal en exécutant la commande xrandrin terminal.
  5. Exécutez l'exécutable avec le moniteur ciblé comme argument, par exemple.

    /path/to/win_tomonitor HDMI-1
    

De nouvelles fenêtres ("normales") apparaîtront sur 100 pixels (x + y) à partir de la gauche du moniteur ciblé.

N.B.

Lors de l'ajout en tant qu'élément de démarrage, vous devrez peut-être ajouter une pause de quelques secondes avant de l'exécuter. Si vous rencontrez des problèmes de connexion/démarrage, veuillez le mentionner.


ÉDITER

Ci-dessous une version éditée (sur demande). Différences:

  • Cette version ignore l'action sur les fenêtres qui se trouvent déjà sur le moniteur ciblé.
  • Cette version permet de définir les exclus WM_CLASS -es. Pour exclure une ou plusieurs classes: ajoutez des arguments supplémentaires après l'argument moniteur ciblé. Un exemple:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    pour empêcher le déplacement des fenêtres Tilix et gedit.

La configuration est exactement la même que la première version. S'amuser!

Découvrez la WM_CLASS d'une fenêtre

  • Ouvrez une fenêtre de terminal
  • Tapez xprop, appuyez sur Return
  • cliquez sur la fenêtre ciblée, Le WM_CLASS apparaît dans le terminal

Le code

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();
    }
}
13
Jacob Vlijm