GNU/Linux >> Belajar Linux >  >> Ubuntu

Bagaimana Memulai Aplikasi Selalu Pada Tampilan Tertentu?

Saya memiliki konfigurasi tampilan ganda, dan ingin semua aplikasi baru dan lama dimulai pada tampilan utama, yang ada di sebelah kanan. Tetapi beberapa aplikasi mulai di layar kedua, di mana pun fokus/penunjuk mouse berada. Saya pikir ini karena top:left corner 0:0 ada di monitor kedua. Dan lebih besar dari yang utama, bisakah ini menjadi penyebabnya?

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

Mungkin ada beberapa aplikasi yang diingat untuk setiap posisi dan tampilan aplikasi, dan juga berhati-hati saat detik dimatikan – artinya ingat posisi hingga monitor menyala kembali. Di versi ubuntu compiz yang lebih lama, lakukan itu, tetapi tidak lebih.

Pembaruan:Mengubah DE menjadi kayu manis

Jawaban yang Diterima:

Bersiaplah untuk mengotori tangan Anda
Di sisi yang saya rasa kami dapat meminta pengguna untuk melakukannya, tetapi di sisi lain, ketika instruksinya jelas, mengapa tidak? Jadi ini dia…

Proses latar belakang untuk menyetel monitor mana yang akan menampilkan jendela baru

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 ini, simpan sebagai win_tomonitor.vala

  3. Kompilasi snippet 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 dihasilkan di direktori kerja.

  4. Cari tahu nama monitor utama Anda dengan menjalankan perintah xrandr di 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 kiri atas monitor yang ditargetkan.

N.B.

Saat menambahkan ini sebagai item startup, Anda mungkin perlu menambahkan jeda beberapa detik sebelum menjalankannya. Jika Anda mengalami masalah saat login/startup, harap sebutkan.

Terkait:Ubah suara notifikasi (peringatan) di Ubuntu?

EDIT

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

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

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    untuk mengecualikan jendela Tilix dan gedit agar tidak bergerak.

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

Cari tahu WM_CLASS jendela

  • Buka jendela terminal
  • Ketik xprop , Tekan Kembali
  • klik pada jendela yang dituju, WM_CLASS muncul 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();
    }
}

Ubuntu
  1. Cara menjalankan aplikasi Windows di PC Ubuntu Anda

  2. Cara Menampilkan Persentase Baterai di Baki Sistem Ubuntu 22.04

  3. Bagaimana Cara Memulai Program Secara Otomatis di Ruang Kerja Tertentu Saat Memulai?

  1. Bagaimana Memulai Server Vnc Saat Boot?

  2. Bagaimana Cara Memuat Program Untuk Memulai Lebih Cepat?

  3. Bagaimana Memulai Banjir di Latar Belakang?

  1. Cara Menampilkan Baris Tertentu dari File di Baris Perintah Linux

  2. Bagaimana cara memulai Ubuntu dari Initramfs?

  3. Bagaimana PulseAudio dimulai?