xmonad-contrib-0.18.2: XMonad/Layout/DecorationEx/DwmGeometry.hs
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RecordWildCards #-}
-----------------------------------------------------------------------------
-- |
-- Module : XMonad.Layout.DecorationEx.DwmGeometry
-- Description : DWM-style window decoration geometry
-- Copyright : (c) 2007 Andrea Rossato, 2023 Ilya Portnov
-- License : BSD-style (see xmonad/LICENSE)
--
-- Maintainer : portnov84@rambler.ru
-- Stability : unstable
-- Portability : unportable
--
-- This defines window decorations which are shown as a bar of fixed width
-- on top of window.
-----------------------------------------------------------------------------
module XMonad.Layout.DecorationEx.DwmGeometry (
-- * Usage:
-- $usage
DwmGeometry (..),
dwmStyleDeco, dwmStyleDecoEx
) where
import XMonad
import XMonad.Prelude
import qualified XMonad.StackSet as W
import XMonad.Layout.LayoutModifier
import qualified XMonad.Layout.Decoration as D
import XMonad.Layout.DecorationEx.LayoutModifier
import XMonad.Layout.DecorationEx.Common
import XMonad.Layout.DecorationEx.Geometry
import XMonad.Layout.DecorationEx.Widgets
import XMonad.Layout.DecorationEx.TextEngine
-- $usage
-- You can use this module with the following in your
-- @xmonad.hs@:
--
-- > import XMonad.Layout.DecorationEx.DwmStyle
-- Then edit your @layoutHook@ by adding the DwmStyle decoration to
-- your layout:
--
-- > myL = dwmStyleDeco shrinkText (layoutHook def)
-- > main = xmonad def { layoutHook = myL }
--
-- For more detailed instructions on editing the layoutHook see:
--
-- "XMonad.Doc.Extending#Editing_the_layout_hook"
-- | Decoration geometry data type
data DwmGeometry a = DwmGeometry {
dwmShowForFocused :: !Bool -- ^ Whether to show decorations on focused windows
, dwmHorizontalPosition :: !Rational -- ^ Horizontal position of decoration rectangle.
-- 0 means place it at left corner, 1 - place it at
-- right corner, @1%2@ - place it at center.
, dwmDecoHeight :: !Dimension -- ^ Height of decoration rectangle
, dwmDecoWidth :: !Dimension -- ^ Width of decoration rectangle
}
deriving (Show, Read)
instance Default (DwmGeometry a) where
def = DwmGeometry False 1 20 200
instance DecorationGeometry DwmGeometry Window where
describeGeometry _ = "DwmStyle"
pureDecoration (DwmGeometry {..}) _ stack _ (w, Rectangle x y windowWidth _) =
let width = min windowWidth dwmDecoWidth
halfWidth = width `div` 2
minCenterX = x + fi halfWidth
maxCenterX = x + fi windowWidth - fromIntegral halfWidth
centerX = round ((1 - dwmHorizontalPosition)*fi minCenterX + dwmHorizontalPosition*fi maxCenterX) :: Position
decoX = centerX - fi halfWidth
focusedWindow = W.focus stack
isFocused = focusedWindow == w
in if (not dwmShowForFocused && isFocused) || not (D.isInStack stack w)
then Nothing
else Just $ Rectangle decoX y width dwmDecoHeight
shrinkWindow _ _ windowRect = windowRect
-- | Add a decoration to window layout. Widgets are indicated with text fragments using TextDecoration;
-- decoration placement can be adjusted.
dwmStyleDecoEx :: D.Shrinker shrinker
=> shrinker -- ^ Strings shrinker, for example @shrinkText@
-> DwmGeometry Window
-> ThemeEx StandardWidget -- ^ Decoration theme (font, colors, widgets, etc)
-> l Window -- ^ Layout to be decorated
-> ModifiedLayout (DecorationEx TextDecoration StandardWidget DwmGeometry shrinker) l Window
dwmStyleDecoEx shrinker geom theme = decorationEx shrinker theme TextDecoration geom
-- | Add a decoration to window layout. Widgets are indicated with text fragments using TextDecoration;
-- decoration placement is similar to DWM.
dwmStyleDeco :: D.Shrinker shrinker
=> shrinker -- ^ Strings shrinker, for example @shrinkText@
-> ThemeEx StandardWidget -- ^ Decoration theme (font, colors, widgets, etc)
-> l Window -- ^ Layout to be decorated
-> ModifiedLayout (DecorationEx TextDecoration StandardWidget DwmGeometry shrinker) l Window
dwmStyleDeco shrinker = dwmStyleDecoEx shrinker def