Jak uruchamiać aplikacje zawsze na określonym wyświetlaczu?

11

Mam konfigurację z dwoma wyświetlaczami i chcę, aby wszystkie nowe i stare aplikacje uruchamiały się na głównym ekranie, który jest po prawej stronie. Ale niektóre aplikacje uruchamiają się na drugim ekranie, niezależnie od tego, gdzie znajduje się wskaźnik fokusa / myszy. Myślę, że dzieje się tak, ponieważ górny: lewy róg 0: 0 znajduje się na drugim monitorze. I jest większy niż pierwotny, czy może to być przyczyna?

Secondary to telewizor, w którym uruchamiam kodi, które mają ustawienie do wyboru wyświetlania.

Może być tam jakaś aplikacja, która pamięta dla każdej pozycji i wyświetlacza aplikacji, a także uważaj, gdy sekunda jest wyłączona - to znaczy pamiętaj pozycję, aż monitor zostanie ponownie włączony. We wcześniejszych wersjach Ubuntu compiz to zrobić, ale nie więcej.

Aktualizacja: Zmieniono DE na cynamon

LeonidMew
źródło
Ja też tego szukam, czy miałeś szczęście?
Felipe
@Felipe Brak szczęścia
LeonidMew
Na liście aplikacji w cynamonie mam opcję menu, aby przenieść aplikację na inny monitor, co jest przydatne, zwłaszcza gdy wtórne jest wyłączone. Ale to nie jest rozwiązanie pytania.
LeonidMew
1
Rozwiązaniem może być trochę podobny do demona proces, aby uważać na nowe okna, przenosić je na ekran główny. Czy byłoby to akceptowalne rozwiązanie? Prawdopodobnie nawet nie zobaczysz, jak się porusza.
Jacob Vlijm
@JacobVlijm Tak, to może być rozwiązanie. Ale nie wiem, jak to napisać, czy możesz podać dwa fragmenty kodu - jak określić nowe okno i jak się poruszać
LeonidMew

Odpowiedzi:

13

Przygotuj się na zabrudzenie rąk
Na granicy tego, co moim zdaniem moglibyśmy poprosić użytkowników, ale z drugiej strony, kiedy instrukcje są jasne, dlaczego nie? Więc zaczynamy...


Proces w tle, aby ustawić, na którym monitorze mają się pojawiać nowe okna

Fragment 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. Fragment Vala musi zostać skompilowany. Aby to zrobić, musisz zainstalować kilka rzeczy:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Skopiuj poniższy fragment i zapisz go jako win_tomonitor.vala

  3. Skompiluj fragment kodu za pomocą polecenia:

    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' 
    

    (Wiem, argument wnck jest głupi, ale potrzebny), plik wykonywalny zostanie utworzony w katalogu roboczym.

  4. Znajdź nazwę swojego głównego monitora, uruchamiając polecenie xrandrw terminalu.
  5. Uruchom plik wykonywalny z monitorem docelowym jako argumentem, np

    /path/to/win_tomonitor HDMI-1
    

Nowe („normalne”) okna pojawią się na 100px (x + y) od lewej strony docelowego monitora.

NB

Podczas dodawania tego jako elementu startowego może być konieczne dodanie przerwy kilku sekund przed uruchomieniem. Jeśli wystąpią problemy z logowaniem / uruchomieniem, proszę wspomnieć.


EDYTOWAĆ

Poniżej edytowana wersja (na życzenie). Różnice:

  • Ta wersja pomija działanie w oknach, które są już na docelowym monitorze.
  • Ta wersja pozwala ustawić wykluczone WM_CLASS-es. Aby wykluczyć jedną lub więcej klas: dodaj dodatkowe argumenty po argumencie docelowym monitor-argument. Przykład:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    aby wykluczyć ruch okien Tilix i Gedit.

Konfiguracja jest dokładnie taka sama jak w pierwszej wersji. Baw się dobrze!

Dowiedz się WM_CLASS okna

  • Otwórz okno terminala
  • Wpisz xprop, naciśnijReturn
  • kliknij na wybrane okno, WM_CLASSpojawi się w terminalu

Kod

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
źródło
Polecenie valac nie znaleziono. Kiedy próbuję zainstalować go za pomocą apt install valac, skrypt nie znajduje adresów IP
Rodolfo Velasco