kwin Layer
KWin Layer(KWin 图层)是 Plasma 桌面环境中的一个概念,用于控制窗口的显示层级。通过使用图层,您可以将窗口分组并指定它们在屏幕上的显示顺序和优先级。
KWin 提供了几个预定义的图层,包括:
Desktop Layer(桌面图层):用于显示桌面上的背景和图标。此图层位于最底层,通常不覆盖其他窗口。
Below Layer(下层图层):用于将窗口放置在默认窗口图层下方,但仍然在其他窗口之上。通常用于小部件、工具栏和其他辅助性的窗口。
Normal Layer(普通图层):大多数应用程序窗口默认在此图层上。它是默认的窗口图层。
Keep Above Layer(置顶图层):窗口在此图层上具有最高优先级,并始终显示在其他窗口之上。
Notification Layer(通知图层):用于显示通知弹出窗口,如系统通知、提醒和通告。
TopLayer(顶层图层):此图层用于特殊用途,例如全屏窗口、菜单和启动器。
您可以使用 KWin 的图层管理功能来自定义窗口在这些图层上的显示行为。例如,您可以通过设置特定窗口的图层属性,将其置于置顶图层(Keep Above Layer),使其始终显示在其他窗口之上。
kwin 图层设计
根据用户要求,正常的无约束堆叠顺序可以通过点击窗口来提升它们等方式进行操作,实现在Workspace::unconstrained_stacking_order函数中。除了用于构建Workspace::stacking_order的目的外,不应该使用该列表。构建操作在Workspace::constrainedStackingOrder()函数中完成。只应使用Workspace::stackingOrder()函数来获取堆叠顺序,因为它还会检查堆叠顺序是否是最新的。
所有客户端也存储在Workspace::clients中(除了isDesktop()客户端,因为它们非常特殊,存储在Workspace::desktops中),按照客户端创建的顺序存储。
每个窗口都分配在一个层级中。共有7个层级,从底部到顶部分别是:DesktopLayer、BelowLayer、NormalLayer、DockLayer、AboveLayer、NotificationLayer、ActiveLayer、CriticalNotificationLayer和OnScreenDisplayLayer(参见NETWM 7.10节)。窗口所在的层级取决于窗口类型以及其他因素,如窗口是否活动。我们在NETWM提供的层级基础上扩展了NotificationLayer、OnScreenDisplayLayer和CriticalNotificationLayer。
NotificationLayer包含通知窗口,它们位于除活动全屏窗口之外的所有窗口上方。CriticalNotificationLayer包含重要的通知窗口,它们甚至位于全屏窗口之上。OnScreenDisplayLayer用于音量和亮度变化反馈等操作,并位于所有窗口之上,因为它提供了对用户操作的即时响应。
NET::Splash客户端属于Normal层。NET::TopMenu客户端属于Dock层。同时是NET::Dock和NET::KeepBelow的客户端位于Normal层,以保持面板覆盖窗口的设置正常工作(这可能看起来略微违反规范,但是a)我没有更好的想法,b)规范允许根据窗口管理器认为合适的方式调整堆叠顺序)。我们将所有的NET::KeepAbove也放在所有的Dock之上,即使规范建议将它们放在同一层级。
大多数传输窗口与它们的主窗口位于相同的层级中,参见Workspace::constrainedStackingOrder()函数,它们也可以位于更高的层级,但是永远不应该低于它们的主窗口。
目前影响客户端所属层级的因素有:KeepAbove/KeepBelow标志、窗口类型、全屏状态以及客户端是否活动、主要客户端(传输窗口)。
确保调用updateStackingOrder()函数以使Workspace::stackingOrder()保持最新并传播到整个系统。使用Workspace::blockStackingUpdates()函数(或者StackingUpdatesBlocker辅助类)可以临时禁用更新,一旦允许更新,堆叠顺序将在之后更新。