GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Wie starte ich Apps immer auf einem bestimmten Display?

Ich habe eine Dual-Display-Konfiguration und möchte, dass alle neuen und alten Anwendungen auf dem primären Display starten, das sich auf der rechten Seite befindet. Einige Apps starten jedoch auf dem zweiten Bildschirm, unabhängig davon, wo sich der Fokus / Mauszeiger befindet. Ich denke, das liegt daran, dass sich oben:linke Ecke 0:0 auf dem zweiten Monitor befindet. Und es ist größer als primär, kann das eine Ursache sein?

Sekundär ist ein Fernseher, auf dem ich Kodi ausführe, der eine Einstellung zur Auswahl der Anzeige hat.

Möglicherweise gibt es einige Apps, die sich für jede App-Position und -Anzeige erinnern und auch darauf achten, wenn die zweite ausgeschaltet ist – das heißt, sich an die Position erinnern, bis der Monitor wieder eingeschaltet ist. In früheren Versionen von ubuntu compiz tun Sie das, aber nicht mehr.

Update:DE in Zimt geändert

Akzeptierte Antwort:

Machen Sie sich darauf gefasst, sich die Hände schmutzig zu machen
Am Rande dessen, was wir von den Benutzern verlangen könnten, aber andererseits, wenn die Anweisungen klar sind, warum nicht? Also los geht's…

Hintergrundprozess, um einzustellen, auf welchem ​​Monitor neue Fenster erscheinen sollen

Das Vala-Snippet

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. Das Vala-Snippet muss kompiliert werden. Dazu müssen Sie ein paar Dinge installieren:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Kopieren Sie das folgende Snippet und speichern Sie es als win_tomonitor.vala

  3. Kompilieren Sie das Snippet mit dem Befehl:

    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' 
    

    (Ich weiß, das wnck-Argument ist albern, aber notwendig), eine ausführbare Datei wird im Arbeitsverzeichnis erstellt.

  4. Finden Sie den Namen Ihres primären Monitors heraus, indem Sie den Befehl xrandr ausführen im Terminal.
  5. Führen Sie die ausführbare Datei mit dem Zielmonitor als Argument aus, z. B.

    /path/to/win_tomonitor HDMI-1
    

Neue („normale“) Fenster werden auf 100 Pixel (x + y) von oben links auf dem Zielmonitor angezeigt.

NB.

Wenn Sie dies als Startelement hinzufügen, müssen Sie möglicherweise eine Pause von einigen Sekunden hinzufügen, bevor Sie es ausführen. Wenn Sie beim Anmelden/Starten auf Probleme stoßen, erwähnen Sie bitte.

Verwandte:Ändern Sie den Benachrichtigungs- (Alarm-) Ton in Ubuntu?

BEARBEITEN

Nachfolgend eine bearbeitete Version (auf Anfrage). Unterschiede:

  • Diese Version überspringt Aktionen in Fenstern, die sich bereits auf dem Zielmonitor befinden.
  • Diese Version erlaubt das Setzen von ausgeschlossenem WM_CLASS -es. Um eine oder mehrere Klassen auszuschließen:Fügen Sie nach zusätzliche Argumente hinzu das gezielte Monitor-Argument. Ein Beispiel:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    sowohl Tilix- als auch Gedit-Fenster vom Verschieben auszuschließen.

Das Setup ist genau das gleiche wie die erste Version. Viel Spaß!

Die WM_CLASS eines Fensters herausfinden

  • Öffnen Sie ein Terminalfenster
  • Geben Sie xprop ein , Drücken Sie Return
  • Klicken Sie auf das Zielfenster, The WM_CLASS erscheint im Terminal

Der 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. So führen Sie Windows-Apps auf Ihrem Ubuntu-PC aus

  2. So zeigen Sie den Batterieprozentsatz in der Ubuntu 22.04-Systemleiste an

  3. Wie lade ich ein Programm für einen schnelleren Start vor?

  4. Wie startet PulseAudio?

  5. Wie konfiguriere ich Monit, um einen Prozess mit einem bestimmten Benutzer zu starten?

So setzen Sie das Apps-Raster in GNOME 3.38 zurück

So starten Sie TeamViewer unter Debian 11

So zeigen Sie PPIDs unter Linux an

Wie kann ich Ubuntu Touch Apps anzeigen oder installieren?

Wie regeneriere ich ein bestimmtes Thumbnail in Nautilus?

Wie zeige ich Liedtexte an?