Как к приложениям запусков всегда на главном дисплее?

Я имею двойную конфигурацию дисплея и хочу все новые и старые приложения, запускаются на главном дисплее, который является справа. Но некоторые приложения запускаются на втором экране, независимо где фокус/указатель мыши. Я думаю, что это вызвано тем, что top:left угол 0:0 находится на втором мониторе. И ее большее, затем основное, это может быть причиной?

Вторичный ТВ, куда я выполняю kodi, которые имеют установку для выбора дисплея.

Может ли быть существует некоторое приложение, что помнит за каждое положение приложения и дисплей, и также заботится, когда второй выключен - средний, помнят положение, пока монитор не работает снова. В более ранних версиях человечности compiz делают это, но не больше.

Обновление: Измененный DE к корице

10
задан 9 April 2019 в 12:00

1 ответ

Будьте готовы пачкать руки
На краю того, что я чувствую, что мы могли попросить, чтобы пользователи сделали, но с другой стороны, когда указания являются четкими, почему нет? Таким образом, здесь мы идем...


Фоновый процесс для установки, на котором мониторе должны появиться новые окна

Отрывок 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. Отрывок Vala должен быть скомпилирован. Чтобы сделать так, необходимо установить несколько вещей:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Скопируйте отрывок ниже, сохраните его как win_tomonitor.vala

  3. Скомпилируйте отрывок с командой:

    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' 
    

    (Я знаю, wnck аргумент глуп, но необходимый), исполняемый файл будет произведен в рабочем каталоге.

  4. Узнайте название своего основного монитора путем выполнения команды xrandrв терминале.
  5. Выполните исполняемый файл с целенаправленным монитором как аргумент, например.

    /path/to/win_tomonitor HDMI-1
    

Новые ("нормальные") окна появятся на 100 пкс (x + y) от верхнего левого из целенаправленного монитора.

N.B.

При добавлении этого как объекта запуска Вы, возможно, должны были бы добавить повреждение нескольких секунд прежде, чем выполнить его. При столкновении с проблемами о входе в систему/запуске упомяните.


Править

Ниже отредактированной версии (по запросу). Различия:

  • Эта версия пропускает действие с окнами, которые уже находятся на целенаправленном мониторе.
  • Эта версия позволяет устанавливать исключенный WM_CLASS - es. Исключить один или несколько классов: добавьте дополнительные аргументы после целенаправленного монитора - аргумент. Пример:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    исключить и Tilix и gedit окна от перемещения.

Установка является точно тем же как первой версией.развлекайтесь!

Узнайте WM_CLASS окна

  • Откройте окно терминала
  • Ввести xprop, Нажмите Return
  • нажмите на целенаправленное окно, WM_CLASS появляется в терминале

Код

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();
    }
}
13
ответ дан 23 November 2019 в 04:29

Другие вопросы по тегам:

Похожие вопросы: