From 151f1726ac1efea5ea9686eab5cb72f075a6d352 Mon Sep 17 00:00:00 2001 From: Max Rabkin Date: Tue, 29 Sep 2009 18:02:07 +0200 Subject: Add "Selective" layout modifier Ignore-this: ded23208563ca8c8d411916d01351132 darcs-hash:20090929160207-a5338-8da17faae1182548259cb9d304533c6239673710.gz --- XMonad/Layout/Selective.hs | 98 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 XMonad/Layout/Selective.hs (limited to 'XMonad/Layout') 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 +-- 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 } -- cgit v1.2.3