From 5309cd40cb1384cb9de4ca114b06fbb2d3d5d45f Mon Sep 17 00:00:00 2001 From: Don Stewart Date: Sat, 9 Jun 2007 08:09:13 +0200 Subject: latest version of xmonad-status.hs darcs-hash:20070609060913-9c5c1-b6d51e6a373cbdf2d8f6bc101d693a3b32251fb5.gz --- scripts/run-xmonad.sh | 41 +++++++++ scripts/xmonad-dynamic-workspaces.hs | 127 --------------------------- scripts/xmonad-status.hs | 161 +++++++++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+), 127 deletions(-) create mode 100755 scripts/run-xmonad.sh delete mode 100644 scripts/xmonad-dynamic-workspaces.hs create mode 100644 scripts/xmonad-status.hs diff --git a/scripts/run-xmonad.sh b/scripts/run-xmonad.sh new file mode 100755 index 0000000..aad2526 --- /dev/null +++ b/scripts/run-xmonad.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# +# launch xmonad, with a couple of dzens to run the status bar +# send xmonad state over a named pipe +# + +FG='#a8a3f7' +BG='#3f3c6d' +FONT="-xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-1" + +PATH=/home/dons/bin:$PATH + +# simple xmonad use, no interactive status bar. +# +#clock | dzen2 -ta r -fg $FG -bg $BG -fn $FONT & +#exec xmonad + +# +# with a pipe talking to an external program +# +PIPE=$HOME/.xmonad-status +rm -f $PIPE +/sbin/mkfifo -m 600 $PIPE +[ -p $PIPE ] || exit + +# launch the external 60 second clock, and launch the workspace status bar +clock | dzen2 -e '' -x 300 -w 768 -ta r -fg $FG -bg $BG -fn $FONT & +xmonad-status < $PIPE | dzen2 -e '' -w 300 -ta l -fg $FG -bg $BG -fn $FONT & + +# now go for it +xmonad > $PIPE & + +# wait for xmonad +wait $! + +pkill -HUP dzen2 +pkill -HUP ssh-agent +pkill -HUP -f clock +pkill -HUP -f xmonad-status + +wait diff --git a/scripts/xmonad-dynamic-workspaces.hs b/scripts/xmonad-dynamic-workspaces.hs deleted file mode 100644 index b2c8fea..0000000 --- a/scripts/xmonad-dynamic-workspaces.hs +++ /dev/null @@ -1,127 +0,0 @@ -{-# OPTIONS -fglasgow-exts #-} ------------------------------------------------------------------------------ --- | --- Module : xmonad-status.hs --- Copyright : (c) Don Stewart 2007 --- License : BSD3-style --- Maintainer : dons@cse.unsw.edu.au --- --- An external statusbar-client for xmonad. --- --- Prints the workspaces in a simple form, read from the logging output --- of xmonad. --- --- An example use: --- --- --- #!/bin/sh --- # --- # launch xmonad, with a couple of dzens to run the status bar --- # send xmonad state over a named pipe --- # --- FG='#a8a3f7' --- BG='#3f3c6d' --- FONT="-xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-1" --- --- PATH=/home/dons/bin:$PATH --- --- # clean up and old status bar pipe --- rm -f ~/.xmonad.pipe --- --- # create a new one --- /sbin/mkfifo -m 600 ~/.xmonad.pipe --- --- xmonad-status < ~/.xmonad.pipe | dzen2 -ta l -fg $FG -bg $BG -fn $FONT & --- exec xmonad > ~/.xmonad.pipe --- --- Creates a workspace table on the left side of the screen. --- --- A version that perfectly emulates wmii or dwm could be distributed. --- ------------------------------------------------------------------------------ - -import Data.List -import StackSet -import XMonad -import System.IO -import Text.PrettyPrint - --- --- parse the StackSet output, and print it in the form: --- --- *[1] 2 *3 *4 5 6 7 8 --- --- It's an example of how to write a Haskell script to hack --- the structure defined in StackSet.hs --- - -main = forever $ getLine >>= readIO >>= draw - where - forever a = a >> forever a - --- --- All the magic is in the 'ppr' instances, below. --- -draw :: WS -> IO () -draw s = do putStrLn . render . ppr $ s - hFlush stdout - --- --------------------------------------------------------------------- --- --- A simple recursive descent pretty printer for the StackSet type. --- -class Pretty a where - ppr :: a -> Doc - --- --- And instances for the StackSet layers --- -instance Pretty WS where - ppr (StackSet { current = cws -- the different workspaces - , visible = vws - , hidden = hws }) = ppr (sortBy tags workspaces) - where - -- tag each workspace with its flavour - workspaces = C (workspace cws) : map (V . workspace) vws ++ map H hws - - -- sort them by their tags - tags a b = (tag.unWrap) a `compare` (tag.unWrap) b - --- --- How to print each workspace kind --- -instance Pretty TaggedW where - ppr (C w) = brackets (int (1 + fromIntegral (tag w))) -- [1] - ppr (V w) = parens (ppr w) -- <2> - ppr (H w) = ppr w - --- tags are printed as integers (or map them to strings) -instance Pretty W where --- Just print int tags: - ppr (Workspace i s) = - case s of - Empty -> empty - _ -> char ' ' <> int (1 + fromIntegral i) <> char ' ' - -instance Pretty a => Pretty [a] where - ppr [] = empty - ppr (x:xs) = ppr x <> ppr xs - - --- --------------------------------------------------------------------- --- Some type information for the pretty printer - --- We have a fixed workspace type -type W = Workspace WorkspaceId Int -type WS = StackSet WorkspaceId Int ScreenId - --- Introduce a newtype to distinguish different workspace flavours -data TaggedW = C W -- current - | V W -- visible - | H W -- hidden - --- And the ability to unwrap tagged workspaces -unWrap :: TaggedW -> W -unWrap (C w) = w -unWrap (V w) = w -unWrap (H w) = w diff --git a/scripts/xmonad-status.hs b/scripts/xmonad-status.hs new file mode 100644 index 0000000..a223204 --- /dev/null +++ b/scripts/xmonad-status.hs @@ -0,0 +1,161 @@ +{-# OPTIONS -fglasgow-exts #-} +----------------------------------------------------------------------------- +-- | +-- Module : xmonad-status.hs +-- Copyright : (c) Don Stewart 2007 +-- License : BSD3-style +-- Maintainer : dons@cse.unsw.edu.au +-- +-- An external statusbar-client for xmonad. +-- +-- Prints the workspaces in a simple form, read from the logging output +-- of xmonad. +-- +-- An example use: +-- +-- +{- + +#!/bin/sh +# +# launch xmonad, with a couple of dzens to run the status bar +# send xmonad state over a named pipe +# + +FG='#a8a3f7' +BG='#3f3c6d' +FONT="-xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-1" + +PATH=/home/dons/bin:$PATH + +# simple xmonad use, no interactive status bar. +# +#clock | dzen2 -ta r -fg $FG -bg $BG -fn $FONT & +#exec xmonad + +# +# with a pipe talking to an external program +# +PIPE=$HOME/.xmonad-status +rm -f $PIPE +/sbin/mkfifo -m 600 $PIPE +[ -p $PIPE ] || exit + +# launch the external 60 second clock, and launch the workspace status bar +clock | dzen2 -e '' -x 300 -w 768 -ta r -fg $FG -bg $BG -fn $FONT & +xmonad-status < $PIPE | dzen2 -e '' -w 300 -ta l -fg $FG -bg $BG -fn $FONT & + +# now go for it +xmonad > $PIPE & + +# wait for xmonad +wait $! + +pkill -HUP dzen2 +pkill -HUP ssh-agent +pkill -HUP -f clock +pkill -HUP -f xmonad-status + +# wait for all clients +wait + +-} + +-- +-- Creates a workspace table on the left side of the screen. +-- +-- A version that perfectly emulates wmii or dwm could be distributed. +-- +----------------------------------------------------------------------------- + +import Data.List +import StackSet +import XMonad +import System.IO +import Text.PrettyPrint +import Control.Exception + +-- +-- parse the StackSet output, and print it in the form: +-- +-- 1 [2] 4 8 +-- +-- It's an example of how to write a Haskell script to hack +-- the structure defined in StackSet.hs +-- + +main :: IO () +main = forever $ do s <- getLine + handle (\e -> throwDyn (show e ++ show s)) + (readIO s >>= draw) + where + forever a = catchDyn (loop a) (debug a) >> forever a + where + loop a = a >> loop a + debug a e = hPutStrLn stderr e >> forever a + +-- +-- All the magic is in the 'ppr' instances, below. +-- +draw :: WS -> IO () +draw s = do putStrLn . render . ppr $ s + hFlush stdout + +-- --------------------------------------------------------------------- +-- +-- A simple recursive descent pretty printer for the StackSet type. +-- +class Pretty a where + ppr :: a -> Doc + +-- +-- And instances for the StackSet layers +-- +instance Pretty WS where + ppr (StackSet { current = cws -- the different workspaces + , visible = vws + , hidden = hws }) = ppr (sortBy tags workspaces) + where + -- tag each workspace with its flavour + workspaces = C (workspace cws) : map (V . workspace) vws ++ map H hws + + -- sort them by their tags + tags a b = (tag.unWrap) a `compare` (tag.unWrap) b + +-- +-- How to print each workspace kind +-- +instance Pretty TaggedW where + ppr (C w) = brackets (int (1 + fromIntegral (tag w))) -- [1] + ppr (V w) = parens (ppr w) -- <2> + ppr (H w) = ppr w + +-- tags are printed as integers (or map them to strings) +instance Pretty W where +-- Just print int tags: + ppr (Workspace i s) = + case s of + Empty -> empty + _ -> char ' ' <> int (1 + fromIntegral i) <> char ' ' + +instance Pretty a => Pretty [a] where + ppr [] = empty + ppr (x:xs) = ppr x <> ppr xs + +-- --------------------------------------------------------------------- +-- Some type information for the pretty printer + +-- We have a fixed workspace type +type W = Workspace WorkspaceId Int +type WS = StackSet WorkspaceId Int ScreenId + +-- Introduce a newtype to distinguish different workspace flavours +data TaggedW = C !W -- current + | V !W -- visible + | H !W -- hidden + +-- And the ability to unwrap tagged workspaces +unWrap :: TaggedW -> W +unWrap (C w) = w +unWrap (V w) = w +unWrap (H w) = w -- cgit v1.2.3