Ellerinizi kirletmeye hazır olun
Kullanıcılardan yapmalarını isteyebileceğimizi düşündüğümüz şeyin kenarındayken, diğer yandan talimatlar net olduğunda neden olmasın? İşte başlıyoruz ...
Hangi monitörlerin yeni pencerelerin görüneceğini ayarlamak için arka plan işlemi
Vala pasajı
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 snippet'inin derlenmesi gerekir. Bunu yapmak için birkaç şey yüklemeniz gerekir:
sudo apt install valac libwnck-3-dev libgtk-3-dev
Aşağıdaki parçacığı kopyalayın, olarak kaydedin win_tomonitor.vala
Parçacığı şu komutla derleyin:
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'
(Biliyorum, wnck argümanı aptalca, ama gerekli), çalışma dizininde bir yürütülebilir dosya üretilecek.
xrandr
Terminalde komutu çalıştırarak birincil monitörünüzün adını bulun .
Yürütülebilir dosyayı hedeflenen monitörle bağımsız değişken olarak çalıştırın, örn.
/path/to/win_tomonitor HDMI-1
Yeni ("normal") pencereler, hedeflenen monitörün üst solundan 100 piksel (x + y) üzerinde görünür.
NB
Bunu başlangıç öğesi olarak eklerken, çalıştırmadan önce birkaç saniye ara vermeniz gerekebilir. Giriş / başlangıçta sorunla karşılaşırsanız lütfen belirtin.
DÜZENLE
Düzenlenmiş bir sürümün altında (istek üzerine). farklılıklar:
- Bu sürüm, zaten hedeflenen monitörde olan pencerelerde eylem atlar.
Bu sürüm hariç tutulan WM_CLASS
-es ayarlarına izin verir . Bir veya daha fazla sınıfı hariç tutmak için: hedeflenen izleme bağımsız değişkeninden sonra ekstra bağımsız değişkenler ekleyin . Bir örnek:
/path/to/win_tomonitor HDMI-1 Tilix Gedit
hem Tilix hem de gedit pencerelerinin taşınmasını engellemek için.
Kurulum ilk sürümle tamamen aynıdır. İyi eğlenceler!
Bir pencerenin WM_CLASS'sını bulun
- Bir terminal penceresi açın
- Türü
xprop
, BasınReturn
- hedeflenen pencereye tıklayın,
WM_CLASS
terminalde görünür
Kod
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();
}
}