使用xmonad使每个窗口透明

时间:2017-05-16 09:52:13

标签: haskell configuration transparency x11 xmonad

我希望每个窗口都是透明的,我使用xmonad和X11。我对Haskell,xmonad或X11中的任何一个都不是很熟悉。

如何为此配置xmonad?我甚至不知道如何开始。

1 个答案:

答案 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属性。通过点击EventAll类型,我会找出所需的导入内容(Graphics.X11.Xlib.ExtrasData.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_typecreateNotifyev_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同伴开始!如果有人有一些改进,请告诉我。