Tengo una configuración de pantalla dual y quiero que todas las aplicaciones nuevas y antiguas se inicien en la pantalla principal, que está a la derecha. Pero algunas aplicaciones comienzan en la segunda pantalla, independientemente de dónde esté el foco o el puntero del mouse. Creo que esto se debe a que la esquina superior izquierda 0:0 está en el segundo monitor. Y es más grande que el primario, ¿puede ser una causa?
El secundario es un televisor donde ejecuto kodi, que tiene una configuración para elegir la pantalla.
Puede haber alguna aplicación que recuerde para cada posición y visualización de la aplicación, y también tener cuidado cuando se apaga el segundo, lo que significa recordar la posición hasta que el monitor se encienda nuevamente. En versiones anteriores de ubuntu compiz hace eso, pero no más.
Actualización:Cambió DE a canela
Respuesta aceptada:
Prepárate para ensuciarte las manos
Al borde de lo que creo que podríamos pedirles a los usuarios que hagan, pero por otro lado, cuando las instrucciones son claras, ¿por qué no? Así que aquí vamos…
Proceso en segundo plano para establecer en qué monitor deben aparecer nuevas ventanas
El fragmento 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();
}
}
-
El fragmento de Vala debe compilarse. Para hacerlo, debe instalar algunas cosas:
sudo apt install valac libwnck-3-dev libgtk-3-dev
-
Copie el fragmento a continuación, guárdelo como
win_tomonitor.vala
-
Compile el fragmento con el 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 sé, el argumento wnck es tonto, pero necesario), se producirá un ejecutable en el directorio de trabajo.
- Averigüe el nombre de su monitor principal ejecutando el comando
xrandr
en la terminal. -
Ejecute el ejecutable con el monitor de destino como argumento, por ejemplo,
/path/to/win_tomonitor HDMI-1
Aparecerán ventanas nuevas ("normales") en 100 px (x + y) desde la parte superior izquierda del monitor de destino.
Nota:
Al agregar esto como un elemento de inicio, es posible que deba agregar un descanso de unos segundos antes de ejecutarlo. Si tiene problemas al iniciar sesión/iniciar, menciónelo.
Relacionado:¿Cambiar el sonido de notificación (alerta) en Ubuntu?EDITAR
A continuación una versión editada (bajo petición). Diferencias:
- Esta versión omite la acción en las ventanas que ya están en el monitor de destino.
-
Esta versión permite establecer
WM_CLASS
excluidos -es. Para excluir una o más clases:agregue argumentos adicionales después el argumento del monitor objetivo. Un ejemplo:/path/to/win_tomonitor HDMI-1 Tilix Gedit
para excluir las ventanas de Tilix y gedit del movimiento.
La configuración es exactamente la misma que la primera versión. ¡Diviértete!
Descubre el WM_CLASS de una ventana
- Abrir una ventana de terminal
- Escribe
xprop
, Presione Regresar - haga clic en la ventana objetivo, The
WM_CLASS
aparece en la terminal
El código
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();
}
}