Bagaimana cara memulai aplikasi selalu di tampilan utama?

11

Saya memiliki konfigurasi tampilan ganda, dan ingin semua aplikasi baru dan lama mulai pada tampilan utama, yang ada di sebelah kanan. Tetapi beberapa aplikasi mulai di layar kedua, terlepas dari di mana fokus / pointer mouse. Saya pikir ini karena atas: sudut kiri 0: 0 ada di monitor kedua. Dan ini lebih besar daripada primer, dapatkah ini menjadi penyebabnya?

Sekunder adalah TV tempat saya menjalankan kodi, yang memiliki pengaturan untuk memilih tampilan.

Mungkin ada beberapa aplikasi yang mengingat untuk setiap posisi dan tampilan aplikasi, dan juga berhati-hati ketika kedua dimatikan - artinya ingat posisi sampai monitor dihidupkan kembali. Dalam versi sebelumnya dari kompi ubuntu lakukan itu, tetapi tidak lebih.

Pembaruan: Mengubah DE menjadi kayu manis

LeonidMew
sumber
Saya juga mencari ini, apakah Anda beruntung?
Felipe
@Felipe Tidak beruntung
LeonidMew
Dalam daftar aplikasi dalam kayu manis, saya memiliki opsi menu untuk memindahkan aplikasi ke monitor yang berbeda, ini berguna terutama ketika sekunder dimatikan. Tapi ini bukan solusi untuk sebuah pertanyaan.
LeonidMew
1
Sebuah solusi bisa berupa proses yang mirip deamon, untuk mengawasi jendela baru, memindahkannya ke layar utama Anda. Apakah itu solusi yang dapat diterima? Anda bahkan mungkin tidak melihatnya dipindahkan.
Jacob Vlijm
@ JacobVlijm Ya, ini bisa menjadi solusi. Tapi saya tidak tahu bagaimana cara menulisnya, dapatkah Anda memberikan dua buah kode - cara menentukan jendela baru dan cara memindahkan
LeonidMew

Jawaban:

13

Bersiaplah untuk membuat tangan Anda kotor.
Di ujung apa yang saya rasa kami bisa meminta pengguna untuk melakukannya, tetapi di sisi lain, ketika instruksi jelas, mengapa tidak? Jadi di sini kita pergi ...


Latar belakang proses untuk mengatur di mana monitor windows baru akan muncul

Cuplikan 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. Cuplikan Vala perlu dikompilasi. Untuk melakukannya, Anda perlu menginstal beberapa hal:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Salin cuplikan di bawah, simpan sebagai win_tomonitor.vala

  3. Kompilasi cuplikan dengan perintah:

    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' 
    

    (Saya tahu, argumen wnck konyol, tetapi diperlukan), sebuah executable akan diproduksi di direktori kerja.

  4. Cari tahu nama monitor utama Anda dengan menjalankan perintah xrandrdi terminal.
  5. Jalankan executable dengan monitor yang ditargetkan sebagai argumen, mis

    /path/to/win_tomonitor HDMI-1
    

Jendela baru ("normal") akan muncul pada 100px (x + y) dari atas layar monitor yang ditargetkan.

NB

Saat menambahkan ini sebagai item awal, Anda mungkin perlu menambahkan jeda beberapa detik sebelum menjalankannya. Jika Anda mengalami masalah saat masuk / mulai, sebutkan.


EDIT

Di bawah versi yang diedit (berdasarkan permintaan). Perbedaan:

  • Versi ini melewatkan aksi di windows yang sudah ada di monitor yang ditargetkan.
  • Versi ini memungkinkan untuk mengeset WM_CLASS-es yang dikecualikan . Untuk mengecualikan satu atau beberapa kelas: tambahkan argumen tambahan setelah argumen monitor yang ditargetkan. Sebuah contoh:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    untuk mengecualikan Tilix dan gedit windows agar tidak bergerak.

Setup persis sama dengan versi pertama. Selamat bersenang-senang!

Cari tahu WM_CLASS jendela

  • Buka jendela terminal
  • Ketik xprop, TekanReturn
  • klik pada jendela yang ditargetkan, The WM_CLASSmuncul di terminal

Kode

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();
    }
}
Yakub Vlijm
sumber
Perintah valac tidak ditemukan. Ketika saya mencoba menginstalnya dengan apt install valac, skrip tidak menemukan beberapa IP
Rodolfo Velasco