GNU/Linux >> Tutoriels Linux >  >> Ubuntu

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

J'ai une configuration à double affichage et je souhaite que toutes les nouvelles et anciennes applications démarrent sur l'affichage principal, qui se trouve à droite. Mais certaines applications démarrent sur le deuxième écran, quel que soit l'endroit où se trouve le focus/le 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 sur lequel j'exécute Kodi, qui a un paramètre pour choisir l'affichage.

Peut-être y a-t-il des applications qui se souviennent de chaque position et affichage de l'application, et faites également attention lorsque la seconde est éteinte - signifie mémoriser 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 :DE remplacé par cannelle

Réponse acceptée :

Soyez prêt à vous salir les mains
A la limite de ce que j'ai l'impression qu'on pourrait demander aux utilisateurs de faire, mais d'un autre côté, quand les consignes sont claires, pourquoi pas ? Alors on y va…

Processus d'arrière-plan pour définir sur quel moniteur les 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 de code 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 xrandr dans 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 100px (x + y) à partir du haut à gauche du moniteur ciblé.

N.B.

Lorsque vous l'ajoutez 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 lors de la connexion/démarrage, veuillez le mentionner.

Connexe :Modifier le son de notification (alerte) dans Ubuntu ?

MODIFIER

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 des WM_CLASS exclus -es. Pour exclure une ou plusieurs classes :ajoutez des arguments supplémentaires après l'argument du moniteur ciblé. Un exemple :

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    pour exclure les fenêtres Tilix et gedit du déplacement.

La configuration est exactement la même que la première version. Amusez-vous !

Découvrir la WM_CLASS d'une fenêtre

  • Ouvrir une fenêtre de terminal
  • Tapez xprop , Appuyez sur Retour
  • 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();
    }
}

Ubuntu
  1. Comment exécuter des applications Windows sur votre PC Ubuntu

  2. Comment afficher le pourcentage de batterie dans la barre d'état système d'Ubuntu 22.04

  3. Comment démarrer le serveur Vnc au démarrage ?

  4. Comment démarrer le déluge en arrière-plan ?

  5. Comment afficher des lignes spécifiques d'un fichier dans la ligne de commande Linux

Comment réinitialiser la grille des applications dans GNOME 3.38

Comment démarrer TeamViewer sur Debian 11

Comment afficher les PPID sous Linux

Comment afficher ou installer les applications Ubuntu Touch ?

Comment régénérer une vignette spécifique dans Nautilus ?

Comment afficher les paroles des chansons ?