常にプライマリディスプレイでアプリを起動する方法は?


11

デュアルディスプレイ構成で、すべての新旧のアプリケーションを右側にあるプライマリディスプレイから起動したいと思います。ただし、フォーカス/マウスポインターの場所に関係なく、一部のアプリはセカンドスクリーンで起動します。これは、top:left corner 0:0が2番目のモニター上にあるためだと思います。そして、そのプライマリよりも大きい、これは原因になるのでしょうか?

セカンダリは、ディスプレイを選択する設定がある、kodiを実行するテレビです。

すべてのアプリの位置と表示を記憶しているアプリがあるかもしれません。また、2番目がオフになっているときは注意してください。つまり、モニターが再びオンになるまで、位置を覚えておいてください。以前のバージョンのubuntu compizではそれを行いますが、それ以上は行いません。

更新:DEをシナモンに変更


私もこれを探しています、運はありましたか?
フェリペ

@Felipe運がない
LeonidMew

シナモンのアプリケーションリストで、アプリを別のモニターに移動するメニューオプションがあります。これは、セカンダリがオフになっている場合に特に便利です。しかし、これは問題の解決策ではありません。
LeonidMew

1
解決策は、少しデーモンのようなプロセスであり、新しいウィンドウに注意して、それらをプライマリ画面に移動します。それは許容できる解決策でしょうか?あなたはおそらくそれが動かされているのを見さえしないでしょう。
Jacob Vlijm

@JacobVlijmはい、これは解決策になる可能性があります。しかし、私はそれを書く方法がわかりません。2つのコードを教えてください-新しいウィンドウを決定する方法と移動する方法
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 を設定できます。1つ以上のクラスを除外するは、ターゲットのmonitor-引数のに引数を追加します。例:

    /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.