(使用@Suchipi建议的方法):

(使用@Suchipi建议的方法):

我有一个键绑定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 WheezyLXDE.

(使用@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.xmlI 中,我没有 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 个窗口的定义(替换matchesis

$ 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_TYPEOpenbox 将为属性设置为“桌面”的窗口提供您正在寻找的功能(您可以使用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_TYPExdotool

安装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-wallpaperwith的窗口xdotools,并将其更改_NET_WM_WINDOW_TYPE_NET_WM_WINDOW_TYPE_DESKTOPwith 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 二进制文件/脚本替换为上述包装器脚本

这可能看起来很肮脏,但它确实有效。

相关内容