¿Cómo iniciar aplicaciones siempre en la pantalla principal?

11

Tengo una configuración de pantalla dual y quiero que todas las aplicaciones nuevas y antiguas comiencen en la pantalla principal, que está a la derecha. Pero algunas aplicaciones comienzan en la segunda pantalla, independientemente de dónde esté el foco / 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 primaria, ¿puede ser esto una causa?

Secundario es un televisor donde ejecuto kodi, que tiene una configuración para elegir la pantalla.

Es posible que haya algunas aplicaciones que recuerden para cada posición y pantalla de la aplicación, y que también se cuiden cuando se apaga la segunda, es decir, recuerde la posición hasta que el monitor vuelva a estar encendido. En versiones anteriores de ubuntu compiz haz eso, pero no más.

Actualización: se cambió DE a canela

LeonidMew
fuente
También estoy buscando esto, ¿has tenido suerte?
Felipe
@Felipe Sin suerte
LeonidMew
En la lista de aplicaciones en canela, tengo la opción de menú para mover la aplicación a un monitor diferente, es útil especialmente cuando la secundaria está desactivada. Pero esto no es la solución a una pregunta.
LeonidMew
1
Una solución podría ser un pequeño proceso parecido a un demonio, para estar atento a las nuevas ventanas, muévalas a su pantalla principal. ¿Sería esa una solución aceptable? Probablemente ni siquiera lo verías moverse.
Jacob Vlijm
@JacobVlijm Sí, esta puede ser la solución. Pero no sé cómo escribirlo, ¿podría dar dos piezas de código: cómo determinar una nueva ventana y cómo moverse
LeonidMew

Respuestas:

13

Esté preparado para ensuciarse las manos
Al borde de lo que siento 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 deberían 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();
    }
}
  1. El fragmento de Vala necesita ser compilado. Para hacerlo, necesita instalar algunas cosas:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Copie el fragmento a continuación, guárdelo como win_tomonitor.vala

  3. 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 generará un ejecutable en el directorio de trabajo.

  4. Descubra el nombre de su monitor principal ejecutando el comando xrandren la terminal.
  5. Ejecute el ejecutable con el monitor de destino como argumento, p. Ej.

    /path/to/win_tomonitor HDMI-1
    

Aparecerán nuevas ventanas ("normales") en 100 px (x + y) desde la parte superior del monitor de destino.

nótese bien

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, por favor mencione.


EDITAR

Debajo de una versión editada (bajo pedido). Diferencias:

  • Esta versión omite la acción en ventanas que ya están en el monitor de destino.
  • Esta versión permite configurar excluidos WM_CLASS-es. Para excluir una o más clases: agregue argumentos adicionales después del argumento del monitor objetivo. Un ejemplo:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    para excluir las ventanas Tilix y gedit del movimiento.

La configuración es exactamente la misma que la primera versión. ¡Que te diviertas!

Descubre la WM_CLASS de una ventana

  • Abrir una ventana de terminal
  • Tipo xprop, prensaReturn
  • haga clic en la ventana de destino, WM_CLASSaparece 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();
    }
}
Jacob Vlijm
fuente
Comando valac no encontrado. Cuando intento instalarlo con apt install valac, el script no encuentra algunas IP
Rodolfo Velasco