簡體   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