J'ai une configuration à double affichage et je veux que toutes les applications nouvelles et anciennes démarrent sur l'affichage principal, qui est à droite. Mais certaines applications démarrent sur le deuxième écran, quel que soit l'emplacement du pointeur/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 où je lance Kodi, qui a un paramètre pour choisir l'affichage.
Il peut y avoir une application dont vous vous souvenez pour chaque position et affichage de l'application, et faites également attention lorsque la seconde est désactivée - rappelez-vous 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: changé DE en cannelle
Soyez prêt à vous salir les mains
À la limite de ce que je pense que nous pourrions demander aux utilisateurs de faire, mais d'un autre côté, lorsque les instructions sont claires, pourquoi pas? Alors c'est parti ...
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 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.
xrandr
in 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 100 pixels (x + y) à partir de la gauche du moniteur ciblé.
Lors de l'ajout 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 de connexion/démarrage, veuillez le mentionner.
Ci-dessous une version éditée (sur demande). Différences:
Cette version permet de définir les exclus WM_CLASS
-es. Pour exclure une ou plusieurs classes: ajoutez des arguments supplémentaires après l'argument moniteur ciblé. Un exemple:
/path/to/win_tomonitor HDMI-1 Tilix Gedit
pour empêcher le déplacement des fenêtres Tilix et gedit.
La configuration est exactement la même que la première version. S'amuser!
xprop
, appuyez sur ReturnWM_CLASS
apparaît dans le terminalusing 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();
}
}