删除特定 class 的 windows 的边框
Remove borders from windows of specific class
我正在尝试编写一个非常相似的布局修改器,它允许我根据 windows 的 class 名称 属性 删除边框。该代码主要基于 XMonad.Layout.NoBorders with the exception of the logic executing in the X monad to allow filtering based on className。到目前为止我得到的代码是:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
module XMonad.Layout.ExcludeBorders where
import Control.Monad
import Data.Monoid
import XMonad
import XMonad.Layout.LayoutModifier
import XMonad.StackSet hiding (filter)
setBorders :: [Window] -> Dimension -> X ()
setBorders ws bw =
withDisplay $ \d -> mapM_ (\w -> io $ setWindowBorderWidth d w bw) ws
data ExcludeBorders p a =
ExcludeBorders p
[a]
deriving (Eq, Read, Show)
excludeBorders :: p -> l a -> ModifiedLayout (ExcludeBorders p) l a
excludeBorders qs = ModifiedLayout (ExcludeBorders qs [])
instance (Show p, Read (ExcludeBorders p Window), Excludes p) =>
LayoutModifier (ExcludeBorders p) Window where
unhook (ExcludeBorders _p s) = asks (borderWidth . config) >>= setBorders s
redoLayout (ExcludeBorders p _s) _ mst wrs = do
ws <- withWindowSet (\wset -> excludes p wset mst wrs)
setBorders ws 0
return (wrs, Just $ ExcludeBorders p ws)
class Excludes p where
excludes ::
p
-> WindowSet
-> Maybe (Stack Window)
-> [(Window, Rectangle)]
-> X [Window]
data ExcludeProp =
ExcludeClassName String
deriving (Eq, Read, Show)
instance Excludes [ExcludeProp] where
excludes qs _wset mst _wrs =
flip filterM (integrate' mst) $ \w ->
fmap (getAny . mconcat) .
sequenceA . map (fmap Any . flip runQuery w . toQuery) $
qs
toQuery :: ExcludeProp -> Query Bool
toQuery (ExcludeClassName s) = className =? s
可以在layout hook中使用如下:
excludeBorders [ExcludeClassName "Krunner", ExcludeClassName "plasmashell"]
不幸的是,它没有达到预期的效果,或者根本没有任何效果。作为编写布局修饰符的新手,我不确定自己做错了什么,也许我误解了 redoLayout
功能应该可以工作。任何指针将不胜感激。
编辑:一些进一步的测试表明这可能是 KDE / plasma windows 的特性和/或我的配置问题而不是与我的代码有关的任何事情.
除了不考虑浮动 windows 之外,主要逻辑是好的。更改 Excludes
实例如下:
instance Excludes [ExcludeProp] where
excludes qs wset mst _wrs =
let ws = integrate' mst ++ [w | (w, _) <- Map.toList . floating $ wset]
in flip filterM ws $ \w ->
fmap (getAny . mconcat) .
sequenceA . map (fmap Any . flip runQuery w . toQuery) $
qs
使其适用于我的用例。
这个功能似乎是最近添加到 XMonad.Layout.NoBorders 模块中的:
hasBorder :: Bool -> ManageHook
.
用于发送 HasBorder 消息的 ManageHook:
className =? "foo" --> hasBorder True
我正在尝试编写一个非常相似的布局修改器,它允许我根据 windows 的 class 名称 属性 删除边框。该代码主要基于 XMonad.Layout.NoBorders with the exception of the logic executing in the X monad to allow filtering based on className。到目前为止我得到的代码是:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
module XMonad.Layout.ExcludeBorders where
import Control.Monad
import Data.Monoid
import XMonad
import XMonad.Layout.LayoutModifier
import XMonad.StackSet hiding (filter)
setBorders :: [Window] -> Dimension -> X ()
setBorders ws bw =
withDisplay $ \d -> mapM_ (\w -> io $ setWindowBorderWidth d w bw) ws
data ExcludeBorders p a =
ExcludeBorders p
[a]
deriving (Eq, Read, Show)
excludeBorders :: p -> l a -> ModifiedLayout (ExcludeBorders p) l a
excludeBorders qs = ModifiedLayout (ExcludeBorders qs [])
instance (Show p, Read (ExcludeBorders p Window), Excludes p) =>
LayoutModifier (ExcludeBorders p) Window where
unhook (ExcludeBorders _p s) = asks (borderWidth . config) >>= setBorders s
redoLayout (ExcludeBorders p _s) _ mst wrs = do
ws <- withWindowSet (\wset -> excludes p wset mst wrs)
setBorders ws 0
return (wrs, Just $ ExcludeBorders p ws)
class Excludes p where
excludes ::
p
-> WindowSet
-> Maybe (Stack Window)
-> [(Window, Rectangle)]
-> X [Window]
data ExcludeProp =
ExcludeClassName String
deriving (Eq, Read, Show)
instance Excludes [ExcludeProp] where
excludes qs _wset mst _wrs =
flip filterM (integrate' mst) $ \w ->
fmap (getAny . mconcat) .
sequenceA . map (fmap Any . flip runQuery w . toQuery) $
qs
toQuery :: ExcludeProp -> Query Bool
toQuery (ExcludeClassName s) = className =? s
可以在layout hook中使用如下:
excludeBorders [ExcludeClassName "Krunner", ExcludeClassName "plasmashell"]
不幸的是,它没有达到预期的效果,或者根本没有任何效果。作为编写布局修饰符的新手,我不确定自己做错了什么,也许我误解了 redoLayout
功能应该可以工作。任何指针将不胜感激。
编辑:一些进一步的测试表明这可能是 KDE / plasma windows 的特性和/或我的配置问题而不是与我的代码有关的任何事情.
除了不考虑浮动 windows 之外,主要逻辑是好的。更改 Excludes
实例如下:
instance Excludes [ExcludeProp] where
excludes qs wset mst _wrs =
let ws = integrate' mst ++ [w | (w, _) <- Map.toList . floating $ wset]
in flip filterM ws $ \w ->
fmap (getAny . mconcat) .
sequenceA . map (fmap Any . flip runQuery w . toQuery) $
qs
使其适用于我的用例。
这个功能似乎是最近添加到 XMonad.Layout.NoBorders 模块中的:
hasBorder :: Bool -> ManageHook
.
用于发送 HasBorder 消息的 ManageHook:
className =? "foo" --> hasBorder True