Sil*_*ger 3 x11 configuration transparency haskell 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 }
Run Code Online (Sandbox Code Playgroud)
给一个人一条鱼,你喂他一天; 教一个人钓鱼,你喂他一辈子.
本着这句话的精神,我正在描述我提出这个问题的过程.请注意,我对所有Haskell,xmonad和X11的使用经验非常有限.
最初的心态是我需要一个脚本来设置所有窗口的不透明度(结果不是我需要的).我知道linux上的复合管理器会做这种东西(视觉效果),所以我查看了compton(我正在使用)的手册页man 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)
Run Code Online (Sandbox Code Playgroud)
现在需要一些Haskell知识,我想在Event窗口创建事件时做一些事情.通过Event文档和一些探测,我发现我需要ConfigureEventwhere ev_event_typeis is createNotifywhile 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)
Run Code Online (Sandbox Code Playgroud)
现在我们真的想做什么?我们想用compton-trans命令生成shell进程.spawn整个xmonad都使用了简单的函数:
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)
Run Code Online (Sandbox Code Playgroud)
有效!这很好,但我注意到它有点慢,它仍然具有不需要的康普顿依赖.所以我compton-trans再次查看源代码,并看到实际完成刚刚使用的工作的最后一行xprop!现在这很好,因为我不需要所有的东西compton-trans做一些检查,并为用户方便进行了优化.使用一些数字转换,我想出了如上所示的最终版本.使用可执行文件的直接路径甚至可能更快.
我有时也用它ghci ~/.xmonad/xmonad.hs来检查一些类型和man xprop/ man whatever来检查文档.
我希望这有助于xmonads同伴开始!如果有人有一些改进,请告诉我.