(使用@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 月 7 日更新:

所以,我現在嘗試在 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軟體包xdotoolxdotool 的 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 二進位檔案/腳本替換為上述包裝器腳本

這可能看起來很骯髒,但它確實有效。

相關內容