我有一个键绑定ToggleShowDesktop
。当我按 时Menu,所有窗口都会最小化,并且我会看到我的桌面壁纸(如预期):
<keybind key="Menu">
<action name="ToggleShowDesktop"/>
</keybind>
现在的问题是,我不想看到我的壁纸。我使用terminator
作为我的壁纸,即当我开始时terminator
,它被放置在下面的图层上:
<application name="terminator">
<focus>yes</focus>
<layer>below</layer>
<desktop>1</desktop>
<position>
<y>0</y>
<x>0</x>
</position>
<skip_taskbar>yes</skip_taskbar>
<maximized>true</maximized>
</application>
是否可以进行配置ToggleShowDesktop
以使“下面”层不受影响?即我只想最小化普通窗口,但不最小化terminator
。换句话说,我希望终结者的行为与普通壁纸一样 - 不受ToggleShowDesktop
.
我正在使用Debian Wheezy
与LXDE
.
(使用@Suchipi建议的方法):
我在最初的问题中遗漏了一些细节,现在这些细节似乎仍然相关:
我的设置有 2 个显示器和 4 个虚拟桌面。所以我有“8张壁纸”来填充terminator
。根据我之前阅读的内容,我假设这 8 个窗口必须是可区分的,因此我创建了 8 个terminator
.ie 符号:
/usr/bin/terminator-wallpaper-1a -> terminator
/usr/bin/terminator-wallpaper-1b -> terminator
/usr/bin/terminator-wallpaper-2a -> terminator
...
实际上创建了 8 个不同的应用程序(具有不同的名称)。
同样,在.config/openbox/lxde-rc.xml
I 中,我没有 1 个定义,而是 8 个定义:
<application name="terminator-wallpaper-1a">
<desktop>1</desktop>
<position>
<monitor>1</monitor>
</position>
...
</application>
<application name="terminator-wallpaper-1b">
<desktop>1</desktop>
<position>
<monitor>2</monitor>
</position>
...
</application>
<application name="terminator-wallpaper-2a">
<desktop>2</desktop>
<position>
<monitor>1</monitor>
</position>
...
</application>
最后,/.config/autostart
我有 8 个*.desktop
文件,登录后自动启动:
/.config/autostar/terminator-wallpaper-1a.desktop
/.config/autostar/terminator-wallpaper-1b.desktop
/.config/autostar/terminator-wallpaper-2a.desktop
在我看来,这似乎过于复杂且不优雅,但我没有看到任何更好的方法来做到这一点。
现在,当我按照@Suchipi 的说明进行操作时,会发生以下情况:
1) 部分devilspie
工作正常。事实证明,我只需要一个涵盖我所有 8 个窗口的定义(替换matches
)is
:
$ cat .devilspie/terminator.ds
(if
(matches (application_name) "terminator-wallpaper")
(begin
(wintype "desktop")
)
)
我可以看到obxprop
它按预期工作。
$ obxprop | egrep '(_OB_APP|_NET_WM_WINDOW_TYPE)'
_OB_APP_TYPE(UTF8_STRING) = "normal"
_OB_APP_TITLE(UTF8_STRING) = "None"
_OB_APP_CLASS(UTF8_STRING) = "Terminator-wallpaper-1"
_OB_APP_NAME(UTF8_STRING) = "terminator-wallpaper-1"
_OB_APP_ROLE(UTF8_STRING) =
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP
2)现在的部分xdotool
更加棘手:首先,用于100%
分辨率不起作用,即窗口消失(我没有看到它)。使用静态时:
xdotool search --class "Terminator-wallpaper-1a" windowunmap --sync windowmap windowsize %1 1920 1056
这适用于桌面 1 显示器 1。但是当我为其他桌面运行它时,它没有任何效果,即:
xdotool search --class "Terminator-wallpaper-2a" windowunmap --sync windowmap windowsize %1 1920 1056
实际上,它也适用于其他桌面,但前提是我在xdotool
我想要影响的特定桌面上运行该命令。即我必须切换到桌面2
并运行xdotool search --class "Terminator-wallpaper-2a"
然后它才能工作。
另外,我想知道它windowsize %1
在这里是否发挥作用。
更新2019-12-07:
所以,我现在尝试在 Debian Buster (Openbox 3.6) 上设置相同的系统,但遇到了一个新问题。我怀疑新版本的 openbox 中某些属性发生了变化。
一切似乎都和以前一样,即:
terminator-wallpaper-1a --profile wallpaper -b &
terminator-wallpaper-1b --profile wallpaper -b &
xdotool search --class 'Terminator-wallpaper-1a' windowunmap --sync windowmap windowsize %1 1920 1180
xdotool search --class 'Terminator-wallpaper-1b' windowunmap --sync windowmap windowsize %1 1920 1180
我有两个终端作为壁纸。但问题是,这些终端中只有一个是真正可用的。另一个是“未聚焦”,即使我用鼠标单击它,也无法将其聚焦。即,我可以看到终端,但无法输入内容。
这个问题以前不存在,在旧的 Openbox 版本中
我该如何解决这个问题?
答案1
_OB_APP_TYPE
Openbox 将为属性设置为“桌面”的窗口提供您正在寻找的功能(您可以使用obxprop
它来检查窗口的属性)。因此,我们需要将_OB_APP_TYPE
终结者窗口设置为“桌面”,这样才会发生这种情况。
阅读openbox源代码,client.c
我可以看到它_OB_APP_TYPE
继承自_NET_WM_WINDOW_TYPE
.所以我寻找一个可以改变的应用程序_NET_WM_WINDOW_TYPE
。我找到的应用程序名为devilspie
.
首先,安装它:
sudo apt-get install devilspie
接下来,我们将创建配置文件的文件夹devilspie
:
mkdir ~/.devilspie
现在我们将添加一个配置文件,告诉devilspie
您查找名为的应用程序terminator
并将其窗口类型设置为desktop
.将以下内容放入~/.devilspie/terminator.ds
:
(if
(is (application_name) "terminator")
(begin
(wintype "desktop")
)
)
现在,如果您运行devilspie
(或devilspie -a
影响现有窗口而不仅仅是新创建的窗口),您会注意到是否使用已更改但尚未更改的obxprop
终止符。让我们使用取消映射和重新映射窗口(在 X11 术语中,这意味着我们将停止绘制并开始绘制窗口),这将强制 openbox 注意到该值。_NET_WM_WINDOW_TYPE
_OB_APP_TYPE
xdotool
安装xdotool:
sudo apt-get install xdotool
然后我们运行以下脚本来查找terminator
窗口,取消映射它,等到它取消映射,然后重新映射它。我们还调整了窗口的大小,因为当它被取消映射并重新映射时,它失去了最大化:
xdotool search --class "terminator" windowunmap --sync windowmap windowsize %1 1024 768
替换1024 768
为您的分辨率。另请注意,xdotool
比 Debian apt repo 中发现的版本更新的版本支持使用100% 100%
而不是静态解析。您可以找到.deb
较新版本的软件包xdotool
较新版本的xdotool 的 googlecode 页面。
终止符窗口将立即变为未修饰状态,如果您现在使用obxprop
,您将看到两个值都已正确设置。如果您现在按绑定的键ToggleShowDesktop
几次,终止符窗口将始终保持活动状态。
为了使其持久化,您需要在登录时运行这些命令。这LXSession 的 LXDE Wiki 页面显示了执行此操作的几种不同方法(全局、每个用户、每个配置文件等)。假设您希望这些设置仅适用于您的用户并在 LXDE 配置文件(默认)下,您需要编辑~/.config/lxsession/LXDE/autostart
和添加我们运行的命令,请记住 xdotool 命令需要在渲染终结者的窗口后运行,所以做类似的事情(sleep 1s & xdotool ...)
。如果您愿意,您还可以将这些命令设置为 openbox 中的按键绑定。
答案2
我想出了以下脚本,看起来它可以解决您的问题。
#!/bin/sh
make_wid_desktop_app() {
# set the type of the window to
xprop -id $1 -f _NET_WM_WINDOW_TYPE 32a -set _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_DESKTOP
xprop -id $1 -f _MOTIF_WM_HINTS 32c -set _MOTIF_WM_HINTS 0
xprop -id $1 -remove _MOTIF_WM_HINTS
}
get_wids() {
xdotool search --class $1
}
for id in $(get_wids $1); do
make_wid_desktop_app $id;
done
你可以像这样使用它。
desktop_terminal terminator-wallpaper
它搜索所有具有类terminator-wallpaper
with的窗口xdotools
,并将其更改_NET_WM_WINDOW_TYPE
为_NET_WM_WINDOW_TYPE_DESKTOP
with xprop
。
由于 Openbox 不会在创建窗口后检查此类型是否已更改,因此我们需要欺骗 Openbox 来执行此操作。这是通过设置_MOTIF_WM_HINTS
和删除它们来完成的。
devilspie
添加时可以实现同样的效果
(if
(matches (application_name) "terminator-wallpaper")
(begin
(wintype "desktop")
(undecorate)
)
)
因为将窗口设置为(undecorate)
也是使用 _MOTIF_WM_HINTS
技巧。
答案3
如果我正确地回答了问题,那么您的问题是这样的:每当您单击 时ToggleShowDesktop
,您都希望将所有打开的应用程序最小化,除了terminator
。
如果是这样,那么您可以通过编写包装脚本来实现这一点,该脚本将在内部调用两个命令
#!/bin/sh
xdotool key "super+d"
wmctrl -a "terminator"
将实际的 ToggleShowDesktop 二进制文件/脚本替换为上述包装器脚本
这可能看起来很肮脏,但它确实有效。