Làm thế nào để khởi động ứng dụng luôn trên màn hình chính?


11

Tôi có cấu hình hiển thị kép và muốn tất cả các ứng dụng mới và cũ bắt đầu trên màn hình chính, nằm ở bên phải. Nhưng một số ứng dụng bắt đầu trên màn hình thứ hai, bất kể con trỏ tập trung / chuột ở đâu. Tôi nghĩ điều này là do top: góc trái 0: 0 nằm trên màn hình thứ hai. Và nó lớn hơn sau đó là chính, đây có thể là một nguyên nhân?

Thứ cấp là một TV nơi tôi chạy kodi, có cài đặt để chọn hiển thị.

Có thể có một số ứng dụng ghi nhớ cho mọi vị trí và hiển thị ứng dụng, và cũng cẩn thận khi tắt thứ hai - có nghĩa là vị trí ghi nhớ cho đến khi màn hình được bật lại. Trong các phiên bản trước của ubfox compiz làm điều đó, nhưng không còn nữa.

Cập nhật: Thay đổi DE thành quế


Tôi cũng đang tìm kiếm điều này, bạn đã có may mắn?
Felipe

@Felipe Không có may mắn
LeonidMew

Trong danh sách ứng dụng trong quế, tôi có tùy chọn menu để di chuyển ứng dụng sang màn hình khác, đặc biệt hữu ích khi tắt thứ cấp. Nhưng đây không phải là giải pháp cho một câu hỏi.
LeonidMew

1
Một giải pháp có thể là một quá trình giống như deamon, để coi chừng các cửa sổ mới, di chuyển chúng đến màn hình chính của bạn. Đó sẽ là một giải pháp chấp nhận được? Bạn thậm chí có thể không nhìn thấy nó được di chuyển.
Jacob Vlijm

@JacobVlijm Vâng, đây có thể là giải pháp. Nhưng tôi không biết cách viết nó, bạn có thể vui lòng đưa ra hai đoạn mã - cách xác định cửa sổ mới và cách di chuyển
LeonidMew

Câu trả lời:


13

Hãy chuẩn bị để có được bàn tay của bạn
ở rìa của những gì tôi cảm thấy chúng ta có thể yêu cầu người dùng làm, nhưng mặt khác, khi các hướng dẫn rõ ràng, tại sao không? Vì vậy, ở đây chúng tôi đi ...


Quá trình nền để thiết lập trên đó màn hình mới sẽ xuất hiện

Đoạn trích 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. Đoạn mã Vala cần được biên dịch. Để làm như vậy, bạn cần cài đặt một số điều:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Sao chép đoạn mã dưới đây, lưu nó dưới dạng win_tomonitor.vala

  3. Biên dịch đoạn mã bằng lệnh:

    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' 
    

    (Tôi biết, đối số wnck là ngớ ngẩn, nhưng cần thiết), một thực thi sẽ được tạo ra trong thư mục làm việc.

  4. Tìm ra tên của màn hình chính của bạn bằng cách chạy lệnh xrandrtrong thiết bị đầu cuối.
  5. Chạy chương trình thực thi với màn hình được nhắm mục tiêu làm đối số, ví dụ:

    /path/to/win_tomonitor HDMI-1
    

Các cửa sổ mới ("bình thường") sẽ xuất hiện trên 100px (x + y) từ topleft của màn hình được nhắm mục tiêu.

Lưu ý

Khi thêm mục này dưới dạng mục khởi động, bạn có thể cần thêm một vài giây trước khi chạy nó. Nếu bạn gặp vấn đề về đăng nhập / khởi động, xin vui lòng đề cập.


BIÊN TẬP

Dưới đây là một phiên bản chỉnh sửa (theo yêu cầu). Sự khác biệt:

  • Phiên bản này bỏ qua hành động trên các cửa sổ đã có trên màn hình được nhắm mục tiêu.
  • Phiên bản này cho phép thiết lập loại trừ WM_CLASS. Để loại trừ một hoặc nhiều lớp: thêm đối số bổ sung sau đối số màn hình được nhắm mục tiêu. Một ví dụ:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    để loại trừ cả Tilix và cửa sổ gedit khỏi di chuyển.

Thiết lập giống hệt như phiên bản đầu tiên. Chúc vui vẻ!

Tìm hiểu WM_CLASS của một cửa sổ

  • Mở một cửa sổ đầu cuối
  • xprop, bấmReturn
  • bấm vào cửa sổ được nhắm mục tiêu, Xuất WM_CLASShiện trong thiết bị đầu cuối

Mật mã

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

Lệnh valac không tìm thấy. Khi tôi cố gắng cài đặt nó với apt install valac, script không tìm thấy một số IP
Rodolfo Velasco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.