วิธีเริ่มแอพบนหน้าจอเฉพาะเสมอ


11

ฉันมีการกำหนดค่าการแสดงผลคู่และต้องการให้แอปพลิเคชั่นใหม่และเก่าทั้งหมดเริ่มต้นที่จอแสดงผลหลักซึ่งอยู่ทางขวา แต่แอพบางตัวเริ่มต้นที่หน้าจอที่สองไม่ว่าตัวชี้โฟกัส / เมาส์จะอยู่ที่ใด ฉันคิดว่าเป็นเพราะมุมบนซ้าย 0: 0 อยู่บนหน้าจอที่สอง และยิ่งใหญ่กว่าตอนแรกมันอาจเป็นสาเหตุได้หรือ

ลำดับที่สองคือทีวีที่ฉันใช้โคดีซึ่งมีการตั้งค่าให้เลือกแสดงผล

อาจมีแอพบางตัวที่จำได้สำหรับทุกตำแหน่งแอปและหน้าจอและยังต้องระมัดระวังเมื่อปิดสวิตช์ที่สอง - หมายถึงตำแหน่งจำจนกว่าจะเปิดจอภาพอีกครั้ง ในรุ่นก่อนหน้าของ ubuntu compiz ทำเช่นนั้น แต่ไม่มีอีกต่อไป

อัปเดต: เปลี่ยน DE เป็นอบเชย


ฉันกำลังมองหาสิ่งนี้คุณมีโชคหรือไม่?
เฟลิเป้

@Felipe No luck
LeonidMew

ในรายการแอปพลิเคชันในซินนามอนฉันมีตัวเลือกเมนูเพื่อย้ายแอพไปยังจอภาพอื่น ๆ ซึ่งมีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อปิดใช้งานรอง แต่นี่ไม่ใช่ทางออกสำหรับคำถาม
LeonidMew

1
วิธีแก้ปัญหาอาจเป็นขั้นตอนที่คล้ายกับผู้ไม่ประมาทในการระวังหน้าต่างใหม่ให้ย้ายพวกเขาไปที่หน้าจอหลักของคุณ นั่นจะเป็นทางออกที่ยอมรับได้หรือไม่? คุณอาจจะไม่เห็นว่ามันถูกย้ายไป
Jacob Vlijm

@JacobVlijm ใช่นี่เป็นวิธีแก้ปัญหา แต่ฉันไม่รู้วิธีการเขียนคุณสามารถให้โค้ดสองชิ้น - วิธีกำหนดหน้าต่างใหม่และวิธีการเคลื่อนย้าย
LeonidMew

คำตอบ:


13

เตรียมพร้อมที่จะทำให้มือของคุณสกปรก
บนขอบของสิ่งที่ฉันรู้สึกว่าเราสามารถขอให้ผู้ใช้ทำ แต่ในทางกลับกันเมื่อคำแนะนำชัดเจนทำไมไม่ ดังนั้นที่นี่เราไป ...


กระบวนการพื้นหลังเพื่อตั้งค่าที่ควรตรวจสอบหน้าต่างใหม่

ตัวอย่าง 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. ต้องรวบรวมข้อมูลตัวอย่าง Vala ในการทำเช่นนั้นคุณต้องติดตั้งบางสิ่ง:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. คัดลอกตัวอย่างด้านล่างบันทึกเป็น win_tomonitor.vala

  3. รวบรวมตัวอย่างด้วยคำสั่ง:

    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' 
    

    (ฉันรู้ว่าอาร์กิวเมนต์ wnck นั้นโง่ แต่จำเป็น) ไฟล์ปฏิบัติการจะถูกสร้างขึ้นในไดเรกทอรีการทำงาน

  4. ค้นหาชื่อของจอภาพหลักของคุณโดยเรียกใช้คำสั่งxrandrในเทอร์มินัล
  5. เรียกใช้โปรแกรมปฏิบัติการที่มีจอภาพเป้าหมายเป็นอาร์กิวเมนต์เช่น

    /path/to/win_tomonitor HDMI-1
    

หน้าต่างใหม่ ("ปกติ") จะปรากฏบน 100px (x + y) จากด้านบนของจอภาพเป้าหมาย

NB

เมื่อเพิ่มสิ่งนี้เป็นรายการเริ่มต้นคุณอาจต้องเพิ่มตัวแบ่งสักสองสามวินาทีก่อนที่จะเรียกใช้ หากคุณพบปัญหาในการเข้าสู่ระบบ / การเริ่มต้นโปรดพูดถึง


แก้ไข

ด้านล่างรุ่นที่แก้ไข (ตามคำขอ) แตกต่าง:

  • รุ่นนี้จะข้ามการดำเนินการบน windows ซึ่งมีอยู่แล้วบนจอภาพที่เป็นเป้าหมาย
  • รุ่นนี้ช่วยให้การตั้งค่าได้รับการยกเว้นWM_CLASS-es หากต้องการยกเว้นหนึ่งคลาสขึ้นไปให้เพิ่มอาร์กิวเมนต์พิเศษหลังการตรวจสอบเป้าหมายที่กำหนดไว้ ตัวอย่าง:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    เพื่อยกเว้นหน้าต่าง Tilix และ gedit ไม่ให้เคลื่อนที่

การตั้งค่าเหมือนกับเวอร์ชั่นแรกทุกประการ มีความสุข!

ค้นหา WM_CLASS ของหน้าต่าง

  • เปิดหน้าต่างเทอร์มินัล
  • ประเภทxprop, กดReturn
  • คลิกที่หน้าต่างเป้าหมาย, The WM_CLASSปรากฏในเทอร์มินัล

รหัส

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

ไม่พบคำสั่ง valac เมื่อฉันพยายามที่จะติดตั้งด้วยการติดตั้ง valac สคริปต์ไม่พบ IP บางตัว
Rodolfo Velasco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.