aboutsummaryrefslogtreecommitdiffstats
path: root/XMonad
diff options
context:
space:
mode:
authorMax Rabkin <max.rabkin@gmail.com>2009-09-29 18:02:07 +0200
committerMax Rabkin <max.rabkin@gmail.com>2009-09-29 18:02:07 +0200
commit151f1726ac1efea5ea9686eab5cb72f075a6d352 (patch)
treec93150c796696d3f3ebad2eac4a01e322a9fecb8 /XMonad
parentad71439ad03d4df3225be98bac74c3444953029e (diff)
downloadXMonadContrib-151f1726ac1efea5ea9686eab5cb72f075a6d352.tar.gz
XMonadContrib-151f1726ac1efea5ea9686eab5cb72f075a6d352.tar.xz
XMonadContrib-151f1726ac1efea5ea9686eab5cb72f075a6d352.zip
Add "Selective" layout modifier
Ignore-this: ded23208563ca8c8d411916d01351132 darcs-hash:20090929160207-a5338-8da17faae1182548259cb9d304533c6239673710.gz
Diffstat (limited to 'XMonad')
-rw-r--r--XMonad/Layout/Selective.hs98
1 files changed, 98 insertions, 0 deletions
diff --git a/XMonad/Layout/Selective.hs b/XMonad/Layout/Selective.hs
new file mode 100644
index 0000000..415a69f
--- /dev/null
+++ b/XMonad/Layout/Selective.hs
@@ -0,0 +1,98 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : XMonad.Layout.Selective
+-- Copyright : (c) 2009 Max Rabkin
+-- License : BSD3-style (see LICENSE)
+--
+-- Maintainer : Max Rabkin <max.rabkin@gmail.com>
+-- Stability : unstable
+-- Portability : unportable
+--
+-- Provides a layout modifier that only shows the master pane and windows
+-- around the focussed window.
+--
+-----------------------------------------------------------------------------
+
+{-# LANGUAGE MultiParamTypeClasses,
+ FlexibleInstances,
+ NoMonomorphismRestriction,
+ NamedFieldPuns #-}
+
+module XMonad.Layout.Selective where
+
+import XMonad.Core
+import XMonad.StackSet
+import XMonad.Layout.LayoutModifier
+import Control.Applicative ((<$>))
+
+-- invariant: 0 <= nMaster <= start; 0 <= nRest
+data Selection = Sel { nMaster :: Int, start :: Int, nRest :: Int }
+ deriving (Read, Show, Eq)
+
+select :: Selection -> Stack a -> Stack a
+select (Sel { nMaster, start, nRest }) stk
+ | lups < nMaster
+ = stk { down=take (nMaster - lups - 1) downs ++
+ (take nRest . drop (start - lups - 1) $ downs) }
+ | otherwise
+ = stk { up=reverse (take nMaster ups ++ drop start ups),
+ down=take (nRest - (lups - start) - 1) downs }
+ where
+ downs = down stk
+ ups = reverse $ up stk
+ lups = length ups
+
+{-
+select :: Selection -> Stack a -> (Selection, Stack a)
+select sel@(Sel { nMaster, start, nRest }) stk
+ | lups < nMaster -- the focussed window is in the master pane
+ = let start' = start `min` (lups + ldown - nRest + 1)
+ `max` nMaster
+ in (sel { start=start' },
+ stk { down=take (nMaster - lups - 1) downs ++
+ (take nRest . drop (start' - lups - 1) $ downs) })
+ | otherwise
+ = let start' = start `min` lups
+ `max` (lups - nRest + 1)
+ `min` (lups + ldown - nRest + 1)
+ `max` nMaster
+ in (sel { start=start' },
+ stk { up=reverse (take nMaster ups ++ drop start' ups),
+ down=take (nRest - (lups - start') - 1) downs })
+ where
+ downs = down stk
+ ups = reverse $ up stk
+ lups = length ups
+ ldown = length downs
+-}
+
+updateStart :: Selection -> Stack a -> Int
+updateStart (Sel { nMaster, start, nRest }) stk
+ | lups < nMaster -- the focussed window is in the master pane
+ = start `min` (lups + ldown - nRest + 1) `max` nMaster
+ | otherwise
+ = start `min` lups
+ `max` (lups - nRest + 1)
+ `min` (lups + ldown - nRest + 1)
+ `max` nMaster
+ where
+ lups = length $ up stk
+ ldown = length $ down stk
+
+update :: Selection -> Stack a -> Selection
+update sel stk = sel { start=updateStart sel stk }
+
+updateAndSelect :: Selection -> Stack a -> Stack a
+updateAndSelect sel stk = select (update sel stk) stk
+
+data Selective a = Selective Selection
+ deriving (Read, Show)
+
+instance LayoutModifier Selective a where
+ modifyLayout (Selective s) w r =
+ runLayout (w { stack = updateAndSelect s <$> stack w }) r
+
+ pureModifier (Selective sel) _ stk wins = (wins, Selective . update sel <$> stk)
+
+selective :: Int -> Int -> l a -> ModifiedLayout Selective l a
+selective m r = ModifiedLayout . Selective $ Sel { nMaster=m, start=m, nRest=r }