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


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();
    }
}

Polecenie valac nie znaleziono. Kiedy próbuję zainstalować go za pomocą apt install valac, skrypt nie znajduje adresów IP
— Rodolfo Velasco
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.