从特定类的窗口中删除边框

时间:2017-06-02 15:34:05

标签: haskell xmonad

我正在尝试编写一个非常相似的布局修饰符,允许我根据窗口的类名属性删除边框。代码主要基于XMonad.Layout.NoBorders,但X monad中执行的逻辑允许基于className进行过滤。我到目前为止的代码是:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="panel"><div id="content"></div><div>(click to close)</div></div>

<div id="things">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

可以在布局挂钩中使用,如下所示:

{-# 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

不幸的是,因为它没有达到预期的效果,或者根本没有效果。作为编写布局修饰符的全新内容我不知道我做错了什么,也许我误解了{{1函数应该工作。任何指针都会受到赞赏。

编辑:一些进一步的测试显示这可能是KDE /等离子窗口的特性和/或我的配置问题,而不是与我的代码有关。

2 个答案:

答案 0 :(得分:2)

结果显示主逻辑很好,除了不考虑浮动窗口。按如下方式更改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

使其适用于我的用例。

答案 1 :(得分:0)

似乎此功能最近已添加到XMonad.Layout.NoBorders模块中:

hasBorder :: Bool -> ManageHook

ManageHook用于发送HasBorder消息:

   className =? "foo" --> hasBorder True