J'ai une configuration à double affichage et je souhaite que toutes les nouvelles et anciennes applications démarrent sur l'affichage principal, qui se trouve à droite. Mais certaines applications démarrent sur le deuxième écran, quel que soit l'endroit où se trouve le focus/le pointeur de la souris. Je pense que c'est parce que le coin supérieur:gauche 0:0 est sur le deuxième moniteur. Et c'est plus gros que primaire, cela peut-il être une cause ?
Secondaire est un téléviseur sur lequel j'exécute Kodi, qui a un paramètre pour choisir l'affichage.
Peut-être y a-t-il des applications qui se souviennent de chaque position et affichage de l'application, et faites également attention lorsque la seconde est éteinte - signifie mémoriser la position jusqu'à ce que le moniteur soit à nouveau allumé. Dans les versions antérieures d'ubuntu compiz, faites cela, mais pas plus.
Mise à jour :DE remplacé par cannelle
Réponse acceptée :
Soyez prêt à vous salir les mains
A la limite de ce que j'ai l'impression qu'on pourrait demander aux utilisateurs de faire, mais d'un autre côté, quand les consignes sont claires, pourquoi pas ? Alors on y va…
Processus d'arrière-plan pour définir sur quel moniteur les nouvelles fenêtres doivent apparaître
L'extrait de 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();
}
}
-
L'extrait de code Vala doit être compilé. Pour ce faire, vous devez installer quelques éléments :
sudo apt install valac libwnck-3-dev libgtk-3-dev
-
Copiez l'extrait ci-dessous, enregistrez-le sous
win_tomonitor.vala
-
Compilez l'extrait avec la commande :
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'
(Je sais, l'argument wnck est idiot, mais nécessaire), un exécutable sera produit dans le répertoire de travail.
- Découvrez le nom de votre moniteur principal en exécutant la commande
xrandr
dans le terminal. -
Exécutez l'exécutable avec le moniteur ciblé comme argument, par exemple
/path/to/win_tomonitor HDMI-1
De nouvelles fenêtres ("normales") apparaîtront sur 100px (x + y) à partir du haut à gauche du moniteur ciblé.
N.B.
Lorsque vous l'ajoutez en tant qu'élément de démarrage, vous devrez peut-être ajouter une pause de quelques secondes avant de l'exécuter. Si vous rencontrez des problèmes lors de la connexion/démarrage, veuillez le mentionner.
Connexe :Modifier le son de notification (alerte) dans Ubuntu ?MODIFIER
Ci-dessous une version éditée (sur demande). Différences :
- Cette version ignore l'action sur les fenêtres qui sont déjà sur le moniteur ciblé.
-
Cette version permet de définir des
WM_CLASS
exclus -es. Pour exclure une ou plusieurs classes :ajoutez des arguments supplémentaires après l'argument du moniteur ciblé. Un exemple :/path/to/win_tomonitor HDMI-1 Tilix Gedit
pour exclure les fenêtres Tilix et gedit du déplacement.
La configuration est exactement la même que la première version. Amusez-vous !
Découvrir la WM_CLASS d'une fenêtre
- Ouvrir une fenêtre de terminal
- Tapez
xprop
, Appuyez sur Retour - cliquez sur la fenêtre ciblée, Le
WM_CLASS
apparaît dans le terminal
Le 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();
}
}