如何在 LUA 中获得 window 装饰像素大小

How to get window decorations pixel size in LUA

我正在使用带有 seamlessrdp 的 rdesktop。这样我就可以在 Linux 台机器上打开 Windows 个应用程序。我还添加了 devilspie2,这样我就可以控制 window 装饰。 devilspie2 使用 lua 作为其配置管理。我让一切正常。剩下的唯一问题是将开口(对话框)windows 移动几个像素,因为 VNC windows 看起来好像有装饰(但没有装饰)。我通过对移动所需的像素数量进行硬编码来使代码正常工作。问题是我们这里有不止一个发行版,它们的 window 装饰有不同的像素大小。

我想要的是获取以像素为单位的装饰尺寸,而不是对它们进行硬编码,这样它就可以完美地适用于我的所有发行版。

这是在 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

从脚本中可以看出。如果我能以某种方式调用 window 装饰的大小然后使用它们而不是硬编码像素,那就更好了。

编辑(答案):

尽管我在以下 post 之前找到了答案,但我还是想接受它,因为它确实显示了正确的路径。我只是在这里进一步评论以显示完整答案:

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

devilspie2只提供了两种获取window大小的方法,get_window_geometryget_window_client_geometry.

最后一个不包括 window 边框。如果这对您不起作用,您可以为所有值创建一个带有 table 的文件,以便轻松编辑 table。如果可能的话,您也可以使用 window class 名称作为 table 键,以便于使用。