|
3 | 3 | -----------------------------------------------------------------------------
|
4 | 4 | -- |
|
5 | 5 | -- Module : XMonad.Layout.PerScreen
|
6 |
| --- Description : Configure layouts based on the width of your screen. |
7 |
| --- Copyright : (c) Edward Z. Yang |
| 6 | +-- Description : Configure layouts based on the screen rectangle. |
| 7 | +-- Copyright : (c) Brandon S. Allbery KF8NH |
8 | 8 | -- License : BSD-style (see LICENSE)
|
9 | 9 | --
|
10 |
| --- Maintainer : <[email protected]> |
| 10 | +-- Maintainer : <[email protected]> |
11 | 11 | -- Stability : unstable
|
12 | 12 | -- Portability : unportable
|
13 | 13 | --
|
14 |
| --- Configure layouts based on the width of your screen; use your |
15 |
| --- favorite multi-column layout for wide screens and a full-screen |
16 |
| --- layout for small ones. |
| 14 | +-- Configure layouts based on the screen rectangle passed to the layout. |
| 15 | +-- This gives you true per-screen functionality. |
| 16 | +-- |
| 17 | +-- The old PerScreen is now X.L.ByWidth. We re-export it deprecated for |
| 18 | +-- backward compatibility. |
17 | 19 | -----------------------------------------------------------------------------
|
18 | 20 |
|
19 | 21 | module XMonad.Layout.PerScreen
|
20 | 22 | ( -- * Usage
|
21 | 23 | -- $usage
|
22 |
| - PerScreen, |
| 24 | + OnScreen, |
| 25 | + onScreen, |
| 26 | + onScreens, |
| 27 | + -- * Deprecated |
| 28 | + -- $deprecated |
| 29 | + BW.PerScreen, |
23 | 30 | ifWider
|
24 | 31 | ) where
|
25 | 32 |
|
26 | 33 | import XMonad
|
27 | 34 | import qualified XMonad.StackSet as W
|
28 | 35 |
|
29 |
| -import XMonad.Prelude (fromMaybe) |
| 36 | +import XMonad.Prelude (fromMaybe, fi) |
| 37 | + |
| 38 | +import qualified XMonad.Layout.ByWidth as BW |
| 39 | + |
| 40 | +import Data.List (find) |
30 | 41 |
|
31 | 42 | -- $usage
|
32 | 43 | -- You can use this module by importing it into your ~\/.xmonad\/xmonad.hs file:
|
33 | 44 | --
|
34 |
| --- > import XMonad.Layout.PerScreen |
| 45 | +-- > import XMonad.Layout.OnScreen |
35 | 46 | --
|
36 | 47 | -- and modifying your layoutHook as follows (for example):
|
37 | 48 | --
|
38 |
| --- > layoutHook = ifWider 1280 (Tall 1 (3/100) (1/2) ||| Full) Full |
| 49 | +-- > layoutHook = onScreen 1 (Tall 1 (3/100) (1/2) ||| Full) Full |
39 | 50 | --
|
40 | 51 | -- Replace any of the layouts with any arbitrarily complicated layout.
|
41 |
| --- ifWider can also be used inside other layout combinators. |
| 52 | +-- 'onScreen' can also be used inside other layout combinators, although the |
| 53 | +-- result may be confusing. |
| 54 | + |
| 55 | +-- | Specify a layout to run on a given screen. |
| 56 | +onScreen :: (LayoutClass l1 a, LayoutClass l2 a) |
| 57 | + => ScreenId -> l1 a -> l2 a -> OnScreen l1 l2 a |
| 58 | +onScreen s = onScreens [s] |
| 59 | + |
| 60 | +-- | Specify a layout to run on a list of screens. |
| 61 | +-- Note that this works by 'ScreenId'. It has a 'Num' instance, so literal |
| 62 | +-- screen numbers will work as expected, but if you use a binding you need |
| 63 | +-- to use the 'S' constructor. |
| 64 | +onScreens :: (LayoutClass l1 a, LayoutClass l2 a) |
| 65 | + => [ScreenId] -> l1 a -> l2 a -> OnScreen l1 l2 a |
| 66 | +onScreens ss l1 l2 = OnScreen ss l1 l2 False |
| 67 | + |
| 68 | +data OnScreen l1 l2 a = OnScreen [ScreenId] (l1 a) (l2 a) Bool |
| 69 | + deriving (Read, Show) |
| 70 | + |
| 71 | +instance (LayoutClass l1 a, LayoutClass l2 a, Show a) => LayoutClass (OnScreen l1 l2) a where |
| 72 | + runLayout (W.Workspace i p@(OnScreen ss l1 l2 _) ms) r = do |
| 73 | + which <- withWindowSet $ \ws -> do |
| 74 | + let srs = sinfo (W.current ws) : map sinfo (W.visible ws) |
| 75 | + f lr (_,sr) = rect_x lr >= rect_x sr && |
| 76 | + rect_x lr < rect_x sr + fi (rect_width sr) && |
| 77 | + rect_y lr >= rect_y sr && |
| 78 | + rect_y lr < rect_y sr + fi (rect_height sr) |
| 79 | + sinfo (W.Screen _ sid (SD sd)) = (sid, sd) |
| 80 | + return $ maybe 0 fst (find (f r) srs) `elem` ss |
| 81 | + if which |
| 82 | + then do handleMessage l2 (SomeMessage Hide) |
| 83 | + (wrs, mlt') <- runLayout (W.Workspace i l1 ms) r |
| 84 | + return (wrs, Just $ updateL1 p mlt') |
| 85 | + else do handleMessage l1 (SomeMessage Hide) |
| 86 | + (wrs, mlt') <- runLayout (W.Workspace i l2 ms) r |
| 87 | + return (wrs, Just $ updateL2 p mlt') |
| 88 | + |
| 89 | + handleMessage (OnScreen ss l1 l2 b) m |
| 90 | + | fromMessage m == Just Hide = do |
| 91 | + l1' <- handleMessage l1 m |
| 92 | + l2' <- handleMessage l2 m |
| 93 | + return $ Just $ OnScreen ss (fromMaybe l1 l1') (fromMaybe l2 l2') b |
| 94 | + | fromMessage m == Just ReleaseResources = do |
| 95 | + l1' <- handleMessage l1 m |
| 96 | + l2' <- handleMessage l2 m |
| 97 | + return $ Just $ OnScreen ss (fromMaybe l1 l1') (fromMaybe l2 l2') b |
| 98 | + | b = handleMessage l1 m >>= maybe (return Nothing) (\nl1 -> return . Just $ OnScreen ss nl1 l2 b) |
| 99 | + | otherwise = handleMessage l2 m >>= maybe (return Nothing) (\nl2 -> return . Just $ OnScreen ss l1 nl2 b) |
| 100 | + |
| 101 | + description (OnScreen _ l1 _ True ) = description l1 |
| 102 | + description (OnScreen _ _ l2 False) = description l2 |
| 103 | + |
| 104 | +updateL1 :: OnScreen l1 l2 a -> Maybe (l1 a) -> OnScreen l1 l2 a |
| 105 | +updateL1 (OnScreen ss l1 l2 _) mlt = OnScreen ss (fromMaybe l1 mlt) l2 True |
| 106 | + |
| 107 | +updateL2 :: OnScreen l1 l2 a -> Maybe (l2 a) -> OnScreen l1 l2 a |
| 108 | +updateL2 (OnScreen ss l1 l2 _) mlt = OnScreen ss l1 (fromMaybe l2 mlt) False |
| 109 | + |
| 110 | +-- $deprecated |
| 111 | +-- Older versions of this module exported an 'ifWidth' layout modifier. This |
| 112 | +-- has been moved to 'XMonad.Layout.ByWidth', but is re-exported for backward |
| 113 | +-- compatibility. It is deprecated and will be removed in favor of 'ByWidth' |
| 114 | +-- in a future release. |
42 | 115 |
|
43 | 116 | ifWider :: (LayoutClass l1 a, LayoutClass l2 a)
|
44 | 117 | => Dimension -- ^ target screen width
|
45 | 118 | -> l1 a -- ^ layout to use when the screen is wide enough
|
46 | 119 | -> l2 a -- ^ layout to use otherwise
|
47 |
| - -> PerScreen l1 l2 a |
48 |
| -ifWider w = PerScreen w False |
49 |
| - |
50 |
| -data PerScreen l1 l2 a = PerScreen Dimension Bool (l1 a) (l2 a) deriving (Read, Show) |
51 |
| - |
52 |
| --- | Construct new PerScreen values with possibly modified layouts. |
53 |
| -mkNewPerScreenT :: PerScreen l1 l2 a -> Maybe (l1 a) -> |
54 |
| - PerScreen l1 l2 a |
55 |
| -mkNewPerScreenT (PerScreen w _ lt lf) mlt' = |
56 |
| - (\lt' -> PerScreen w True lt' lf) $ fromMaybe lt mlt' |
57 |
| - |
58 |
| -mkNewPerScreenF :: PerScreen l1 l2 a -> Maybe (l2 a) -> |
59 |
| - PerScreen l1 l2 a |
60 |
| -mkNewPerScreenF (PerScreen w _ lt lf) mlf' = |
61 |
| - PerScreen w False lt $ fromMaybe lf mlf' |
62 |
| - |
63 |
| -instance (LayoutClass l1 a, LayoutClass l2 a, Show a) => LayoutClass (PerScreen l1 l2) a where |
64 |
| - runLayout (W.Workspace i p@(PerScreen w _ lt lf) ms) r |
65 |
| - | rect_width r > w = do (wrs, mlt') <- runLayout (W.Workspace i lt ms) r |
66 |
| - return (wrs, Just $ mkNewPerScreenT p mlt') |
67 |
| - | otherwise = do (wrs, mlt') <- runLayout (W.Workspace i lf ms) r |
68 |
| - return (wrs, Just $ mkNewPerScreenF p mlt') |
69 |
| - |
70 |
| - handleMessage (PerScreen w bool lt lf) m |
71 |
| - | bool = handleMessage lt m >>= maybe (return Nothing) (\nt -> return . Just $ PerScreen w bool nt lf) |
72 |
| - | otherwise = handleMessage lf m >>= maybe (return Nothing) (return . Just . PerScreen w bool lt) |
73 |
| - |
74 |
| - description (PerScreen _ True l1 _) = description l1 |
75 |
| - description (PerScreen _ _ _ l2) = description l2 |
| 120 | + -> BW.PerScreen l1 l2 a |
| 121 | +ifWider = BW.ifWider |
| 122 | +{-# DEPRECATED ifWider "Use XMonad.Layout.ByWidth.ifWider instead" #-} |
0 commit comments