Ich habe eine Dual-Display-Konfiguration und möchte, dass alle neuen und alten Anwendungen auf dem primären Display starten, das sich auf der rechten Seite befindet. Einige Apps starten jedoch auf dem zweiten Bildschirm, unabhängig davon, wo sich der Fokus / Mauszeiger befindet. Ich denke, das liegt daran, dass sich oben:linke Ecke 0:0 auf dem zweiten Monitor befindet. Und es ist größer als primär, kann das eine Ursache sein?
Sekundär ist ein Fernseher, auf dem ich Kodi ausführe, der eine Einstellung zur Auswahl der Anzeige hat.
Möglicherweise gibt es einige Apps, die sich für jede App-Position und -Anzeige erinnern und auch darauf achten, wenn die zweite ausgeschaltet ist – das heißt, sich an die Position erinnern, bis der Monitor wieder eingeschaltet ist. In früheren Versionen von ubuntu compiz tun Sie das, aber nicht mehr.
Update:DE in Zimt geändert
Akzeptierte Antwort:
Machen Sie sich darauf gefasst, sich die Hände schmutzig zu machen
Am Rande dessen, was wir von den Benutzern verlangen könnten, aber andererseits, wenn die Anweisungen klar sind, warum nicht? Also los geht's…
Hintergrundprozess, um einzustellen, auf welchem Monitor neue Fenster erscheinen 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 ein paar Dinge installieren:
sudo apt install valac libwnck-3-dev libgtk-3-dev
-
Kopieren Sie das folgende Snippet und speichern Sie es als
win_tomonitor.vala
-
Kompilieren Sie das Snippet mit dem 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, aber notwendig), eine ausführbare Datei wird im Arbeitsverzeichnis erstellt.
- Finden Sie den Namen Ihres primären Monitors heraus, indem Sie den Befehl
xrandr
ausführen im Terminal. -
Führen Sie die ausführbare Datei mit dem Zielmonitor als Argument aus, z. B.
/path/to/win_tomonitor HDMI-1
Neue („normale“) Fenster werden auf 100 Pixel (x + y) von oben links auf dem Zielmonitor angezeigt.
NB.
Wenn Sie dies als Startelement hinzufügen, müssen Sie möglicherweise eine Pause von einigen Sekunden hinzufügen, bevor Sie es ausführen. Wenn Sie beim Anmelden/Starten auf Probleme stoßen, erwähnen Sie bitte.
Verwandte:Ändern Sie den Benachrichtigungs- (Alarm-) Ton in Ubuntu?BEARBEITEN
Nachfolgend eine bearbeitete Version (auf Anfrage). Unterschiede:
- Diese Version überspringt Aktionen in Fenstern, die sich bereits auf dem Zielmonitor befinden.
-
Diese Version erlaubt das Setzen von ausgeschlossenem
WM_CLASS
-es. Um eine oder mehrere Klassen auszuschließen:Fügen Sie nach zusätzliche Argumente hinzu das gezielte Monitor-Argument. Ein Beispiel:/path/to/win_tomonitor HDMI-1 Tilix Gedit
sowohl Tilix- als auch Gedit-Fenster vom Verschieben auszuschließen.
Das Setup ist genau das gleiche wie die erste Version. Viel Spaß!
Die WM_CLASS eines Fensters herausfinden
- Öffnen Sie ein Terminalfenster
- Geben Sie
xprop
ein , Drücken Sie Return - Klicken Sie auf das Zielfenster, The
WM_CLASS
erscheint im Terminal
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();
}
}