Devilspie2を使用した複数ウィンドウの配置

Devilspie2を使用した複数ウィンドウの配置

私はしばしば2つのFirefoxウィンドウを同時に開き、画面の反対側の角に配置するのが好きです。 Devilspie2 構成ファイルに関連セクションがあります。

--if string.match(get_window_name(), "Mozilla Firefox")
if get_application_name() == "Firefox"
then
    -- Apply default immediately
    set_window_geometry(1040,32,878, 950);

    -- Second window
    --os.execute("sleep " .. 10);
    if string.match(get_window_name(), "MySite")
    then
        set_window_geometry(0, 374, 824, 666);
    end
end

しかし、2番目のウィンドウは常にデフォルトの位置を持ちます。

私の観察によると、Firefoxがサイトをロードしてウィンドウのタイトルを調整する前に、Devilspie2がウィンドウの処理を完了したことがわかりました。これに応じて睡眠が追加されましたが、違いはありません。私は寝ないで1秒、10秒間寝ようとしましたが、成功しませんでした。私はLuaプログラマーではありません。 Web検索でos.execute()のヒントを得ました。同様に、最初にget_window_name()またはget_application_name()を使用しても違いはありません。

この質問は関連しているかもしれませんが、まだ答えを受けていません。 Devilspie2は、再起動時にのみFirefoxウィンドウを検出します。この問題をどのように解決できますか?

Devilspie2がウィンドウタイトルの変更に反応するようにする方法を知っている人はいますか?

答え1

devilspie2私が理解したように、Luaコードは、ウィンドウの作成、ウィンドウの破壊、またはフォーカスアクティブなウィンドウの変更によって発生するイベントでのみ実行されます。libwnck

ウィンドウのプロパティ(ウィンドウ名など)を変更するとイベントがキューに追加されますが、luaがDevilspie2のメインループに制御を返すまでキューが処理されないため、luaでスリープを使用すると役に立ちません。この時点で、libwnckは情報を更新しますが、新しい作成、破壊、またはフォーカスイベントが発生するまでDevilspie2でluaを再呼び出ししません。

1つの可能性は、標準のX11ユーティリティを使用してウィンドウ名を取得することです。 xpropos.execute("sleep " .. 10);次のようなものを使う代わりに

local id = get_window_xid
local cmd = "xprop -id " .. id .. " WM_NAME"
local file = io.popen("sleep 10; " .. cmd)
local windowname = file:read("*a")
file:close()

私はLuaの専門家ではなく、上記をテストしていません。このxpropコマンドは、現在のウィンドウの10進ウィンドウIDを提供し、WM_NAME属性を要求します。この属性は次の形式で出力されます。

WM_NAME(STRING) = "MySite"

それからあなたは利用可能でなければなりません

string.match(windowname, "MySite")

できるだけ早く一致するものを見つけるには、単一のsleep / xpropを短いsleep / xpropの有限ループに置き換えると便利です。

答え2

@meuhの答えからインスピレーションを得ました。私はxdotoolを見て動作するような次のスクリプトを思いついた。

#!/bin/bash
firefox_cmd="firefox ..."
$firefox_cmd &
pid=$!
xdotool search --sync --onlyvisible --pid $pid \
  windowactivate \
  windowmove 0 270 windowsize 870 900

関連情報