From 84fbd550987fdbcd976b65753ecc59da2707907f Mon Sep 17 00:00:00 2001 From: Patrick Chilton Date: Tue, 25 Sep 2012 16:30:20 +0200 Subject: Added keyboard lock status command. --- src/Plugins/Locks.hs | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/Plugins/Locks.hs (limited to 'src/Plugins') diff --git a/src/Plugins/Locks.hs b/src/Plugins/Locks.hs new file mode 100644 index 0000000..296bcb4 --- /dev/null +++ b/src/Plugins/Locks.hs @@ -0,0 +1,51 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Plugins.Locks +-- Copyright : (c) Patrick Chilton +-- License : BSD-style (see LICENSE) +-- +-- Maintainer : Patrick Chilton +-- Stability : unstable +-- Portability : unportable +-- +-- A plugin that displays the status of the lock keys. +-- +----------------------------------------------------------------------------- + +module Plugins.Locks where + +import Graphics.X11 +import Data.List +import Data.Bits +import Control.Monad +import Graphics.X11.Xlib.Extras +import Plugins + +data Locks = Locks + deriving (Read, Show) + +locks :: [ ( KeySym, String )] +locks = [ ( xK_Caps_Lock, "CAPS" ) + , ( xK_Num_Lock, "NUM" ) + , ( xK_Scroll_Lock, "SCROLL" ) + ] + +instance Exec Locks where + alias Locks = "locks" + rate Locks = 2 + run Locks = do + d <- openDisplay "" + root <- rootWindow d (defaultScreen d) + + modMap <- getModifierMapping d + ( _, _, _, _, _, _, _, m ) <- queryPointer d root + + ls <- filterM ( \( ks, _ ) -> do + kc <- keysymToKeycode d ks + return $ case find (elem kc . snd) modMap of + Nothing -> False + Just ( i, _ ) -> testBit m (fromIntegral i) + ) locks + closeDisplay d + + return $ unwords $ map snd ls \ No newline at end of file -- cgit v1.2.3