From 6cd7adf93fa8da770d9faa894e75694dd877a50a Mon Sep 17 00:00:00 2001 From: Andrea Rossato Date: Mon, 18 Feb 2008 17:11:21 +0100 Subject: Add TabBarDecoration, a layout modifier to add a bar of tabs to any layout ... and port DecorationMadness to the new system. darcs-hash:20080218161121-32816-5c834c6f6c2c8b156a20f140ee15049c87f623b8.gz --- XMonad/Layout/DecorationMadness.hs | 83 ++++++++++++++------------------------ XMonad/Layout/TabBarDecoration.hs | 70 ++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 53 deletions(-) create mode 100644 XMonad/Layout/TabBarDecoration.hs (limited to 'XMonad') diff --git a/XMonad/Layout/DecorationMadness.hs b/XMonad/Layout/DecorationMadness.hs index 7c4c23b..611e918 100644 --- a/XMonad/Layout/DecorationMadness.hs +++ b/XMonad/Layout/DecorationMadness.hs @@ -1,4 +1,3 @@ -{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-} ----------------------------------------------------------------------------- -- | -- Module : XMonad.Layout.DecorationMadness @@ -84,16 +83,14 @@ module XMonad.Layout.DecorationMadness , floatSimpleTabbed , floatTabbed , defaultTheme, shrinkText - , SimpleTabbedDecoration (..) ) where -import Data.List import XMonad -import qualified XMonad.StackSet as S import XMonad.Actions.MouseResize import XMonad.Layout.Decoration import XMonad.Layout.DwmStyle import XMonad.Layout.SimpleDecoration +import XMonad.Layout.TabBarDecoration import XMonad.Layout.Accordion import XMonad.Layout.Circle @@ -133,26 +130,6 @@ import XMonad.Layout.SimpleFloat -- The deafult theme can be dynamically change with the xmonad theme -- selector. See "XMonad.Prompt.Theme". For more themse, look at -- "XMonad.Util.Themes" --- --- NOTE: some of these layouts may not be working correctly with --- WindowNavigation and with some layout combinators. I hope to fix --- this problem shortly! - --- There may be a regression in Tabbed, and no tab is displayed when --- using it with other layouts. This is the reason for the following --- instance (to be removed!) -data SimpleTabbedDecoration a = SimpleTabbed deriving (Read, Show) -instance Eq a => DecorationStyle SimpleTabbedDecoration a where - describeDeco _ = "Tabbed" - decorateFirst _ = True - shrink _ _ r = r - decorationMouseDragHook _ _ _ = return () - pureDecoration _ _ ht (Rectangle x y wh _) s wrs (w,_) = - if isInStack s w then Just $ Rectangle nx y nwh (fi ht) else Nothing - where nwh = wh `div` max 1 (fi $ length wrs) - nx = case w `elemIndex` (S.integrate s) of - Just i -> x + (fi nwh * fi i) - Nothing -> x -- $circle -- Here you will find 'Circle' based decorated layouts. @@ -244,14 +221,14 @@ circleDwmStyle s t = decoration s t Dwm Circle -- Here you can find a screen shot: -- -- -circleSimpleTabbed :: ModifiedLayout (Decoration SimpleTabbedDecoration DefaultShrinker) (ModifiedLayout ResizeScreen Circle) Window -circleSimpleTabbed = decoration shrinkText defaultTheme SimpleTabbed (resizeVertical 20 Circle) +circleSimpleTabbed :: ModifiedLayout (Decoration TabBarDecoration DefaultShrinker) (ModifiedLayout ResizeScreen Circle) Window +circleSimpleTabbed = simpleTabBar (resizeVertical 20 Circle) -- | Similar to 'circleSimpleTabbed' but with the -- possibility of setting a custom shrinker and a custom theme. circleTabbed :: Shrinker s => s -> Theme - -> ModifiedLayout (Decoration SimpleTabbedDecoration s) (ModifiedLayout ResizeScreen Circle) Window -circleTabbed s t = decoration s t SimpleTabbed (resizeVertical (fi $ decoHeight t) Circle) + -> ModifiedLayout (Decoration TabBarDecoration s) (ModifiedLayout ResizeScreen Circle) Window +circleTabbed s t = tabBar s t Top (resizeVertical (fi $ decoHeight t) Circle) -- $accordion @@ -337,14 +314,14 @@ accordionDwmStyle s t = decoration s t Dwm Accordion -- Here you can find a screen shot: -- -- -accordionSimpleTabbed :: ModifiedLayout (Decoration SimpleTabbedDecoration DefaultShrinker) (ModifiedLayout ResizeScreen Accordion) Window -accordionSimpleTabbed = decoration shrinkText defaultTheme SimpleTabbed (resizeVertical 20 Accordion) +accordionSimpleTabbed :: ModifiedLayout (Decoration TabBarDecoration DefaultShrinker) (ModifiedLayout ResizeScreen Accordion) Window +accordionSimpleTabbed = simpleTabBar (resizeVertical 20 Accordion) -- | Similar to 'accordionSimpleTabbed' but with the -- possibility of setting a custom shrinker and a custom theme. accordionTabbed :: Shrinker s => s -> Theme - -> ModifiedLayout (Decoration SimpleTabbedDecoration s) (ModifiedLayout ResizeScreen Accordion) Window -accordionTabbed s t = decoration s t SimpleTabbed (resizeVertical (fi $ decoHeight t) Accordion) + -> ModifiedLayout (Decoration TabBarDecoration s) (ModifiedLayout ResizeScreen Accordion) Window +accordionTabbed s t = tabBar s t Top (resizeVertical (fi $ decoHeight t) Accordion) -- $tall @@ -441,14 +418,14 @@ tallDwmStyle s t = decoration s t Dwm tall -- Here you can find a screen shot: -- -- -tallSimpleTabbed :: ModifiedLayout (Decoration SimpleTabbedDecoration DefaultShrinker) (ModifiedLayout ResizeScreen Tall) Window -tallSimpleTabbed = decoration shrinkText defaultTheme SimpleTabbed (resizeVertical 20 tall) +tallSimpleTabbed :: ModifiedLayout (Decoration TabBarDecoration DefaultShrinker) (ModifiedLayout ResizeScreen Tall) Window +tallSimpleTabbed = simpleTabBar (resizeVertical 20 tall) -- | Similar to 'tallSimpleTabbed' but with the -- possibility of setting a custom shrinker and a custom theme. tallTabbed :: Shrinker s => s -> Theme - -> ModifiedLayout (Decoration SimpleTabbedDecoration s) (ModifiedLayout ResizeScreen Tall) Window -tallTabbed s t = decoration s t SimpleTabbed (resizeVertical (fi $ decoHeight t) tall) + -> ModifiedLayout (Decoration TabBarDecoration s) (ModifiedLayout ResizeScreen Tall) Window +tallTabbed s t = tabBar s t Top (resizeVertical (fi $ decoHeight t) tall) -- $mirror -- In this section you will find decorated layouts based on the @@ -544,14 +521,14 @@ mirrorTallDwmStyle s t = decoration s t Dwm mirrorTall -- Here you can find a screen shot: -- -- -mirrorTallSimpleTabbed :: ModifiedLayout (Decoration SimpleTabbedDecoration DefaultShrinker) (ModifiedLayout ResizeScreen (Mirror Tall)) Window -mirrorTallSimpleTabbed = decoration shrinkText defaultTheme SimpleTabbed (resizeVertical 20 mirrorTall) +mirrorTallSimpleTabbed :: ModifiedLayout (Decoration TabBarDecoration DefaultShrinker) (ModifiedLayout ResizeScreen (Mirror Tall)) Window +mirrorTallSimpleTabbed = simpleTabBar (resizeVertical 20 mirrorTall) -- | Similar to 'mirrorTallSimpleTabbed' but with the -- possibility of setting a custom shrinker and a custom theme. mirrorTallTabbed :: Shrinker s => s -> Theme - -> ModifiedLayout (Decoration SimpleTabbedDecoration s) (ModifiedLayout ResizeScreen (Mirror Tall)) Window -mirrorTallTabbed s t = decoration s t SimpleTabbed (resizeVertical (fi $ decoHeight t) mirrorTall) + -> ModifiedLayout (Decoration TabBarDecoration s) (ModifiedLayout ResizeScreen (Mirror Tall)) Window +mirrorTallTabbed s t = tabBar s t Top (resizeVertical (fi $ decoHeight t) mirrorTall) -- $float -- Here you will find decorated layout based on the SimpleFloating @@ -563,11 +540,11 @@ mirrorTallTabbed s t = decoration s t SimpleTabbed (resizeVertical (fi $ decoHei -- Here you can find a screen shot: -- -- -floatSimpleSimple :: Eq a => ModifiedLayout (Decoration SimpleDecoration DefaultShrinker) +floatSimpleSimple :: (Show a, Eq a) => ModifiedLayout (Decoration SimpleDecoration DefaultShrinker) (ModifiedLayout MouseResize (ModifiedLayout WindowArranger SimpleFloat)) a floatSimpleSimple = simpleFloat -floatSimple :: (Eq a, Shrinker s) => s -> Theme -> +floatSimple :: (Show a, Eq a, Shrinker s) => s -> Theme -> ModifiedLayout (Decoration SimpleDecoration s) (ModifiedLayout MouseResize (ModifiedLayout WindowArranger SimpleFloat)) a floatSimple = simpleFloat' @@ -577,16 +554,16 @@ floatSimple = simpleFloat' -- Here you can find a screen shot: -- -- -floatSimpleDefault :: Eq a => ModifiedLayout (Decoration DefaultDecoration DefaultShrinker) +floatSimpleDefault :: (Show a, Eq a) => ModifiedLayout (Decoration DefaultDecoration DefaultShrinker) (ModifiedLayout MouseResize (ModifiedLayout WindowArranger SimpleFloat)) a floatSimpleDefault = decoration shrinkText defaultTheme DefaultDecoration (mouseResize $ windowArrangeAll $ SF 20) -- | Same as 'floatSimpleDefault', but with the possibility of setting a -- custom shrinker and a custom theme. -floatDefault :: (Eq a, Shrinker s) => s -> Theme -> +floatDefault :: (Show a, Eq a, Shrinker s) => s -> Theme -> ModifiedLayout (Decoration DefaultDecoration s) (ModifiedLayout MouseResize (ModifiedLayout WindowArranger SimpleFloat)) a -floatDefault s c = decoration s c DefaultDecoration (mouseResize $ windowArrangeAll $ SF (decoHeight c)) +floatDefault s t = decoration s t DefaultDecoration (mouseResize $ windowArrangeAll $ SF (decoHeight t)) -- | This version is decorated with the 'DwmStyle'. Note that this is -- a keyboard only floating layout. @@ -594,16 +571,16 @@ floatDefault s c = decoration s c DefaultDecoration (mouseResize $ windowArrange -- Here you can find a screen shot: -- -- -floatSimpleDwmStyle :: Eq a => ModifiedLayout (Decoration DwmStyle DefaultShrinker) +floatSimpleDwmStyle :: (Show a, Eq a) => ModifiedLayout (Decoration DwmStyle DefaultShrinker) (ModifiedLayout MouseResize (ModifiedLayout WindowArranger SimpleFloat)) a floatSimpleDwmStyle = decoration shrinkText defaultTheme Dwm (mouseResize $ windowArrangeAll $ SF 20) -- | Same as 'floatSimpleDwmStyle', but with the possibility of setting a -- custom shrinker and a custom theme. -floatDwmStyle :: (Eq a, Shrinker s) => s -> Theme -> +floatDwmStyle :: (Show a, Eq a, Shrinker s) => s -> Theme -> ModifiedLayout (Decoration DwmStyle s) (ModifiedLayout MouseResize (ModifiedLayout WindowArranger SimpleFloat)) a -floatDwmStyle s c = decoration s c Dwm (mouseResize $ windowArrangeAll $ SF (decoHeight c)) +floatDwmStyle s t = decoration s t Dwm (mouseResize $ windowArrangeAll $ SF (decoHeight t)) -- | This version is decorated with the 'TabbedDecoration' style. -- | Mouse dragging is somehow weird. @@ -611,13 +588,13 @@ floatDwmStyle s c = decoration s c Dwm (mouseResize $ windowArrangeAll $ SF (dec -- Here you can find a screen shot: -- -- -floatSimpleTabbed :: Eq a => ModifiedLayout (Decoration SimpleTabbedDecoration DefaultShrinker) +floatSimpleTabbed :: (Show a, Eq a) => ModifiedLayout (Decoration TabBarDecoration DefaultShrinker) (ModifiedLayout MouseResize (ModifiedLayout WindowArranger SimpleFloat)) a -floatSimpleTabbed = decoration shrinkText defaultTheme SimpleTabbed (mouseResize $ windowArrangeAll $ SF 20) +floatSimpleTabbed = simpleTabBar (mouseResize $ windowArrangeAll $ SF 20) -- | Same as 'floatSimpleTabbed', but with the possibility of setting a -- custom shrinker and a custom theme. -floatTabbed :: (Eq a, Shrinker s) => s -> Theme -> - ModifiedLayout (Decoration SimpleTabbedDecoration s) +floatTabbed :: (Show a, Eq a, Shrinker s) => s -> Theme -> + ModifiedLayout (Decoration TabBarDecoration s) (ModifiedLayout MouseResize (ModifiedLayout WindowArranger SimpleFloat)) a -floatTabbed s c = decoration s c SimpleTabbed (mouseResize $ windowArrangeAll $ SF (decoHeight c)) +floatTabbed s t = tabBar s t Top (mouseResize $ windowArrangeAll $ SF (decoHeight t)) diff --git a/XMonad/Layout/TabBarDecoration.hs b/XMonad/Layout/TabBarDecoration.hs new file mode 100644 index 0000000..00cfd03 --- /dev/null +++ b/XMonad/Layout/TabBarDecoration.hs @@ -0,0 +1,70 @@ +{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-} +----------------------------------------------------------------------------- +-- | +-- Module : XMonad.Layout.TabBarDecoration +-- Copyright : (c) 2007 Andrea Rossato +-- License : BSD-style (see xmonad/LICENSE) +-- +-- Maintainer : andrea.rossato@unibz.it +-- Stability : unstable +-- Portability : unportable +-- +-- A layout modifier to add a bar of tabs to your layouts. +----------------------------------------------------------------------------- + +module XMonad.Layout.TabBarDecoration + ( -- * Usage + -- $usage + simpleTabBar, tabBar + , defaultTheme, shrinkText + , TabBarDecoration (..), XPPosition (..) + ) where + +import Data.List +import XMonad +import qualified XMonad.StackSet as S +import XMonad.Layout.Decoration +import XMonad.Prompt ( XPPosition (..) ) +-- $usage +-- You can use this module with the following in your +-- @~\/.xmonad\/xmonad.hs@: +-- +-- > import XMonad.Layout.TabBarDecoration +-- +-- Then edit your @layoutHook@ by adding the layout you want: +-- +-- > main = xmonad defaultConfig { layoutHook = simpleTabBar $ layoutHook defaultConfig} +-- +-- For more detailed instructions on editing the layoutHook see: +-- +-- "XMonad.Doc.Extending#Editing_the_layout_hook" +-- +-- 'tabBar' will give you the possibility of setting a custom shrinker +-- and a custom theme. +-- +-- The deafult theme can be dynamically change with the xmonad theme +-- selector. See "XMonad.Prompt.Theme". For more themse, look at +-- "XMonad.Util.Themes" + +simpleTabBar :: Eq a => l a -> ModifiedLayout (Decoration TabBarDecoration DefaultShrinker) l a +simpleTabBar = decoration shrinkText defaultTheme (TabBar Top) + +tabBar :: (Eq a, Shrinker s) => s -> Theme -> XPPosition -> l a -> ModifiedLayout (Decoration TabBarDecoration s) l a +tabBar s t p = decoration s t (TabBar p) + +data TabBarDecoration a = TabBar XPPosition deriving (Read, Show) + +instance Eq a => DecorationStyle TabBarDecoration a where + describeDeco _ = "TabBar" + decorateFirst _ = True + shrink _ _ r = r + decorationMouseDragHook _ _ _ = return () + pureDecoration (TabBar p) _ dht (Rectangle x y wh ht) s _ (w,_) = + if isInStack s w then Just $ Rectangle nx ny nwh (fi dht) else Nothing + where nwh = wh `div` max 1 (fi $ length $ S.integrate s) + ny = case p of + Top -> y + Bottom -> y + fi ht - fi dht + nx = case w `elemIndex` (S.integrate s) of + Just i -> x + (fi nwh * fi i) + Nothing -> x -- cgit v1.2.3