From 16f0bee5a49f95aa47e1ab59010f79b62c07710b Mon Sep 17 00:00:00 2001 From: Anton Vorontsov Date: Tue, 16 Sep 2014 18:18:30 -0700 Subject: Locks: Implement event-driven locks indicator This commit does more fundamental rework of the "Locks" plug-in: now the plug-in is fully event-driven and thus extremely power-efficient, effectively zero CPU consumption while idling. --- src/Plugins/Kbd.hsc | 3 +++ src/Plugins/Locks.hs | 11 ++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Kbd.hsc b/src/Plugins/Kbd.hsc index 241dde4..318effc 100644 --- a/src/Plugins/Kbd.hsc +++ b/src/Plugins/Kbd.hsc @@ -276,6 +276,9 @@ xkbUseCoreKbd = #const XkbUseCoreKbd xkbStateNotify :: CUInt xkbStateNotify = #const XkbStateNotify +xkbIndicatorStateNotify :: CUInt +xkbIndicatorStateNotify = #const XkbIndicatorStateNotify + xkbMapNotify :: CUInt xkbMapNotify = #const XkbMapNotify diff --git a/src/Plugins/Locks.hs b/src/Plugins/Locks.hs index b30eb1b..79b1583 100644 --- a/src/Plugins/Locks.hs +++ b/src/Plugins/Locks.hs @@ -20,6 +20,8 @@ import Data.Bits import Control.Monad import Graphics.X11.Xlib.Extras import Plugins +import Plugins.Kbd +import XUtil (nextEvent') data Locks = Locks deriving (Read, Show) @@ -46,14 +48,17 @@ run' d root = do instance Exec Locks where alias Locks = "locks" - rate Locks = 2 start Locks cb = do d <- openDisplay "" root <- rootWindow d (defaultScreen d) + _ <- xkbSelectEventDetails d xkbUseCoreKbd xkbIndicatorStateNotify m m - forever $ do + allocaXEvent $ \ep -> forever $ do cb =<< run' d root - tenthSeconds $ rate Locks + nextEvent' d ep + getEvent ep closeDisplay d return () + where + m = xkbAllStateComponentsMask -- cgit v1.2.3