From 4866f2e367dfcf22a9591231ba40948826a1b438 Mon Sep 17 00:00:00 2001 From: Spencer Janssen Date: Thu, 1 Nov 2007 21:10:59 +0100 Subject: Hierarchify darcs-hash:20071101201059-a5988-fc1f1262bec1b69e13ba18ae7cefeafc8c4471d4.gz --- XMonad/Layout/Magnifier.hs | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 XMonad/Layout/Magnifier.hs (limited to 'XMonad/Layout/Magnifier.hs') diff --git a/XMonad/Layout/Magnifier.hs b/XMonad/Layout/Magnifier.hs new file mode 100644 index 0000000..bcff71d --- /dev/null +++ b/XMonad/Layout/Magnifier.hs @@ -0,0 +1,69 @@ +{-# OPTIONS_GHC -fglasgow-exts #-} + +----------------------------------------------------------------------------- +-- | +-- Module : XMonad.Layout.Magnifier +-- Copyright : (c) Peter De Wachter 2007 +-- License : BSD-style (see xmonad/LICENSE) +-- +-- Maintainer : Peter De Wachter +-- Stability : unstable +-- Portability : unportable +-- +-- Screenshot : +-- +-- This layout hack increases the size of the window that has focus. +-- +----------------------------------------------------------------------------- + + +module XMonad.Layout.Magnifier ( + -- * Usage + -- $usage + magnifier, magnifier') where + +import Graphics.X11.Xlib (Window, Rectangle(..)) +import XMonad +import XMonad.StackSet +import XMonad.Layout.LayoutHelpers + +-- $usage +-- > import XMonad.Layout.Magnifier +-- > layouts = [ magnifier tiled , magnifier $ mirror tiled ] + +-- %import XMonad.Layout.Magnifier +-- %layout , magnifier tiled +-- %layout , magnifier $ mirror tiled + +-- | Increase the size of the window that has focus, unless it is the master window. +magnifier :: Layout Window -> Layout Window +magnifier = layoutModify (unlessMaster applyMagnifier) idModMod + +-- | Increase the size of the window that has focus, even if it is the master window. +magnifier' :: Layout Window -> Layout Window +magnifier' = layoutModify applyMagnifier idModMod + +unlessMaster :: ModDo Window -> ModDo Window +unlessMaster mainmod r s wrs = if null (up s) then return (wrs, Nothing) + else mainmod r s wrs + +applyMagnifier :: ModDo Window +applyMagnifier r _ wrs = do focused <- withWindowSet (return . peek) + let mag (w,wr) ws | focused == Just w = ws ++ [(w, shrink r $ magnify wr)] + | otherwise = (w,wr) : ws + return (reverse $ foldr mag [] wrs, Nothing) + +magnify :: Rectangle -> Rectangle +magnify (Rectangle x y w h) = Rectangle x' y' w' h' + where x' = x - fromIntegral (w' - w) `div` 2 + y' = y - fromIntegral (h' - h) `div` 2 + w' = round $ fromIntegral w * zoom + h' = round $ fromIntegral h * zoom + zoom = 1.5 :: Double + +shrink :: Rectangle -> Rectangle -> Rectangle +shrink (Rectangle sx sy sw sh) (Rectangle x y w h) = Rectangle x' y' w' h' + where x' = max sx x + y' = max sy y + w' = min w (fromIntegral sx + sw - fromIntegral x') + h' = min h (fromIntegral sy + sh - fromIntegral y') -- cgit v1.2.3