繁体   English   中英

使用xmonad使每个窗口透明

[英]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属性。 通过单击EventAll类型,我找出了我需要的导入( Graphics.X11.Xlib.ExtrasData.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_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源代码,并查看实际完成仅使用xprop 的工作的最后一行 现在这很好,因为我不需要所有compton-trans的东西,它们会进行一些检查并针对用户的便利性进行了优化。 使用一些数字转换,我想出了如上所示的最终版本。 使用可执行文件的直接路径甚至可能更快。

我有时也使用ghci ~/.xmonad/xmonad.hs检查一些类型和man xprop / man whatever以查看文档。

我希望这有助于xmonads同伴开始! 如果有人有一些改进,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM