[英]Making every window transparent with xmonad
我希望每個窗口都是透明的,我正在使用xmonad和X11。 我對Haskell,xmonad或X11中的任何一個都不是很熟悉。
我該怎么配置xmonad呢? 我甚至不知道如何開始。
為此,您需要一個事件掛鈎,在創建新窗口時設置不透明度屬性。 這就是我正在使用的(需要xprop
在路徑上):
import XMonad
import Graphics.X11.Xlib
import Graphics.X11.Xlib.Extras
import Data.Monoid
setTransparentHook :: Event -> X All
setTransparentHook ConfigureEvent{ev_event_type = createNotify, ev_window = id} = do
setOpacity id opacity
return (All True) where
opacityFloat = 0.9
opacity = floor $ fromIntegral (maxBound :: Word32) * opacityFloat
setOpacity id op = spawn $ "xprop -id " ++ show id ++ " -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY " ++ show op
setTransparentHook _ = return (All True)
main = xmonad $ def
{ handleEventHook = setTransapentHook <+> handleEventHook def }
給一個人一條魚,你喂他一天; 教一個人釣魚,你喂他一輩子。
本着這句話的精神,我正在描述我提出這個問題的過程。 請注意,我對所有Haskell,xmonad和X11的使用經驗非常有限。
最初的心態是我需要一個腳本來設置所有窗口的不透明度(結果不是我需要的)。 我知道linux上的復合管理器會做這種東西(視覺效果),所以我通過man compton
查看了compton(我正在使用)的手冊頁。
在搜索“不透明度”時,我看到了--opacity-rule
標志,它提到了建議使用compton-trans
,所以我看一下它的來源 。 在命令行中嘗試使用腳本來發現我需要窗口ID來設置其不透明度,所以我查找了如何做到這一點。
解決方案是使用xwininfo
。 您可以使用xwininfo -tree -root
列出所有窗口。 我以為我需要解析它的輸出,並且已經在查找awk
教程了。
然后我明白了這個想法:“等等,如果我在窗口創建時設置不透明度怎么辦?Xmonad是一個窗口管理器,它應該有窗口ID!”。 所以我查看了xmonad的配置選項 ,在那里我找到了handleEventHook
屬性。 通過單擊Event
和All
類型,我找出了我需要的導入( Graphics.X11.Xlib.Extras
和Data.Monoid
)。
通過應對默認值為我的事件掛鈎創建一個骨架:
import XMonad
import Graphics.X11.Xlib.Extras
import Data.Monoid
myEventHook :: Event -> X All
myEventHook _ = return (All True)
現在需要一些Haskell知識,我想在Event
是一個窗口創建事件時做一些事情。 通過Event
文檔和一些探測,我發現我需要ConfigureEvent
,其中ev_event_type
是createNotify
而ev_window
是創建的窗口ID。 要使用createNotify
我還要導入Graphics.X11.Xlib
:
import XMonad
import Graphics.X11.Xlib
import Graphics.X11.Xlib.Extras
import Data.Monoid
myEventHook :: Event -> X All
myEventHook ConfigureEvent{ ev_event_type = createNotify, ev_window = id } = do
return (All True)
myEventHook _ = return (All True)
現在我們真的想做什么? 我們想用compton-trans
命令生成shell進程。 整個xmonad都有簡單的函數spawn
:
myEventHook :: Event -> X All
myEventHook ConfigureEvent{ ev_event_type = createNotify, ev_window = id } = do
spawn $ "compton-trans -w " ++ show id ++ " 50"
return (All True)
myEventHook _ = return (All True)
有效! 這很好,但我注意到它有點慢,它仍然具有不需要的康普頓依賴。 所以我再次查看compton-trans
源代碼,並查看實際完成僅使用xprop
的工作的最后一行 ! 現在這很好,因為我不需要所有compton-trans
的東西,它們會進行一些檢查並針對用戶的便利性進行了優化。 使用一些數字轉換,我想出了如上所示的最終版本。 使用可執行文件的直接路徑甚至可能更快。
我有時也使用ghci ~/.xmonad/xmonad.hs
檢查一些類型和man xprop
/ man whatever
以查看文檔。
我希望這有助於xmonads同伴開始! 如果有人有一些改進,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.