mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 03:20:21 -07:00
1. Move maximized window into the background when it's not focused. 2. Changed semantics so that maximizing a different window will automatically restore the currently maximized window and maximize the new one (previously this had to be done in two seperate steps).
84 lines
2.9 KiB
Haskell
84 lines
2.9 KiB
Haskell
{-# LANGUAGE DeriveDataTypeable, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, TypeSynonymInstances #-}
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- |
|
|
-- Module : XMonad.Layout.Maximize
|
|
-- Copyright : (c) 2007 James Webb
|
|
-- License : BSD3-style (see LICENSE)
|
|
--
|
|
-- Maintainer : xmonad#jwebb,sygneca,com
|
|
-- Stability : unstable
|
|
-- Portability : unportable
|
|
--
|
|
-- Temporarily yanks the focused window out of the layout to mostly fill
|
|
-- the screen.
|
|
--
|
|
-----------------------------------------------------------------------------
|
|
|
|
module XMonad.Layout.Maximize (
|
|
-- * Usage
|
|
-- $usage
|
|
maximize,
|
|
maximizeRestore
|
|
) where
|
|
|
|
import XMonad
|
|
import qualified XMonad.StackSet as S
|
|
import XMonad.Layout.LayoutModifier
|
|
import Data.List ( partition )
|
|
|
|
-- $usage
|
|
-- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
|
|
--
|
|
-- > import XMonad.Layout.Maximize
|
|
--
|
|
-- Then edit your @layoutHook@ by adding the Maximize layout modifier:
|
|
--
|
|
-- > myLayouts = maximize (Tall 1 (3/100) (1/2)) ||| Full ||| etc..
|
|
-- > main = xmonad defaultConfig { layoutHook = myLayouts }
|
|
--
|
|
-- For more detailed instructions on editing the layoutHook see:
|
|
--
|
|
-- "XMonad.Doc.Extending#Editing_the_layout_hook"
|
|
--
|
|
-- In the key-bindings, do something like:
|
|
--
|
|
-- > , ((modMask x, xK_backslash), withFocused (sendMessage . maximizeRestore))
|
|
-- > ...
|
|
--
|
|
-- For detailed instruction on editing the key binding see:
|
|
--
|
|
-- "XMonad.Doc.Extending#Editing_key_bindings".
|
|
|
|
data Maximize a = Maximize (Maybe Window) deriving ( Read, Show )
|
|
maximize :: LayoutClass l Window => l Window -> ModifiedLayout Maximize l Window
|
|
maximize = ModifiedLayout $ Maximize Nothing
|
|
|
|
data MaximizeRestore = MaximizeRestore Window deriving ( Typeable, Eq )
|
|
instance Message MaximizeRestore
|
|
maximizeRestore :: Window -> MaximizeRestore
|
|
maximizeRestore = MaximizeRestore
|
|
|
|
instance LayoutModifier Maximize Window where
|
|
modifierDescription (Maximize _) = "Maximize"
|
|
pureModifier (Maximize (Just target)) rect (Just (S.Stack focused _ _)) wrs =
|
|
if focused == target
|
|
then (maxed ++ rest, Nothing)
|
|
else (rest ++ maxed, Nothing)
|
|
where
|
|
(toMax, rest) = partition (\(w, _) -> w == target) wrs
|
|
maxed = map (\(w, _) -> (w, maxRect)) toMax
|
|
maxRect = Rectangle (rect_x rect + 25) (rect_y rect + 25)
|
|
(rect_width rect - 50) (rect_height rect - 50)
|
|
pureModifier _ _ _ wrs = (wrs, Nothing)
|
|
|
|
handleMess (Maximize mw) m = case fromMessage m of
|
|
Just (MaximizeRestore w) -> case mw of
|
|
Just w' -> if (w == w')
|
|
then return $ Just $ Maximize Nothing -- restore window
|
|
else return $ Just $ Maximize $ Just w -- maximize different window
|
|
Nothing -> return $ Just $ Maximize $ Just w -- maximize window
|
|
_ -> return Nothing
|
|
|
|
-- vim: sw=4:et
|