
我有一個鍵綁定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 月 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_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 二進位檔案/腳本替換為上述包裝器腳本
這可能看起來很骯髒,但它確實有效。