Wie starte ich Apps immer auf dem primären Display?

11

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

Sekundär ist ein Fernseher, auf dem ich Kodi laufen lasse, die eine Einstellung zur Auswahl der Anzeige haben.

Möglicherweise gibt es einige Apps, die sich für jede App-Position und -Anzeige merken, und achten Sie auch darauf, wenn die zweite ausgeschaltet ist - bedeuten Sie, dass Sie sich die Position merken, bis der Monitor wieder eingeschaltet ist. In früheren Versionen von Ubuntu Compiz tun Sie das, aber nicht mehr.

Update: DE wurde in Zimt geändert

LeonidMew
quelle
Ich suche auch danach, hast du Glück gehabt?
Felipe
@Felipe Kein Glück
LeonidMew
In der Anwendungsliste in Zimt habe ich die Menüoption, um die App auf einen anderen Monitor zu verschieben. Dies ist besonders nützlich, wenn die sekundäre Funktion deaktiviert ist. Dies ist jedoch keine Lösung für eine Frage.
LeonidMew
1
Eine Lösung könnte ein kleiner deamonartiger Prozess sein, um auf neue Fenster zu achten und sie auf Ihren primären Bildschirm zu verschieben. Wäre das eine akzeptable Lösung? Sie würden wahrscheinlich nicht einmal sehen, dass es bewegt wird.
Jacob Vlijm
@JacobVlijm Ja, das kann eine Lösung sein. Aber ich wusste nicht, wie ich es schreiben soll, können Sie bitte zwei Codeteile geben - wie man ein neues Fenster bestimmt und wie man sich bewegt
LeonidMew

Antworten:

13

Seien Sie bereit, sich die Hände schmutzig zu machen.
Ich bin der Meinung, dass wir die Benutzer dazu auffordern könnten, dies zu tun. Wenn die Anweisungen jedoch klar sind, warum nicht? Auf geht's...


Hintergrundprozess zum Festlegen, auf welchem ​​Monitor neue Fenster angezeigt werden 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 einige Dinge installieren:

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

  3. Kompilieren Sie das Snippet mit dem folgenden 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, wird aber benötigt), eine ausführbare Datei wird im Arbeitsverzeichnis erstellt.

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

    /path/to/win_tomonitor HDMI-1
    

Neue ("normale") Fenster werden auf 100px (x + y) oben links vom Zielmonitor angezeigt.

NB

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


BEARBEITEN

Unten eine bearbeitete Version (auf Anfrage). Unterschiede:

  • Diese Version überspringt Aktionen in Fenstern, die sich bereits auf dem Zielmonitor befinden.
  • Diese Version erlaubt es, ausgeschlossene WM_CLASS-es zu setzen . So schließen Sie eine oder mehrere Klassen aus: Fügen Sie nach dem Zielmonitorargument zusätzliche Argumente hinzu. Ein Beispiel:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

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

Das Setup entspricht genau der ersten Version. Habe Spaß!

Finden Sie die WM_CLASS eines Fensters heraus

  • Öffnen Sie ein Terminalfenster
  • Typ xprop, drückenReturn
  • Klicken Sie auf das Zielfenster. Das wird WM_CLASSim Terminal angezeigt

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();
    }
}
Jacob Vlijm
quelle
Befehl valac nicht gefunden. Wenn ich versuche, es mit apt install valac zu installieren, findet das Skript keine IPs
Rodolfo Velasco