From 90045d7d04b0b0529f25929ff32136741244dd98 Mon Sep 17 00:00:00 2001 From: Spencer Janssen Date: Sat, 7 Nov 2009 18:38:20 +0100 Subject: Add XMonad.Util.SpawnOnce Ignore-this: 8d4657bbaa8dbeb1d0f9d22293bfef19 darcs-hash:20091107173820-25a6b-8e4628c65594acd51f2fc6f601b0c3092d7316d0.gz --- XMonad/Util/SpawnOnce.hs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 XMonad/Util/SpawnOnce.hs (limited to 'XMonad/Util') diff --git a/XMonad/Util/SpawnOnce.hs b/XMonad/Util/SpawnOnce.hs new file mode 100644 index 0000000..edb3b5f --- /dev/null +++ b/XMonad/Util/SpawnOnce.hs @@ -0,0 +1,39 @@ +{-# LANGUAGE DeriveDataTypeable #-} + +----------------------------------------------------------------------------- +-- | +-- Module : XMonad.Util.ExtensibleState +-- Copyright : (c) Spencer Janssen 2009 +-- License : BSD3-style (see LICENSE) +-- +-- Maintainer : spencerjanssen@gmail.com +-- Stability : unstable +-- Portability : not portable +-- +-- A module for spawning a command once, and only once. Useful to start +-- status bars and make session settings inside startupHook. +-- +----------------------------------------------------------------------------- + +module XMonad.Util.SpawnOnce (spawnOnce) where + +import XMonad +import Data.Set as Set +import XMonad.Util.ExtensibleState +import Control.Monad + +data SpawnOnce = SpawnOnce { unspawnOnce :: (Set String) } + deriving (Read, Show, Typeable) + +instance ExtensionClass SpawnOnce where + initialValue = SpawnOnce $ Set.empty + extensionType = PersistentExtension + +-- | The first time 'spawnOnce' is executed on a particular command, that +-- command is executed. Subsequent invocations for a command do nothing. +spawnOnce :: String -> X () +spawnOnce xs = do + b <- fmap (Set.member xs . unspawnOnce) $ getState + when (not b) $ do + spawn xs + modifyState (SpawnOnce . Set.insert xs . unspawnOnce) -- cgit v1.2.3