손이 더러워 질 수 있도록 준비하십시오.
사용자가 할 수 있다고 생각하는 것의 가장자리에서 지시 사항이 명확 할 때 왜 그렇지 않습니까? 그래서 우리는 간다 ...
새 모니터를 표시해야하는 백그라운드 프로세스
발라 스 니펫
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
이것을 시작 항목으로 추가 할 때 실행하기 전에 몇 초의 휴식을 추가해야 할 수도 있습니다. 로그인 / 시작시 문제가 발생하면 언급하십시오.
편집하다
편집 된 버전 아래 (요청시). 차이점 :
- 이 버전은 이미 대상 모니터에있는 창의 조치를 건너 뜁니다.
이 버전에서는 제외 된 WM_CLASS
-es 를 설정할 수 있습니다 . 하나 이상의 클래스를 제외 시키려면 : 대상 모니터 인수 뒤에 추가 인수를 추가하십시오 . 예를 들면 :
/path/to/win_tomonitor HDMI-1 Tilix Gedit
Tilix 및 gedit 창을 모두 이동에서 제외합니다.
설정은 첫 번째 버전과 동일합니다. 즐기세요!
창의 WM_CLASS 알아보기
- 터미널 창을 엽니 다
- 유형
xprop
, 프레스Return
- 대상 창을 클릭하면
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();
}
}