Ho una configurazione a doppio display e voglio che tutte le nuove e vecchie applicazioni inizino sul display principale, che si trova sulla destra. Ma alcune app si avviano sul secondo schermo, indipendentemente da dove si trovi lo stato attivo/il puntatore del mouse. Penso che ciò sia dovuto al fatto che in alto:l'angolo sinistro 0:0 è sul secondo monitor. Ed è più grande della primaria, può essere una causa?
Il secondario è un televisore su cui eseguo kodi, che ha un'impostazione per scegliere il display.
Potrebbero esserci alcune app che ricordano per ogni posizione e display dell'app, e anche fare attenzione quando il secondo è spento:significa ricordare la posizione fino a quando il monitor non si riaccende. Nelle versioni precedenti di ubuntu compiz fallo, ma non di più.
Aggiornamento:DE modificato in cannella
Risposta accettata:
Preparati a sporcarti le mani
Al limite di quello che penso potremmo chiedere agli utenti di fare, ma d'altra parte, quando le istruzioni sono chiare, perché no? Quindi eccoci qui...
Processo in background per impostare su quale monitor devono apparire le nuove finestre
Il frammento di 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();
}
}
-
Lo snippet Vala deve essere compilato. Per farlo devi installare alcune cose:
sudo apt install valac libwnck-3-dev libgtk-3-dev
-
Copia lo snippet qui sotto, salvalo come
win_tomonitor.vala
-
Compila lo snippet con il comando:
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'
(Lo so, l'argomento wnck è sciocco, ma necessario), verrà prodotto un eseguibile nella directory di lavoro.
- Scopri il nome del tuo monitor principale eseguendo il comando
xrandr
nel terminale. -
Esegui l'eseguibile con il monitor di destinazione come argomento, ad es.
/path/to/win_tomonitor HDMI-1
Nuove finestre ("normali") appariranno a 100 px (x + y) dall'alto a sinistra del monitor di destinazione.
NB
Quando lo aggiungi come elemento di avvio, potresti dover aggiungere un'interruzione di alcuni secondi prima di eseguirlo. Se riscontri problemi durante l'accesso/avvio, menziona.
Correlati:modificare il suono di notifica (avviso) in Ubuntu?MODIFICA
Di seguito una versione modificata (su richiesta). Differenze:
- Questa versione salta l'azione sulle finestre che sono già sul monitor di destinazione.
-
Questa versione permette di impostare il
WM_CLASS
escluso -es. Per escludere una o più classi:aggiungi argomenti extra dopo l'argomento monitor mirato. Un esempio:/path/to/win_tomonitor HDMI-1 Tilix Gedit
per escludere le finestre di Tilix e gedit dallo spostamento.
L'installazione è esattamente la stessa della prima versione. Buon divertimento!
Scopri la WM_CLASS di una finestra
- Apri una finestra di terminale
- Digita
xprop
, Premi Invio - fai clic sulla finestra di destinazione, The
WM_CLASS
appare nel terminale
Il codice
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();
}
}