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

그러나 두 번째 창은 항상 기본 위치를 갖습니다.

내 관찰에 따르면 Firefox가 사이트를 로드하고 창 제목을 조정하기 전에 Devilspie2가 창 처리를 완료한 것으로 나타났습니다. 이에 대한 응답으로 수면이 추가되었지만 별 차이가 없습니다. 저는 잠을 자지 않고 1초, 10초 동안 자려고 노력했지만 성공하지 못했습니다. 저는 Lua 프로그래머가 아닙니다. 웹 검색에서 os.execute() 팁을 얻었습니다. 마찬가지로 처음에 get_window_name() 또는 get_application_name()을 사용해도 아무런 차이가 없습니다.

이 질문은 관련이 있을 수 있지만 아직 답변을 받지 못했습니다. Devilspie2는 재부팅 시에만 Firefox 창을 감지합니다. 이 문제를 어떻게 해결할 수 있나요?.

Devilspie2가 창 제목 변경에 반응하도록 만드는 방법을 아는 사람이 있습니까?

답변1

devilspie2내가 이해한 바에 따르면, Lua 코드는 창 생성, 창 파괴 또는 포커스 활성 창 변경으로 인해 발생하는 이벤트에서만 실행 됩니다.libwnck

창 속성(예: 창 이름)을 변경하면 이벤트가 대기열에 추가되지만 lua가 Devilspie2의 메인 루프에 제어권을 반환할 때까지 대기열이 처리되지 않기 때문에 lua에서 sleep을 사용하면 도움이 되지 않습니다. 이 시점에서 libwnck는 정보를 업데이트하지만 새로운 생성, 파괴 또는 포커스 이벤트가 발생할 때까지 Devilspie2에서 lua를 다시 호출하지 않습니다.

한 가지 가능성은 표준 X11 유틸리티를 사용하여 창 이름을 얻는 것입니다. xprop. os.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

관련 정보