在 Openbox 中配置 ToggleShowDesktop 以仅作用于指定层

Mar*_*ter 7 openbox lxde

我有一个键绑定ToggleShowDesktop。当我按下 时Menu,所有窗口都会最小化,我会看到我的桌面壁纸(如预期的那样):

<keybind key="Menu">
  <action name="ToggleShowDesktop"/>
</keybind>
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我不想看到我的壁纸。我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>
Run Code Online (Sandbox Code Playgroud)

是否可以进行配置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
...
Run Code Online (Sandbox Code Playgroud)

实际上创建了 8 个不同的应用程序(具有不同的名称)。

同样,在.config/openbox/lxde-rc.xml我没有 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>
Run Code Online (Sandbox Code Playgroud)

最后,/.config/autostart我有 8 个*.desktop文件,登录后会自动启动:

/.config/autostar/terminator-wallpaper-1a.desktop
/.config/autostar/terminator-wallpaper-1b.desktop
/.config/autostar/terminator-wallpaper-2a.desktop
Run Code Online (Sandbox Code Playgroud)

在我看来,这似乎过于复杂和不优雅,但我没有看到任何更好的方法来做到这一点。

现在,当我按照@Suchipi 的指示进行操作时,会发生以下情况:

1)devilspie工作正常的部分。原来,我只需要一个定义,涵盖了所有的8个窗口(代替matchesis):

$ cat .devilspie/terminator.ds 
(if
(matches (application_name) "terminator-wallpaper")
(begin
(wintype "desktop")
)
)
Run Code Online (Sandbox Code Playgroud)

我可以看到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
Run Code Online (Sandbox Code Playgroud)

2)现在的部分xdotool比较棘手:首先,100%用于分辨率不起作用,即窗口消失(我没有看到)。使用静态时:

xdotool search --class "Terminator-wallpaper-1a" windowunmap --sync windowmap windowsize %1 1920 1056
Run Code Online (Sandbox Code Playgroud)

这适用于桌面 1 显示器 1。但是当我为其他桌面运行它时,它没有效果,即:

xdotool search --class "Terminator-wallpaper-2a" windowunmap --sync windowmap windowsize %1 1920 1056
Run Code Online (Sandbox Code Playgroud)

实际上,它也适用于其他桌面,但前提是我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
Run Code Online (Sandbox Code Playgroud)

我得到两个终端作为壁纸。但问题是,这些终端中只有一个是实际可用的。另一个是“未聚焦”,即使我用鼠标单击它,也无法将其聚焦。即,我可以看到终端,但我无法输入。

这个问题以前不存在,在较旧的 Openbox 版本中

我该如何解决这个问题?

Suc*_*ipi 7

Openbox 将为_OB_APP_TYPE属性设置为“桌面”的窗口提供您正在寻找的功能(您可以obxprop用来检查窗口的属性)。因此,我们需要将_OB_APP_TYPE终结器窗口的 设置为“桌面”,以便发生这种情况。

通读 openbox 源代码,client.c我可以看到它_OB_APP_TYPE是从_NET_WM_WINDOW_TYPE. 所以我寻找一个可以改变的应用程序_NET_WM_WINDOW_TYPE。我找到的应用程序称为devilspie.

首先,安装它:

sudo apt-get install devilspie
Run Code Online (Sandbox Code Playgroud)

接下来,我们将为devilspie配置文件创建文件夹:

mkdir ~/.devilspie
Run Code Online (Sandbox Code Playgroud)

现在我们将添加一个配置文件,告诉devilspie查找命名的应用程序并将terminator它们的窗口类型设置为desktop. 将以下内容放入~/.devilspie/terminator.ds

(if
(is (application_name) "terminator")
(begin
(wintype "desktop")
)
)
Run Code Online (Sandbox Code Playgroud)

现在,如果您运行devilspie(或devilspie -a影响现有窗口而不是新创建的窗口),您会注意到是否使用obxprop_NET_WM_WINDOW_TYPE已更改但_OB_APP_TYPE尚未更改的终止符。让我们使用xdotool取消映射和重新映射窗口(在 X11 术语中,这意味着我们将停止绘制并开始绘制窗口),这将强制 openbox 注意到该值。

安装 xdotool:

sudo apt-get install xdotool
Run Code Online (Sandbox Code Playgroud)

然后我们运行以下脚本来查找terminator窗口,取消映射它,等到它被取消映射,然后重新映射它。我们还调整了窗口的大小,因为当它被取消映射和重新映射时,它失去了最大化:

xdotool search --class "terminator" windowunmap --sync windowmap windowsize %1 1024 768
Run Code Online (Sandbox Code Playgroud)

替换1024 768为您的分辨率。另请注意,xdotool比 Debian 的 apt 存储库中发现的新版本支持使用100% 100%而不是静态分辨率。您可以在xdotool 的 googlecode 页面上找到.deb更新版本的软件包xdotool

终止符窗口将立即变得未修饰,如果您现在使用obxprop,您将看到两个值都已正确设置。如果您现在按ToggleShowDesktop几次绑定的键,终止符窗口将始终保持活动状态。

为了使其持久化,您需要在登录时运行这些命令。用于 LXSessionLXDE Wiki 页面显示了执行此操作的几种不同方法(全局、每个用户、每个配置文件等)。假设您只想为您的用户设置这些设置并在 LXDE 配置文件(默认)下,您将需要编辑~/.config/lxsession/LXDE/autostart和添加我们运行的命令,请记住 xdotool 命令需要在终结器窗口渲染后运行,所以做类似的事情(sleep 1s & xdotool ...)。如果您愿意,您还可以将这些命令设置为 openbox 中的键绑定。