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();
}
}
Đ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
Sao chép đoạn mã dưới đây, lưu nó dưới dạng win_tomonitor.vala
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.
- 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
xrandr
trong thiết bị đầu cuối.
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
- Gõ
xprop
, bấmReturn
- bấm vào cửa sổ được nhắm mục tiêu, Xuất
WM_CLASS
hiệ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();
}
}