xmobar -> test own Modules 2
This commit is contained in:
@@ -12,5 +12,11 @@
|
||||
};
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [ xmobar maim xdotool xorg.xmessage ];
|
||||
home.packages = with pkgs; [
|
||||
xmobar
|
||||
maim
|
||||
xdotool
|
||||
xorg.xmessage
|
||||
cabal-install
|
||||
];
|
||||
}
|
||||
|
||||
85
home/programs/xmonad/src/xmobar/Commands.hs
Normal file
85
home/programs/xmonad/src/xmobar/Commands.hs
Normal file
@@ -0,0 +1,85 @@
|
||||
-----------------------------------------------------------------------------
|
||||
-- |
|
||||
-- Module : Xmobar.Commands
|
||||
-- Copyright : (c) Andrea Rossato
|
||||
-- License : BSD-style (see LICENSE)
|
||||
--
|
||||
-- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org>
|
||||
-- Stability : unstable
|
||||
-- Portability : unportable
|
||||
--
|
||||
-- The 'Exec' class and the 'Command' data type.
|
||||
--
|
||||
-- The 'Exec' class rappresents the executable types, whose constructors may
|
||||
-- appear in the 'Config.commands' field of the 'Config.Config' data type.
|
||||
--
|
||||
-- The 'Command' data type is for OS commands to be run by xmobar
|
||||
--
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
module Commands
|
||||
( Command (..)
|
||||
, Exec (..)
|
||||
, tenthSeconds
|
||||
) where
|
||||
|
||||
import Prelude
|
||||
import Control.Concurrent
|
||||
import Control.Exception (handle, SomeException(..))
|
||||
import Data.Char
|
||||
import System.Process
|
||||
import System.Exit
|
||||
import System.IO (hClose)
|
||||
|
||||
import Signal
|
||||
import XUtil
|
||||
|
||||
class Show e => Exec e where
|
||||
alias :: e -> String
|
||||
alias e = takeWhile (not . isSpace) $ show e
|
||||
rate :: e -> Int
|
||||
rate _ = 10
|
||||
run :: e -> IO String
|
||||
run _ = return ""
|
||||
start :: e -> (String -> IO ()) -> IO ()
|
||||
start e cb = go
|
||||
where go = run e >>= cb >> tenthSeconds (rate e) >> go
|
||||
trigger :: e -> (Maybe SignalType -> IO ()) -> IO ()
|
||||
trigger _ sh = sh Nothing
|
||||
|
||||
data Command = Com Program Args Alias Rate
|
||||
deriving (Show,Read,Eq)
|
||||
|
||||
type Args = [String]
|
||||
type Program = String
|
||||
type Alias = String
|
||||
type Rate = Int
|
||||
|
||||
instance Exec Command where
|
||||
alias (Com p _ a _)
|
||||
| p /= "" = if a == "" then p else a
|
||||
| otherwise = ""
|
||||
start (Com prog args _ r) cb = if r > 0 then go else exec
|
||||
where go = exec >> tenthSeconds r >> go
|
||||
exec = do
|
||||
(i,o,e,p) <- runInteractiveCommand (unwords (prog:args))
|
||||
exit <- waitForProcess p
|
||||
let closeHandles = hClose o >> hClose i >> hClose e
|
||||
getL = handle (\(SomeException _) -> return "")
|
||||
(hGetLineSafe o)
|
||||
case exit of
|
||||
ExitSuccess -> do str <- getL
|
||||
closeHandles
|
||||
cb str
|
||||
_ -> do closeHandles
|
||||
cb $ "Could not execute command " ++ prog
|
||||
|
||||
|
||||
-- | Work around to the Int max bound: since threadDelay takes an Int, it
|
||||
-- is not possible to set a thread delay grater than about 45 minutes.
|
||||
-- With a little recursion we solve the problem.
|
||||
tenthSeconds :: Int -> IO ()
|
||||
tenthSeconds s | s >= x = do threadDelay (x * 100000)
|
||||
tenthSeconds (s - x)
|
||||
| otherwise = threadDelay (s * 100000)
|
||||
where x = (maxBound :: Int) `div` 100000
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
module Plugins.Audio where
|
||||
|
||||
--import Plugins
|
||||
import Plugins
|
||||
import System.Process
|
||||
import GHC.Show (Show(show))
|
||||
|
||||
|
||||
@@ -42,7 +42,10 @@ executable xmobar
|
||||
-- .hs or .lhs file containing the Main module.
|
||||
main-is: xmobar.hs
|
||||
|
||||
other-modules: Plugins.Audio
|
||||
other-modules: Commands,
|
||||
XUtil,
|
||||
Plugins,
|
||||
Plugins.Audio
|
||||
-- Other library packages from which modules are imported.
|
||||
build-depends: base ^>=4.17.2.1,
|
||||
xmobar ^>=0.47.1,
|
||||
|
||||
Reference in New Issue
Block a user