{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
----------------------------------------------------------------------------
-- |
-- Module      :  XMonad.Layout.ButtonDecoration
-- Description :  Decoration that includes buttons, executing actions when clicked on.
-- Copyright   :  (c) Jan Vornberger 2009
-- License     :  BSD3-style (see LICENSE)
--
-- Maintainer  :  jan.vornberger@informatik.uni-oldenburg.de
-- Stability   :  unstable
-- Portability :  not portable
--
-- A decoration that includes small buttons on both ends which invoke
-- various actions when clicked on: Show a window menu (see
-- "XMonad.Actions.WindowMenu"), minimize, maximize or close the window.
--
-- Note: For maximizing and minimizing to actually work, you will need
-- to integrate "XMonad.Layout.Maximize" and "XMonad.Layout.Minimize" into your
-- setup.  See the documentation of those modules for more information.
--
-----------------------------------------------------------------------------

module XMonad.Layout.ButtonDecoration
    ( -- * Usage:
      -- $usage
      buttonDeco,
      ButtonDecoration,
    ) where

import XMonad
import XMonad.Layout.Decoration
import XMonad.Layout.DecorationAddons

-- $usage
-- You can use this module with the following in your
-- @xmonad.hs@:
--
-- > import XMonad.Layout.DecorationAddons
-- > import XMonad.Layout.ButtonDecoration
--
-- Then edit your @layoutHook@ by adding the ButtonDecoration to
-- your layout:
--
-- > myL = buttonDeco shrinkText defaultThemeWithButtons (layoutHook def)
-- > main = xmonad def { layoutHook = myL }
--

buttonDeco :: (Eq a, Shrinker s) => s -> Theme
           -> l a -> ModifiedLayout (Decoration ButtonDecoration s) l a
buttonDeco :: forall a s (l :: * -> *).
(Eq a, Shrinker s) =>
s
-> Theme
-> l a
-> ModifiedLayout (Decoration ButtonDecoration s) l a
buttonDeco s
s Theme
c = s
-> Theme
-> ButtonDecoration a
-> l a
-> ModifiedLayout (Decoration ButtonDecoration s) l a
forall (ds :: * -> *) a s (l :: * -> *).
(DecorationStyle ds a, Shrinker s) =>
s -> Theme -> ds a -> l a -> ModifiedLayout (Decoration ds s) l a
decoration s
s Theme
c (ButtonDecoration a
 -> l a -> ModifiedLayout (Decoration ButtonDecoration s) l a)
-> ButtonDecoration a
-> l a
-> ModifiedLayout (Decoration ButtonDecoration s) l a
forall a b. (a -> b) -> a -> b
$ Bool -> ButtonDecoration a
forall a. Bool -> ButtonDecoration a
NFD Bool
True

newtype ButtonDecoration a = NFD Bool deriving (Int -> ButtonDecoration a -> ShowS
[ButtonDecoration a] -> ShowS
ButtonDecoration a -> String
(Int -> ButtonDecoration a -> ShowS)
-> (ButtonDecoration a -> String)
-> ([ButtonDecoration a] -> ShowS)
-> Show (ButtonDecoration a)
forall a. Int -> ButtonDecoration a -> ShowS
forall a. [ButtonDecoration a] -> ShowS
forall a. ButtonDecoration a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Int -> ButtonDecoration a -> ShowS
showsPrec :: Int -> ButtonDecoration a -> ShowS
$cshow :: forall a. ButtonDecoration a -> String
show :: ButtonDecoration a -> String
$cshowList :: forall a. [ButtonDecoration a] -> ShowS
showList :: [ButtonDecoration a] -> ShowS
Show, ReadPrec [ButtonDecoration a]
ReadPrec (ButtonDecoration a)
Int -> ReadS (ButtonDecoration a)
ReadS [ButtonDecoration a]
(Int -> ReadS (ButtonDecoration a))
-> ReadS [ButtonDecoration a]
-> ReadPrec (ButtonDecoration a)
-> ReadPrec [ButtonDecoration a]
-> Read (ButtonDecoration a)
forall a. ReadPrec [ButtonDecoration a]
forall a. ReadPrec (ButtonDecoration a)
forall a. Int -> ReadS (ButtonDecoration a)
forall a. ReadS [ButtonDecoration a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall a. Int -> ReadS (ButtonDecoration a)
readsPrec :: Int -> ReadS (ButtonDecoration a)
$creadList :: forall a. ReadS [ButtonDecoration a]
readList :: ReadS [ButtonDecoration a]
$creadPrec :: forall a. ReadPrec (ButtonDecoration a)
readPrec :: ReadPrec (ButtonDecoration a)
$creadListPrec :: forall a. ReadPrec [ButtonDecoration a]
readListPrec :: ReadPrec [ButtonDecoration a]
Read)

instance Eq a => DecorationStyle ButtonDecoration a where
    describeDeco :: ButtonDecoration a -> String
describeDeco ButtonDecoration a
_ = String
"ButtonDeco"
    decorationCatchClicksHook :: ButtonDecoration a -> Window -> Int -> Int -> X Bool
decorationCatchClicksHook ButtonDecoration a
_ = Window -> Int -> Int -> X Bool
titleBarButtonHandler
    decorationAfterDraggingHook :: ButtonDecoration a -> (Window, Rectangle) -> Window -> X ()
decorationAfterDraggingHook ButtonDecoration a
_ (Window
mainw, Rectangle
_) Window
decoWin = Window -> X ()
focus Window
mainw X () -> X Bool -> X Bool
forall a b. X a -> X b -> X b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Window -> Window -> X Bool
handleScreenCrossing Window
mainw Window
decoWin X Bool -> X () -> X ()
forall a b. X a -> X b -> X b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> X ()
forall a. a -> X a
forall (m :: * -> *) a. Monad m => a -> m a
return ()