如何制定以我的笔记本电脑使用外接显示器为条件的窗口规则(如系统设置 > 工作区 > 窗口管理 > 窗口规则中所示)?
当我连接到外接显示器时,我希望在笔记本电脑的显示器上启动并固定几个窗口(在所有桌面上可见)。当我仅使用笔记本电脑的显示器时,窗口应该具有默认行为。有没有办法指定这一点?
我不需要在拔下或插入显示器时发生任何事情;现有窗口保持其最后的行为就可以了。
我愿意接受可能涉及“您需要编写 shell 脚本或程序”的解决方案,但我不知道在哪里可以实现这一点,或者这是否可行。(虽然我可以“修改 KWin”,但这似乎有点过头了。)
我想我可以用轮询来解决这个问题,但那样效率很低,除非我轮询非常经常会导致窗口的行为在我尝试使用它时发生改变。
我目前的解决方案是始终应用“所有桌面”规则,并在使用笔记本电脑时取消固定窗口。我不会尝试定位它,因为使用外接显示器时的位置很可能会在没有外接显示器的情况下屏幕外。
我在 Kubuntu 22.04.1 上使用 KDE 5.24.6(至少报告plasmashell --version
如此) 。kwin --version
答案1
窗口规则无法做到这一点。您可以使用KWin 脚本而是。相关函数在API是:
workspace.numScreens
(获取当前屏幕数量)workspace.numberScreensChanged
(当屏幕数量发生变化时执行某些操作)workspace.clientAdded
(新窗口打开时执行某些操作)workspace.clientList()
(迭代所有窗口)client.windowType
,client.caption
,client.resourceClass
(按类型、标题和应用程序识别窗口)workspace.sendClientToScreen(window, screen)
(设置屏幕分配)client.onAllDesktops
(设置固定状态)
示例:启动时,当屏幕设置发生变化并且打开新窗口时,将应用程序“dolphin”和标题“potato”的所有正常窗口设置为屏幕 1,当连接两个显示器时固定,当连接一个显示器时设置为屏幕 0,并且取消固定:
function arrangeWindow(window) {
if (window.normalWindow && window.resourceClass == "dolphin" && window.caption == "potato") {
if (workspace.numScreens == 2) {
workspace.sendClientToScreen(window, 1);
window.onAllDesktops = true;
} else if (workspace.numScreens == 1) {
workspace.sendClientToScreen(window, 0);
window.onAllDesktops= false;
}
}
}
function arrangeAllWindows() {
workspace.clientList().forEach(arrangeWindow);
}
arrangeAllWindows();
workspace.numScreensChanged.connect(arrangeAllWindows);
workspace.clientAddded.connect(arrangeWindow);