Como iniciar aplicativos sempre na exibição principal?

11

Tenho uma configuração de tela dupla e quero que todos os aplicativos novos e antigos iniciem na tela principal, que está à direita. Mas alguns aplicativos começam na segunda tela, independentemente de onde está o foco / ponteiro do mouse. Eu acho que isso ocorre porque canto superior esquerdo 0: 0 está no segundo monitor. E é maior do que primário, isso pode ser uma causa?

O secundário é uma TV em que corro o kodi, que tem uma configuração para escolher a exibição.

Pode haver algum aplicativo que seja lembrado para cada posição e exibição do aplicativo e também tome cuidado quando o segundo for desligado - significa lembrar a posição até que o monitor seja ligado novamente. Nas versões anteriores do ubuntu compiz, faça isso, mas não mais.

Atualização: DE alterado para canela

LeonidMew
fonte
Eu também estou procurando por isso, você teve alguma sorte?
Felipe
@Felipe No luck
LeonidMew
Na lista de aplicativos na canela, tenho a opção de menu para mover o aplicativo para um monitor diferente, útil principalmente quando o secundário está desativado. Mas isso não é solução para uma pergunta.
precisa saber é o seguinte
1
Uma solução pode ser um processo parecido com um daemon, para observar novas janelas, movê-las para a tela principal. Essa seria uma solução aceitável? Você provavelmente nem o veria sendo movido.
Jacob Vlijm
@JacobVlijm Sim, isso pode ser uma solução. Mas eu não conhecida como escrevê-lo, você pode por favor dar dois pedaços de código - como determinar nova janela e como mover
LeonidMew

Respostas:

13

Esteja preparado para sujar as mãos
À beira do que acho que poderíamos pedir aos usuários, mas, por outro lado, quando as instruções são claras, por que não? Aqui vamos nos...


Processo em segundo plano para definir em qual monitor novas janelas devem aparecer

O trecho 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. O snippet Vala precisa ser compilado. Para fazer isso, você precisa instalar algumas coisas:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Copie o trecho abaixo, salve-o como win_tomonitor.vala

  3. Compile o trecho com o 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' 
    

    (Eu sei, o argumento wnck é bobo, mas necessário), um executável será produzido no diretório de trabalho.

  4. Descubra o nome do seu monitor principal executando o comando xrandrno terminal.
  5. Execute o executável com o monitor de destino como argumento, por exemplo

    /path/to/win_tomonitor HDMI-1
    

Novas janelas ("normais") aparecerão em 100px (x + y) a partir do tftft do monitor de destino.

NB

Ao adicionar isso como um item de inicialização, pode ser necessário adicionar uma pausa de alguns segundos antes de executá-lo. Se você tiver problemas no login / inicialização, mencione.


EDITAR

Abaixo de uma versão editada (a pedido). Diferenças:

  • Esta versão ignora a ação nas janelas que já estão no monitor de destino.
  • Esta versão permite definir WM_CLASS-es excluídos . Para excluir uma ou mais classes: adicione argumentos extras após o argumento do monitor de destino. Um exemplo:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    para excluir a movimentação das janelas Tilix e gedit.

A instalação é exatamente igual à primeira versão. Diverta-se!

Descubra o WM_CLASS de uma janela

  • Abra uma janela do terminal
  • Tipo xprop, ImprensaReturn
  • clique na janela alvo, WM_CLASSaparece no terminal

O 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
fonte
Comando valac não encontrado. Quando tento instalá-lo com o apt install valac, o script não encontra alguns IPs
Rodolfo Velasco