เตรียมพร้อมที่จะทำให้มือของคุณสกปรก
บนขอบของสิ่งที่ฉันรู้สึกว่าเราสามารถขอให้ผู้ใช้ทำ แต่ในทางกลับกันเมื่อคำแนะนำชัดเจนทำไมไม่ ดังนั้นที่นี่เราไป ...
กระบวนการพื้นหลังเพื่อตั้งค่าที่ควรตรวจสอบหน้าต่างใหม่
ตัวอย่าง 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();
}
}
ต้องรวบรวมข้อมูลตัวอย่าง Vala ในการทำเช่นนั้นคุณต้องติดตั้งบางสิ่ง:
sudo apt install valac libwnck-3-dev libgtk-3-dev
คัดลอกตัวอย่างด้านล่างบันทึกเป็น win_tomonitor.vala
รวบรวมตัวอย่างด้วยคำสั่ง:
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 นั้นโง่ แต่จำเป็น) ไฟล์ปฏิบัติการจะถูกสร้างขึ้นในไดเรกทอรีการทำงาน
- ค้นหาชื่อของจอภาพหลักของคุณโดยเรียกใช้คำสั่ง
xrandr
ในเทอร์มินัล
เรียกใช้โปรแกรมปฏิบัติการที่มีจอภาพเป้าหมายเป็นอาร์กิวเมนต์เช่น
/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();
}
}