我希望每个窗口都是透明的,我使用xmonad和X11。我对Haskell,xmonad或X11中的任何一个都不是很熟悉。
如何为此配置xmonad?我甚至不知道如何开始。
答案 0 :(得分:5)
为此,您需要一个事件挂钩,在创建新窗口时设置不透明度属性。这就是我正在使用的(需要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的手册页(我正在使用)。
正在搜索&#34;不透明度&#34;,我看到了--opacity-rule
标记,其中提到compton-trans
建议使用此标记,因此我查看its source。在命令行中尝试使用脚本来发现我需要窗口ID来设置其不透明度,所以我查找了如何做到这一点。
解决方案是使用xwininfo
。您可以使用xwininfo -tree -root
列出所有窗口。我以为我需要解析它的输出,并且已经在查找awk
教程。
然后我明白了:&#34;等等,如果我只是在创建窗口时设置不透明度怎么办? Xmonad是一个窗口管理器,它应该有窗口ID!&#34;。所以我查看xmonad's config options,找到handleEventHook
属性。通过点击Event
和All
类型,我会找出所需的导入内容(Graphics.X11.Xlib.Extras
和Data.Monoid
)。
通过复制default:
为我的事件挂钩创建骨架import XMonad
import Graphics.X11.Xlib.Extras
import Data.Monoid
myEventHook :: Event -> X All
myEventHook _ = return (All True)
现在需要一些Haskell知识,我想在Event
是窗口创建事件时做一些事情。通过Event
docs和一些探测,我发现我需要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
来源,并看到the last line that actually does the work仅使用xprop
!现在这很好,因为我不需要compton-trans
的所有内容,它们会进行一些检查并针对用户的便利性进行了优化。使用一些数字转换,我想出了如上所示的最终版本。使用可执行文件的直接路径甚至可能更快。
我有时也使用ghci ~/.xmonad/xmonad.hs
检查某些类型,并使用man xprop
/ man whatever
来检查文档。
我希望这可以帮助xmonads同伴开始!如果有人有一些改进,请告诉我。