Удалить границы с окон определенного класса

Я пытаюсь написать очень похожий модификатор макета, который позволил бы мне удалить границы на основе свойства имени класса окон. Код в значительной степени основан на XMonad.Layout. NoBorders, за исключением логики, выполняемой в монаде X для обеспечения фильтрации на основе имя класса. Код, который у меня есть до сих пор:

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

который можно использовать в хуке макета следующим образом:

excludeBorders [ExcludeClassName "Krunner", ExcludeClassName "plasmashell"]

К сожалению, как есть, это не имеет желаемого эффекта или вообще никакого эффекта. Будучи совершенно новым для написания модификаторов макета, я не уверен, что делаю неправильно, и, возможно, я неправильно понимаю, как должна работать функция redoLayout . Любые указатели будут оценены.


РЕДАКТИРОВАТЬ: некоторые дальнейшие тесты показывают, что это может быть особенностью KDE / плазменных окон и / или проблемой с моей конфигурацией, а не с моим кодом.


person ppb    schedule 02.06.2017    source источник


Ответы (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

заставляет его работать для моего варианта использования.

person ppb    schedule 02.06.2017

Кажется, эта функция была недавно добавлена ​​в модуль XMonad.Layout.NoBorders:

hasBorder :: Bool -> ManageHook.

ManageHook для отправки сообщений HasBorder:

   className =? "foo" --> hasBorder True
person AleXoundOS    schedule 15.10.2018