mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 11:30:22 -07:00
XMonad.Layout.LayoutBuilderP: Remove
This commit is contained in:
parent
6f49a9394f
commit
d28c0a2425
@ -1,208 +0,0 @@
|
||||
{-# LANGUAGE FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances, PatternGuards, ScopedTypeVariables #-}
|
||||
-----------------------------------------------------------------------------
|
||||
-- |
|
||||
-- Module : XMonad.Layout.LayoutBuilderP
|
||||
-- Description : (DEPRECATED) An old version of "XMonad.Layout.LayoutBuilderP".
|
||||
-- Copyright : (c) 2009 Anders Engstrom <ankaan@gmail.com>, 2011 Ilya Portnov <portnov84@rambler.ru>
|
||||
-- License : BSD3-style (see LICENSE)
|
||||
--
|
||||
-- Maintainer : Ilya Portnov <portnov84@rambler.ru>
|
||||
-- Stability : unstable
|
||||
-- Portability : unportable
|
||||
--
|
||||
-- DEPRECATED. Use 'XMonad.Layout.LayoutBuilder' instead.
|
||||
--
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
module XMonad.Layout.LayoutBuilderP {-# DEPRECATED "Use XMonad.Layout.LayoutBuilder instead" #-} (
|
||||
LayoutP (..),
|
||||
layoutP, layoutAll,
|
||||
B.relBox, B.absBox,
|
||||
-- * Overloading ways to select windows
|
||||
-- $selectWin
|
||||
Predicate (..), Proxy(..),
|
||||
) where
|
||||
|
||||
import XMonad
|
||||
import XMonad.Prelude hiding (Const)
|
||||
import qualified XMonad.StackSet as W
|
||||
import XMonad.Util.WindowProperties
|
||||
|
||||
import qualified XMonad.Layout.LayoutBuilder as B
|
||||
|
||||
-- $selectWin
|
||||
--
|
||||
-- 'Predicate' exists because layouts are required to be serializable, and
|
||||
-- "XMonad.Util.WindowProperties" is not sufficient (for example it does not
|
||||
-- allow using regular expressions).
|
||||
--
|
||||
-- compare "XMonad.Util.Invisible"
|
||||
|
||||
-- | Type class for predicates. This enables us to manage not only Windows,
|
||||
-- but any objects, for which instance Predicate is defined.
|
||||
--
|
||||
-- Another instance exists in XMonad.Util.WindowPropertiesRE in xmonad-extras
|
||||
class Predicate p w where
|
||||
alwaysTrue :: Proxy w -> p -- ^ A predicate that is always True.
|
||||
checkPredicate :: p -> w -> X Bool -- ^ Check if given object (window or smth else) matches that predicate
|
||||
|
||||
-- | Contains no actual data, but is needed to help select the correct instance
|
||||
-- of 'Predicate'
|
||||
data Proxy a = Proxy
|
||||
|
||||
-- | Data type for our layout.
|
||||
data LayoutP p l1 l2 a =
|
||||
LayoutP (Maybe a) (Maybe a) p B.SubBox (Maybe B.SubBox) (l1 a) (Maybe (l2 a))
|
||||
deriving (Show,Read)
|
||||
|
||||
-- | Use the specified layout in the described area windows that match given predicate and send the rest of the windows to the next layout in the chain.
|
||||
-- It is possible to supply an alternative area that will then be used instead, if there are no windows to send to the next layout.
|
||||
{-# DEPRECATED layoutP "Use XMonad.Layout.LayoutBuilder.layoutP instead." #-}
|
||||
layoutP :: (Read a, Eq a, LayoutClass l1 a, LayoutClass l2 a, LayoutClass l3 a, Predicate p a) =>
|
||||
p
|
||||
-> B.SubBox -- ^ The box to place the windows in
|
||||
-> Maybe B.SubBox -- ^ Possibly an alternative box that is used when this layout handles all windows that are left
|
||||
-> l1 a -- ^ The layout to use in the specified area
|
||||
-> LayoutP p l2 l3 a -- ^ Where to send the remaining windows
|
||||
-> LayoutP p l1 (LayoutP p l2 l3) a -- ^ The resulting layout
|
||||
layoutP prop box mbox sub next = LayoutP Nothing Nothing prop box mbox sub (Just next)
|
||||
|
||||
-- | Use the specified layout in the described area for all remaining windows.
|
||||
{-# DEPRECATED layoutAll "Use XMonad.Layout.LayoutBuilder.layoutAll instead." #-}
|
||||
layoutAll :: forall l1 p a. (Read a, Eq a, LayoutClass l1 a, Predicate p a) =>
|
||||
B.SubBox -- ^ The box to place the windows in
|
||||
-> l1 a -- ^ The layout to use in the specified area
|
||||
-> LayoutP p l1 Full a -- ^ The resulting layout
|
||||
layoutAll box sub =
|
||||
let a = alwaysTrue (Proxy :: Proxy a)
|
||||
in LayoutP Nothing Nothing a box Nothing sub Nothing
|
||||
|
||||
instance (LayoutClass l1 w, LayoutClass l2 w, Predicate p w, Show w, Read w, Eq w, Typeable w, Show p, Typeable p) =>
|
||||
LayoutClass (LayoutP p l1 l2) w where
|
||||
|
||||
-- | Update window locations.
|
||||
runLayout (W.Workspace _ (LayoutP subf nextf prop box mbox sub next) s) rect
|
||||
= do (subs,nexts,subf',nextf') <- splitStack s prop subf nextf
|
||||
let selBox = if isJust nextf'
|
||||
then box
|
||||
else fromMaybe box mbox
|
||||
|
||||
(sublist,sub') <- handle sub subs $ calcArea selBox rect
|
||||
|
||||
(nextlist,next') <- case next of Nothing -> return ([],Nothing)
|
||||
Just n -> do (res,l) <- handle n nexts rect
|
||||
return (res,Just l)
|
||||
|
||||
return (sublist++nextlist, Just $ LayoutP subf' nextf' prop box mbox sub' next' )
|
||||
where
|
||||
handle l s' r = do (res,ml) <- runLayout (W.Workspace "" l s') r
|
||||
let l' = fromMaybe l ml
|
||||
return (res,l')
|
||||
|
||||
-- | Propagate messages.
|
||||
handleMessage l m
|
||||
| Just (IncMasterN _) <- fromMessage m = sendFocus l m
|
||||
| Just Shrink <- fromMessage m = sendFocus l m
|
||||
| Just Expand <- fromMessage m = sendFocus l m
|
||||
| otherwise = sendBoth l m
|
||||
|
||||
-- | Descriptive name for layout.
|
||||
description (LayoutP _ _ _ _ _ sub (Just next)) = "layoutP "++ description sub ++" "++ description next
|
||||
description (LayoutP _ _ _ _ _ sub Nothing) = "layoutP "++ description sub
|
||||
|
||||
|
||||
sendSub :: (LayoutClass l1 a, LayoutClass l2 a, Read a, Show a, Eq a, Typeable a, Predicate p a)
|
||||
=> LayoutP p l1 l2 a -> SomeMessage -> X (Maybe (LayoutP p l1 l2 a))
|
||||
sendSub (LayoutP subf nextf prop box mbox sub next) m =
|
||||
do sub' <- handleMessage sub m
|
||||
return $ if isJust sub'
|
||||
then Just $ LayoutP subf nextf prop box mbox (fromMaybe sub sub') next
|
||||
else Nothing
|
||||
|
||||
sendBoth :: (LayoutClass l1 a, LayoutClass l2 a, Read a, Show a, Eq a, Typeable a, Predicate p a)
|
||||
=> LayoutP p l1 l2 a -> SomeMessage -> X (Maybe (LayoutP p l1 l2 a))
|
||||
sendBoth l@(LayoutP _ _ _ _ _ _ Nothing) m = sendSub l m
|
||||
sendBoth (LayoutP subf nextf prop box mbox sub (Just next)) m =
|
||||
do sub' <- handleMessage sub m
|
||||
next' <- handleMessage next m
|
||||
return $ if isJust sub' || isJust next'
|
||||
then Just $ LayoutP subf nextf prop box mbox (fromMaybe sub sub') (Just $ fromMaybe next next')
|
||||
else Nothing
|
||||
|
||||
sendNext :: (LayoutClass l1 a, LayoutClass l2 a, Read a, Show a, Eq a, Typeable a, Predicate p a)
|
||||
=> LayoutP p l1 l2 a -> SomeMessage -> X (Maybe (LayoutP p l1 l2 a))
|
||||
sendNext (LayoutP _ _ _ _ _ _ Nothing) _ = return Nothing
|
||||
sendNext (LayoutP subf nextf prop box mbox sub (Just next)) m =
|
||||
do next' <- handleMessage next m
|
||||
return $ if isJust next'
|
||||
then Just $ LayoutP subf nextf prop box mbox sub next'
|
||||
else Nothing
|
||||
|
||||
sendFocus :: (LayoutClass l1 a, LayoutClass l2 a, Read a, Show a, Eq a, Typeable a, Predicate p a)
|
||||
=> LayoutP p l1 l2 a -> SomeMessage -> X (Maybe (LayoutP p l1 l2 a))
|
||||
sendFocus l@(LayoutP subf _ _ _ _ _ _) m = do foc <- isFocus subf
|
||||
if foc then sendSub l m
|
||||
else sendNext l m
|
||||
|
||||
isFocus :: (Show a) => Maybe a -> X Bool
|
||||
isFocus Nothing = return False
|
||||
isFocus (Just w) = do ms <- W.stack . W.workspace . W.current <$> gets windowset
|
||||
return $ maybe False (\s -> show w == show (W.focus s)) ms
|
||||
|
||||
|
||||
-- | Split given list of objects (i.e. windows) using predicate.
|
||||
splitBy :: (Predicate p w) => p -> [w] -> X ([w], [w])
|
||||
splitBy prop = foldM step ([], [])
|
||||
where
|
||||
step (good, bad) w = do
|
||||
ok <- checkPredicate prop w
|
||||
return $ if ok
|
||||
then (w:good, bad)
|
||||
else (good, w:bad)
|
||||
|
||||
splitStack :: (Predicate p w, Eq w) => Maybe (W.Stack w) -> p -> Maybe w -> Maybe w -> X (Maybe (W.Stack w),Maybe (W.Stack w),Maybe w,Maybe w)
|
||||
splitStack Nothing _ _ _ = return (Nothing,Nothing,Nothing,Nothing)
|
||||
splitStack (Just s) prop subf nextf = do
|
||||
let ws = W.integrate s
|
||||
(good, other) <- splitBy prop ws
|
||||
let subf' = foc good subf
|
||||
nextf' = foc other nextf
|
||||
return ( differentiate' subf' good
|
||||
, differentiate' nextf' other
|
||||
, subf'
|
||||
, nextf'
|
||||
)
|
||||
where
|
||||
foc [] _ = Nothing
|
||||
foc l f
|
||||
| W.focus s `elem` l = Just $ W.focus s
|
||||
| maybe False (`elem` l) f = f
|
||||
| otherwise = Just $ head l
|
||||
|
||||
calcArea :: B.SubBox -> Rectangle -> Rectangle
|
||||
calcArea (B.SubBox xpos ypos width height) rect = Rectangle (rect_x rect + fromIntegral xpos') (rect_y rect + fromIntegral ypos') width' height'
|
||||
where
|
||||
xpos' = calc False xpos $ rect_width rect
|
||||
ypos' = calc False ypos $ rect_height rect
|
||||
width' = calc True width $ rect_width rect - xpos'
|
||||
height' = calc True height $ rect_height rect - ypos'
|
||||
|
||||
calc zneg val tot = fromIntegral $ min (fromIntegral tot) $ max 0 $
|
||||
case val of B.Rel v -> floor $ v * fromIntegral tot
|
||||
B.Abs v -> if v<0 || (zneg && v==0)
|
||||
then fromIntegral tot+v
|
||||
else v
|
||||
|
||||
differentiate' :: Eq q => Maybe q -> [q] -> Maybe (W.Stack q)
|
||||
differentiate' _ [] = Nothing
|
||||
differentiate' Nothing w = W.differentiate w
|
||||
differentiate' (Just f) w
|
||||
| f `elem` w = Just $ W.Stack { W.focus = f
|
||||
, W.up = reverse $ takeWhile (/=f) w
|
||||
, W.down = tail $ dropWhile (/=f) w
|
||||
}
|
||||
| otherwise = W.differentiate w
|
||||
|
||||
instance Predicate Property Window where
|
||||
alwaysTrue _ = Const True
|
||||
checkPredicate = hasProperty
|
@ -259,7 +259,6 @@ library
|
||||
XMonad.Layout.ImageButtonDecoration
|
||||
XMonad.Layout.IndependentScreens
|
||||
XMonad.Layout.LayoutBuilder
|
||||
XMonad.Layout.LayoutBuilderP
|
||||
XMonad.Layout.LayoutCombinators
|
||||
XMonad.Layout.LayoutHints
|
||||
XMonad.Layout.LayoutModifier
|
||||
|
Loading…
x
Reference in New Issue
Block a user