2017-06-02 18 views
0

私は、ウィンドウのクラス名プロパティに基づいて罫線を削除することができるようなレイアウト変更子を作成しようとしています。コードはに基づくフィルタリングを可能にするためにXモナドで実行されているロジックを除いて、主にXMonad.Layout.NoBordersに基づいています。私がこれまで持っているコードは次のとおりです。特定のクラスのウィンドウから罫線を削除する

次のようにレイアウトフックで使用することができ
{-# 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関数がどのように動作すると誤解されているのだろうか。任意のポインタが評価されるだろう。


EDIT:いくつかのさらなるテストが、これはKDE /プラズマ窓および/または私の設定ではなく、その私のコードとは何の問題のクセかもしれ示しています。

答えて

0

メインロジックは、フローティングウィンドウを考慮しない以外は問題ありませんでした。次のように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 

は、それが私のユースケースのために働くことができます。

関連する問題