我可以使用 XEmbed 扩展来实现标题栏以及在窗口管理器中任意嵌入客户端吗?

问题描述 投票:0回答:1

我正在编写一个类似于 AwesomeWM 的窗口管理器,因为它将可以使用 lua 进行配置,将有一个与 Awesome wibox 相关的 UI 系统,但还有一些额外的细节,例如内置动画支持等。

我知道 AwesomeWM 使用“client.titlebar_top”等客户端属性来实现标题栏,但我想做的是允许用户做两件事:

  • Windows 上有标题栏
  • 能够在“布局”中任意嵌入客户端(我的窗口管理器相当于 Awesome 的 wibox)

看到这一点,我的想法是这可以简化:如果您可以以任意方式将客户端嵌入到 wibox 中,则只要在 WM 管理时自动将客户端嵌入到 wibox 中即可创建标题栏:

clients = {}

root.connect_signal("managed", function(client) {
    table.insert(clients, wibox({
        x = 20, y = 20, width = 200, height = 200,
        layout = wibox.layout.vertical,
        {}, -- titlebar would be here
        client
    }))
})

(如果语法不完全正确,请原谅我,我已经很久没有使用awesome的wibox语法了。)

但是,如果此功能存在,用户还可以实现一个小部件,该小部件将显示所有当前活动客户端的水平列表。例如,在 Windows 7 中,您将鼠标悬停在客户端的图标上,它会向您显示该客户端内容的较小预览。

我的问题是:是否可以使用 xembed 扩展在 wibox 窗口中任意嵌入这样的客户端?

此外,“任意嵌入”是指您可以将嵌入式客户端视为 Wibox 布局的另一个“元素”。这意味着您可以在 wibox 中拥有多个嵌入式窗口,并且嵌入式客户端窗口可以被 cairo 绘制的其他元素遮挡,它可以任意形状,可以旋转、缩放、平移并变得透明。

本质上,我希望能够像使用 cairo 绘制图像一样对待嵌入式客户端。

x11 awesome-wm xcb xembed
1个回答
0
投票

例如,在 Windows 7 中,您将鼠标悬停在客户端的图标上,它会向您显示该客户端内容的较小预览。

这里的关键词是更小。是什么让预览变小了?如果 WM 在此处显示“真实窗口”,应用程序会将其布局更新为新尺寸,但不会使其内容变小。

我的问题是:是否可以使用 xembed 扩展在 wibox 窗口中任意嵌入这样的客户端?

不。 xembed 规范 是一种特殊协议,它定义了正在嵌入的窗口以及嵌入的窗口的行为方式。这些规则与 ICCCM 中的规则有很大不同(这是描述“正常”WM 行为的规范。

并且嵌入的客户端窗口可以被 cairo 绘制的其他元素遮挡,它可以任意形状,

不。您可以使用 SHAPE 扩展来绘制任意形状,但不能仅使用普通绘图来定义形状。通过对窗口进行“正常绘制”,最后绘制的任何内容都会获胜并覆盖之前存在的任何内容。如果您将 cairo 绘图发送到与要嵌入的窗口不同的窗口,则窗口的形状决定您的哪一个绘图会消失。

它可以旋转、缩放、平移并变得透明。

所有这些对于 X11 实际上都是不可能的。复合扩展使得 合成管理器(例如

xcompmgr
picom
)成为可能。

有了这个扩展,X11 服务器就不再决定屏幕上实际显示的内容。相反,合成管理器将所有窗口内容作为图像获取,并按照自己喜欢的方式绘制它们。

但是,这仅允许旋转……屏幕中的窗口。事件处理仍然正常进行。因此,对于“点击事物”,窗口实际上并未旋转。

本质上,我希望能够像使用 cairo 绘制图像一样对待嵌入式客户端。

但是,这是一个窗口而不是图像。对不起。

© www.soinside.com 2019 - 2024. All rights reserved.