Seien Sie bereit, sich die Hände schmutzig zu machen.
Ich bin der Meinung, dass wir die Benutzer dazu auffordern könnten, dies zu tun. Wenn die Anweisungen jedoch klar sind, warum nicht? Auf geht's...
Hintergrundprozess zum Festlegen, auf welchem Monitor neue Fenster angezeigt werden sollen
Das Vala-Snippet
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();
}
}
Das Vala-Snippet muss kompiliert werden. Dazu müssen Sie einige Dinge installieren:
sudo apt install valac libwnck-3-dev libgtk-3-dev
Kopieren Sie das folgende Snippet und speichern Sie es unter win_tomonitor.vala
Kompilieren Sie das Snippet mit dem folgenden Befehl:
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'
(Ich weiß, das wnck-Argument ist albern, wird aber benötigt), eine ausführbare Datei wird im Arbeitsverzeichnis erstellt.
- Ermitteln Sie den Namen Ihres primären Monitors, indem Sie den Befehl
xrandr
im Terminal ausführen .
Führen Sie die ausführbare Datei mit dem Zielmonitor als Argument aus, z
/path/to/win_tomonitor HDMI-1
Neue ("normale") Fenster werden auf 100px (x + y) oben links vom Zielmonitor angezeigt.
NB
Wenn Sie dies als Startelement hinzufügen, müssen Sie möglicherweise einige Sekunden Pause einlegen, bevor Sie es ausführen. Wenn Sie beim Anmelden / Starten auf Probleme stoßen, erwähnen Sie dies bitte.
BEARBEITEN
Unten eine bearbeitete Version (auf Anfrage). Unterschiede:
- Diese Version überspringt Aktionen in Fenstern, die sich bereits auf dem Zielmonitor befinden.
Diese Version erlaubt es, ausgeschlossene WM_CLASS
-es zu setzen . So schließen Sie eine oder mehrere Klassen aus: Fügen Sie nach dem Zielmonitorargument zusätzliche Argumente hinzu. Ein Beispiel:
/path/to/win_tomonitor HDMI-1 Tilix Gedit
um sowohl Tilix- als auch gedit-Fenster vom Verschieben auszuschließen.
Das Setup entspricht genau der ersten Version. Habe Spaß!
Finden Sie die WM_CLASS eines Fensters heraus
- Öffnen Sie ein Terminalfenster
- Typ
xprop
, drückenReturn
- Klicken Sie auf das Zielfenster. Das wird
WM_CLASS
im Terminal angezeigt
Der Code
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();
}
}