diff options
| -rw-r--r-- | Config.hs | 3 | ||||
| -rw-r--r-- | Plugins/XMonadLog.hs | 66 | 
2 files changed, 68 insertions, 1 deletions
| @@ -30,6 +30,7 @@ import Plugins.Date  import Plugins.PipeReader  import Plugins.CommandReader  import Plugins.StdinReader +import Plugins.XMonadLog  #ifdef INOTIFY  import Plugins.Mail @@ -90,7 +91,7 @@ infixr :*:  -- the 'Runnable.Runnable' Read instance. To install a plugin just add  -- the plugin's type to the list of types (separated by ':*:') appearing in  -- this function's type signature. -runnableTypes :: Command :*: Monitors :*: Date :*: PipeReader :*: CommandReader :*: StdinReader :*: +runnableTypes :: Command :*: Monitors :*: Date :*: PipeReader :*: CommandReader :*: StdinReader :*: XMonadLog :*:  #ifdef INOTIFY                   Mail :*:  #endif diff --git a/Plugins/XMonadLog.hs b/Plugins/XMonadLog.hs new file mode 100644 index 0000000..34fae31 --- /dev/null +++ b/Plugins/XMonadLog.hs @@ -0,0 +1,66 @@ +{-# LANGUAGE CPP #-} + +----------------------------------------------------------------------------- +-- | +-- Module      :  Plugins.StdinReader +-- Copyright   :  (c) Spencer Janssen +-- License     :  BSD-style (see LICENSE) +-- +-- Maintainer  :  Spencer Janssen <spencerjanssen@gmail.com> +-- Stability   :  unstable +-- Portability :  unportable +-- +-- A plugin to display information from _XMONAD_LOG, specified at +-- http://code.haskell.org/XMonadContrib/XMonad/Hooks/DynamicLog.hs +-- +----------------------------------------------------------------------------- + +module Plugins.XMonadLog (XMonadLog(..)) where + +import Control.Monad +import Graphics.X11 +import Graphics.X11.Xlib.Extras +import Plugins +#ifdef UTF8 +#undef UTF8 +import Codec.Binary.UTF8.String as UTF8 +#define UTF8 +#endif +import Foreign.C (CChar) +import XUtil (nextEvent') + + +data XMonadLog = XMonadLog +    deriving (Read, Show) + +instance Exec XMonadLog where +    start XMonadLog cb = do +        d <- openDisplay "" +        xlog <- internAtom d "_XMONAD_LOG" False + +        root  <- rootWindow d (defaultScreen d) +        selectInput d root propertyChangeMask + +        let update = do +                        mwp <- getWindowProperty8 d xlog root +                        maybe (return ()) (cb . decodeCChar) mwp + +        update + +        allocaXEvent $ \ep -> forever $ do +            nextEvent' d ep +            e <- getEvent ep +            case e of +                PropertyEvent { ev_atom = a } | a ==  xlog -> update +                _ -> return () + +        return () + +decodeCChar :: [CChar] -> String +#ifdef UTF8 +#undef UTF8 +decodeCChar = UTF8.decode . map fromIntegral +#define UTF8 +#else +decodeCChar = map (toEnum . fromIntegral) +#endif | 
