From f0ebea1d9095c151405f0fb45603dfdd721f12f7 Mon Sep 17 00:00:00 2001 From: Tomas Janousek Date: Fri, 20 Nov 2009 15:44:26 +0100 Subject: extend XMonadLog with XPropertyLog Ignore-this: baec7062f93ab5950f57c44876c2f XMonadLog can be even more awesome with the ability to gather input from custom sources. This patch adds exactly that, along with a script to read from pipe and write to xmobar using an X property. darcs-hash:20091120144426-c9ff5-596f8b40c4b3df6ede43832b147e95e48ad582ba.gz --- Plugins/XMonadLog.hs | 12 +++++++++--- scripts/xmonadpropwrite.hs | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 scripts/xmonadpropwrite.hs diff --git a/Plugins/XMonadLog.hs b/Plugins/XMonadLog.hs index 34fae31..3461e26 100644 --- a/Plugins/XMonadLog.hs +++ b/Plugins/XMonadLog.hs @@ -30,13 +30,19 @@ import Foreign.C (CChar) import XUtil (nextEvent') -data XMonadLog = XMonadLog +data XMonadLog = XMonadLog | XPropertyLog String deriving (Read, Show) instance Exec XMonadLog where - start XMonadLog cb = do + alias XMonadLog = "XMonadLog" + alias (XPropertyLog atom) = atom + + start x cb = do + let atom = case x of + XMonadLog -> "_XMONAD_LOG" + XPropertyLog a -> a d <- openDisplay "" - xlog <- internAtom d "_XMONAD_LOG" False + xlog <- internAtom d atom False root <- rootWindow d (defaultScreen d) selectInput d root propertyChangeMask diff --git a/scripts/xmonadpropwrite.hs b/scripts/xmonadpropwrite.hs new file mode 100644 index 0000000..476a5db --- /dev/null +++ b/scripts/xmonadpropwrite.hs @@ -0,0 +1,41 @@ +-- Copyright Spencer Janssen +-- Tomas Janousek +-- BSD3 (see LICENSE) +-- +-- Reads from standard input and writes to an X propery on root window. +-- To be used with XPropertyLog: +-- Add it to commands: +-- Run XPropertyLog "_XMONAD_LOG_CUSTOM" +-- Add it to the template: +-- template = "... %_XMONAD_LOG_CUSTOM% ..." +-- Run: +-- $ blah blah | xmonadpropwrite _XMONAD_LOG_CUSTOM + +import Control.Monad +import Graphics.X11 +import Graphics.X11.Xlib.Extras +import Codec.Binary.UTF8.String as UTF8 +import Foreign.C (CChar) +import System.IO +import System.Environment + +main = do + atom <- flip fmap getArgs $ \args -> case args of + [a] -> a + _ -> "_XMONAD_LOG" + + d <- openDisplay "" + xlog <- internAtom d atom False + ustring <- internAtom d "UTF8_STRING" False + + root <- rootWindow d (defaultScreen d) + + forever $ do + msg <- getLine + changeProperty8 d root xlog ustring propModeReplace (encodeCChar msg) + sync d True + + return () + +encodeCChar :: String -> [CChar] +encodeCChar = map fromIntegral . UTF8.encode -- cgit v1.2.3