From ecbb6fa15adf6baa517e694fb032ec03e36dc179 Mon Sep 17 00:00:00 2001 From: Peter De Wachter Date: Thu, 14 Jun 2007 20:32:19 +0000 Subject: [PATCH] Magnifier layout hack This layout hack increases the size of the window that has focus (the master window excepted). This causes it to overlap with nearby windows, so not for tiling purists :) Screenshot: http://caladan.rave.org/magnifier.png --- Magnifier.hs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ MetaModule.hs | 1 + 2 files changed, 48 insertions(+) create mode 100644 Magnifier.hs diff --git a/Magnifier.hs b/Magnifier.hs new file mode 100644 index 00000000..3f378ffe --- /dev/null +++ b/Magnifier.hs @@ -0,0 +1,47 @@ +----------------------------------------------------------------------------- +-- | +-- Module : XMonadContrib.Magnifier +-- Copyright : (c) Peter De Wachter 2007 +-- License : BSD-style (see xmonad/LICENSE) +-- +-- Maintainer : Peter De Wachter +-- Stability : unstable +-- Portability : unportable +-- +-- Screenshot : http://caladan.rave.org/magnifier.png +-- +-- This layout hack increases the size of the window that has focus. +-- The master window is left alone. (Maybe that should be an option.) +-- +-- +----------------------------------------------------------------------------- + + +module XMonadContrib.Magnifier (magnifier) where + +import Graphics.X11.Xlib +import XMonad +import StackSet + +magnifier :: Layout -> Layout +magnifier l = l { doLayout = \r s -> applyMagnifier r s `fmap` doLayout l r s + , modifyLayout = \x -> fmap magnifier `fmap` modifyLayout l x } + +applyMagnifier :: Rectangle -> Stack Window -> [(Window, Rectangle)] -> [(Window, Rectangle)] +applyMagnifier r s | null (up s) = id -- don't change the master window + | otherwise = map $ \(w,wr) -> if w == focus s then (w, shrink r $ magnify wr) else (w, wr) + +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') diff --git a/MetaModule.hs b/MetaModule.hs index a993792a..f0369652 100644 --- a/MetaModule.hs +++ b/MetaModule.hs @@ -35,6 +35,7 @@ import XMonadContrib.HintedTile () import XMonadContrib.LayoutHints () import XMonadContrib.MagicFocus () import XMonadContrib.Mosaic () +import XMoandContrib.Magnifier () import XMonadContrib.NamedWindows () import XMonadContrib.NoBorders () import XMonadContrib.RotView ()