항상 특정 디스플레이에서 앱을 시작하는 방법은 무엇입니까?


11

이중 디스플레이 구성이 있고 모든 새 응용 프로그램과 기존 응용 프로그램이 기본 디스플레이 (오른쪽)에서 시작되기를 원합니다. 그러나 일부 앱은 포커스 / 마우스 포인터의 위치에 관계없이 두 번째 화면에서 시작됩니다. 나는 이것이 top : left corner 0 : 0이 두 번째 모니터에 있기 때문이라고 생각합니다. 그리고 그보다 더 큰 것이 주 원인 일 수 있습니까?

보조는 kodi를 실행하는 TV이며 디스플레이를 선택할 수있는 설정이 있습니다.

모든 앱 위치 및 디스플레이에 대해 기억해야 할 앱이있을 수 있으며 두 번째 앱이 꺼질 때도주의해야합니다. 모니터가 다시 켜질 때까지 위치를 기억하십시오. 이전 버전의 우분투 compiz는 그렇게하지만 더 이상은하지 않습니다.

업데이트 : DE를 계피로 변경했습니다.


나도 이것을 찾고 있는데 운이 있었습니까?
Felipe

@Felipe 운이 없다
LeonidMew

계피의 응용 프로그램 목록에는 앱을 다른 모니터로 옮길 수있는 메뉴 옵션이 있으며 특히 보조가 꺼져있을 때 유용합니다. 그러나 이것은 질문에 대한 해결책이 아닙니다.
LeonidMew

1
해결책은 약간의 악마 같은 프로세스 일 수 있습니다. 새 창을 조심하고 기본 화면으로 옮기십시오. 이것이 수용 가능한 솔루션일까요? 당신은 아마 그것이 움직이는 것을 보지 못할 것입니다.
Jacob Vlijm

@JacobVlijm 예, 이것은 해결책이 될 수 있습니다. 그러나 나는 그것을 작성하는 방법을 모른다, 당신은 두 개의 코드 조각을 줄 수 있습니까-새로운 창을 결정하는 방법과 이동하는 방법
LeonidMew

답변:


13

손이 더러워 질 수 있도록 준비하십시오.
사용자가 할 수 있다고 생각하는 것의 가장자리에서 지시 사항이 명확 할 때 왜 그렇지 않습니까? 그래서 우리는 간다 ...


새 모니터를 표시해야하는 백그라운드 프로세스

발라 스 니펫

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
    

대상 모니터의 왼쪽 위에서 100px (x + y)에 새 ( "정상") 창이 나타납니다.

NB

이것을 시작 항목으로 추가 할 때 실행하기 전에 몇 초의 휴식을 추가해야 할 수도 있습니다. 로그인 / 시작시 문제가 발생하면 언급하십시오.


편집하다

편집 된 버전 아래 (요청시). 차이점 :

  • 이 버전은 이미 대상 모니터에있는 창의 조치를 건너 뜁니다.
  • 이 버전에서는 제외 된 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();
    }
}

valac 명령을 찾을 수 없습니다. apt install valac로 설치하려고하면 스크립트가 IP를 찾지 못합니다
Rodolfo Velasco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.