From 38b76e9c25a1203b82af19b13c6275003fa12ac3 Mon Sep 17 00:00:00 2001 From: Jan Vornberger Date: Wed, 30 Sep 2009 17:53:43 +0200 Subject: WindowMenu based on GridSelect that displays actions for the focused window (re-recorded from Bluetile repo). Ignore-this: b12a06c0321f3e9689ab8109a1fac0ac darcs-hash:20090930155343-594c5-99907dad481917c83083ce8d30f6debb64f8938d.gz --- XMonad/Actions/WindowMenu.hs | 75 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 XMonad/Actions/WindowMenu.hs (limited to 'XMonad') diff --git a/XMonad/Actions/WindowMenu.hs b/XMonad/Actions/WindowMenu.hs new file mode 100644 index 0000000..6183c35 --- /dev/null +++ b/XMonad/Actions/WindowMenu.hs @@ -0,0 +1,75 @@ +---------------------------------------------------------------------------- +-- | +-- Module : XMonad.Actions.WindowMenu +-- Copyright : (c) Jan Vornberger 2009 +-- License : BSD3-style (see LICENSE) +-- +-- Maintainer : jan.vornberger@informatik.uni-oldenburg.de +-- Stability : unstable +-- Portability : not portable +-- +-- Uses XMonad.Actions.GridSelect to display a number of actions related to +-- window management in the center of the focused window. Actions include: Closing, +-- maximizing, minimizing and shifting the window to another workspace. +-- +----------------------------------------------------------------------------- + +module XMonad.Actions.WindowMenu ( + -- * Usage + -- $usage + windowMenu + ) where + +import XMonad +import qualified XMonad.StackSet as W +import XMonad.Actions.GridSelect +import XMonad.Layout.Maximize +import XMonad.Layout.Minimize + +-- $usage +-- +-- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@: +-- +-- > import XMonad.Actions.WindowMenu +-- +-- Then add a keybinding, e.g. +-- +-- > , ((modMask x, xK_o ), windowMenu) + +simpleColorizer :: (Monad m) => t -> t -> t1 -> Bool -> m (t, [Char]) +simpleColorizer nBC _ _ False = return (nBC, "black") +simpleColorizer _ fBC _ True = return (fBC, "black") + +windowMenu :: X () +windowMenu = withFocused $ \w -> do + nBC <- asks (normalBorderColor . config) + fBC <- asks (focusedBorderColor . config) + tags <- asks (workspaces . config) + Rectangle x y wh ht <- getSize w + Rectangle sx sy swh sht <- gets $ screenRect . W.screenDetail . W.current . windowset + let originFractX = (fromIntegral x - fromIntegral sx + (fromIntegral wh / 2)) + / fromIntegral swh + originFractY = (fromIntegral y -fromIntegral sy + (fromIntegral ht / 2)) + / fromIntegral sht + colorizer = simpleColorizer nBC fBC + gsConfig = buildDefaultGSConfig colorizer + gsConfig' = gsConfig { gs_originFractX = originFractX, + gs_originFractY = originFractY } + actions = [ ("Cancel menu", return ()) + , ("Close" , kill) + , ("Maximize" , sendMessage $ maximizeRestore w) + , ("Minimize" , sendMessage $ MinimizeWin w) + ] ++ + [ ("Move to " ++ tag, windows $ W.shift tag) + | tag <- tags ] + runSelectedAction gsConfig' actions + +getSize :: Window -> X (Rectangle) +getSize w = do + d <- asks display + wa <- io $ getWindowAttributes d w + let x = fromIntegral $ wa_x wa + y = fromIntegral $ wa_y wa + wh = fromIntegral $ wa_width wa + ht = fromIntegral $ wa_height wa + return (Rectangle x y wh ht) -- cgit v1.2.3