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

11

J'ai une configuration à double affichage et je veux que toutes les nouvelles et anciennes applications 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 de nouveau allumé. Dans les versions antérieures d'ubuntu compiz, faites cela, mais pas plus.

Mise à jour: changé DE en cannelle

LeonidMew
la source
Je cherche aussi ça, as-tu eu de la chance?
Felipe
@Felipe Pas de chance
LeonidMew
Dans la liste des applications en cannelle, j'ai une option de menu pour déplacer l'application vers un moniteur différent, c'est utile surtout lorsque le secondaire est désactivé. Mais ce n'est pas une solution à une question.
LeonidMew
1
Une solution pourrait être un petit processus de type démon, pour faire attention aux nouvelles fenêtres, les déplacer vers votre écran principal. Serait-ce une solution acceptable? Vous ne le verriez probablement même pas bouger.
Jacob Vlijm
@JacobVlijm Oui, cela peut être une solution. Mais je ne sais pas comment l'écrire, pouvez-vous s'il vous plaît donner deux morceaux de code - comment déterminer une nouvelle fenêtre et comment se déplacer
LeonidMew

Réponses:

13

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 xrandrdans le 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é.

NB

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 sont déjà sur le moniteur ciblé.
  • Cette version permet de définir les WM_CLASS-es exclus . 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 les fenêtres Tilix et gedit de se déplacer.

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
  • Type xprop, appuyez surReturn
  • cliquez sur la fenêtre ciblée, le WM_CLASSapparaî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();
    }
}
Jacob Vlijm
la source
Commande valac introuvable. Lorsque j'essaie de l'installer avec apt install valac, le script ne trouve pas d'IP
Rodolfo Velasco