GNU/Linux >> Tutoriales Linux >  >> Ubuntu

¿Cómo iniciar aplicaciones siempre en una pantalla específica?

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();
    }
}
  1. El fragmento de Vala debe compilarse. Para hacerlo, debe 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 producirá un ejecutable en el directorio de trabajo.

  4. Averigüe el nombre de su monitor principal ejecutando el comando xrandr en la terminal.
  5. 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();
    }
}

Ubuntu
  1. Cómo ejecutar aplicaciones de Windows en tu PC con Ubuntu

  2. ¿Cómo precargar un programa para un inicio más rápido?

  3. Cómo mostrar líneas específicas de un archivo en la línea de comandos de Linux

  4. ¿Cómo inicio Ubuntu desde Initramfs?

  5. ¿Cómo configuro monit para iniciar un proceso con un usuario específico?

Cómo restablecer la cuadrícula de aplicaciones en GNOME 3.38

Cómo iniciar TeamViewer en Debian 11

Cómo mostrar PPID en Linux

¿Cómo ver o instalar aplicaciones táctiles de Ubuntu?

¿Cómo regenerar una miniatura específica en Nautilus?

¿Cómo mostrar las letras de las canciones?