Как получить размер оконного оформления в пикселях в LUA

Я использую rdesktop с seamlessrdp. Таким образом, я могу открывать приложения Windows на своих машинах с Linux. Также я добавил devilspie2 в микс, чтобы контролировать оформление окон. devilspie2 использует lua для управления конфигурацией. Я заставил все работать. Единственная оставшаяся проблема - переместить открывающие (диалоговые) окна на пару пикселей, потому что окна VNC будут выглядеть так, как будто у них есть украшения (но без них). Я получил работающий код, жестко запрограммировав количество пикселей, необходимое для перемещения. Проблема в том, что у нас есть несколько дистрибутивов, и они имеют разные размеры пикселей для своих оконных декораций.

Я хочу получить размер украшения в пикселях вместо жесткого их кодирования, чтобы он отлично работал для всех моих дистрибутивов.

Вот фрагмент кода, который делает это atm:

if get_window_class()=="SeamlessRDP" then
    undecorate_window();

    --x-1 and y-28 works for one distro but for the other I need to use x-6 and y-27
    if get_window_type()=="WINDOW_TYPE_DIALOG" then
        x, y = xy();
        xy(x-1, y-28);
    end
end

Как видно из сценария. Было бы намного лучше, если бы я мог как-то назвать размер оконных декораций, а затем использовать их вместо жестко закодированных пикселей.

РЕДАКТИРОВАТЬ (ОТВЕТИТЬ):

Несмотря на то, что я нашел ответ до следующего поста, я все равно хотел его принять, потому что он действительно показал правильный путь. Я только комментирую здесь, чтобы показать полный ответ:

--get x and y's for decorated and non-decorated windows
x1, y1, width1, height1 = get_window_geometry();
x2, y2, width2, height2 = get_window_client_geometry();

--calculate pixels to slide window
xpixel = x2-x1;
ypixel = y2-y1;


--check if class is seamlessrdp
if get_window_class()=="SeamlessRDP" then
    undecorate_window();

    --if window is a dialog then move it
    if get_window_type()=="WINDOW_TYPE_DIALOG" then
        xy(x1-xpixel, y1-ypixel);
    end
end

1 ответ

Решение

devilspie2 предоставляет только два способа получить размер окна, get_window_geometry а также get_window_client_geometry,

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

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