xmobar -> test own Modules 4
This commit is contained in:
110
home/programs/xmonad/src/xmobar/ColorCache..hs
Normal file
110
home/programs/xmonad/src/xmobar/ColorCache..hs
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
{-# LANGUAGE CPP #-}
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
-- |
|
||||||
|
-- Module: ColorCache
|
||||||
|
-- Copyright: (c) 2012 Jose Antonio Ortega Ruiz
|
||||||
|
-- License: BSD3-style (see LICENSE)
|
||||||
|
--
|
||||||
|
-- Maintainer: jao@gnu.org
|
||||||
|
-- Stability: unstable
|
||||||
|
-- Portability: unportable
|
||||||
|
-- Created: Mon Sep 10, 2012 00:27
|
||||||
|
--
|
||||||
|
--
|
||||||
|
-- Caching X colors
|
||||||
|
--
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if defined XFT
|
||||||
|
|
||||||
|
module ColorCache(withColors, withDrawingColors) where
|
||||||
|
|
||||||
|
import MinXft
|
||||||
|
|
||||||
|
#else
|
||||||
|
module ColorCache(withColors) where
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
import Data.IORef
|
||||||
|
import System.IO.Unsafe (unsafePerformIO)
|
||||||
|
import Control.Monad.Trans (MonadIO, liftIO)
|
||||||
|
import Control.Exception (SomeException, handle)
|
||||||
|
import Graphics.X11.Xlib
|
||||||
|
|
||||||
|
data DynPixel = DynPixel Bool Pixel
|
||||||
|
|
||||||
|
initColor :: Display -> String -> IO DynPixel
|
||||||
|
initColor dpy c = handle black $ (initColor' dpy c)
|
||||||
|
where
|
||||||
|
black :: SomeException -> IO DynPixel
|
||||||
|
black = (const . return $ DynPixel False (blackPixel dpy $ defaultScreen dpy))
|
||||||
|
|
||||||
|
type ColorCache = [(String, Color)]
|
||||||
|
{-# NOINLINE colorCache #-}
|
||||||
|
colorCache :: IORef ColorCache
|
||||||
|
colorCache = unsafePerformIO $ newIORef []
|
||||||
|
|
||||||
|
getCachedColor :: String -> IO (Maybe Color)
|
||||||
|
getCachedColor color_name = lookup color_name `fmap` readIORef colorCache
|
||||||
|
|
||||||
|
putCachedColor :: String -> Color -> IO ()
|
||||||
|
putCachedColor name c_id = modifyIORef colorCache $ \c -> (name, c_id) : c
|
||||||
|
|
||||||
|
initColor' :: Display -> String -> IO DynPixel
|
||||||
|
initColor' dpy c = do
|
||||||
|
let colormap = defaultColormap dpy (defaultScreen dpy)
|
||||||
|
cached_color <- getCachedColor c
|
||||||
|
c' <- case cached_color of
|
||||||
|
Just col -> return col
|
||||||
|
_ -> do (c'', _) <- allocNamedColor dpy colormap c
|
||||||
|
putCachedColor c c''
|
||||||
|
return c''
|
||||||
|
return $ DynPixel True (color_pixel c')
|
||||||
|
|
||||||
|
withColors :: MonadIO m => Display -> [String] -> ([Pixel] -> m a) -> m a
|
||||||
|
withColors d cs f = do
|
||||||
|
ps <- mapM (liftIO . initColor d) cs
|
||||||
|
f $ map (\(DynPixel _ pixel) -> pixel) ps
|
||||||
|
|
||||||
|
#ifdef XFT
|
||||||
|
|
||||||
|
type AXftColorCache = [(String, AXftColor)]
|
||||||
|
{-# NOINLINE xftColorCache #-}
|
||||||
|
xftColorCache :: IORef AXftColorCache
|
||||||
|
xftColorCache = unsafePerformIO $ newIORef []
|
||||||
|
|
||||||
|
getXftCachedColor :: String -> IO (Maybe AXftColor)
|
||||||
|
getXftCachedColor name = lookup name `fmap` readIORef xftColorCache
|
||||||
|
|
||||||
|
putXftCachedColor :: String -> AXftColor -> IO ()
|
||||||
|
putXftCachedColor name cptr =
|
||||||
|
modifyIORef xftColorCache $ \c -> (name, cptr) : c
|
||||||
|
|
||||||
|
initAXftColor' :: Display -> Visual -> Colormap -> String -> IO AXftColor
|
||||||
|
initAXftColor' d v cm c = do
|
||||||
|
cc <- getXftCachedColor c
|
||||||
|
c' <- case cc of
|
||||||
|
Just col -> return col
|
||||||
|
_ -> do c'' <- mallocAXftColor d v cm c
|
||||||
|
putXftCachedColor c c''
|
||||||
|
return c''
|
||||||
|
return c'
|
||||||
|
|
||||||
|
initAXftColor :: Display -> Visual -> Colormap -> String -> IO AXftColor
|
||||||
|
initAXftColor d v cm c = handle black $ (initAXftColor' d v cm c)
|
||||||
|
where
|
||||||
|
black :: SomeException -> IO AXftColor
|
||||||
|
black = (const $ initAXftColor' d v cm "black")
|
||||||
|
|
||||||
|
withDrawingColors :: -- MonadIO m =>
|
||||||
|
Display -> Drawable -> String -> String
|
||||||
|
-> (AXftDraw -> AXftColor -> AXftColor -> IO ()) -> IO ()
|
||||||
|
withDrawingColors dpy drw fc bc f = do
|
||||||
|
let screen = defaultScreenOfDisplay dpy
|
||||||
|
colormap = defaultColormapOfScreen screen
|
||||||
|
visual = defaultVisualOfScreen screen
|
||||||
|
fc' <- initAXftColor dpy visual colormap fc
|
||||||
|
bc' <- initAXftColor dpy visual colormap bc
|
||||||
|
withAXftDraw dpy drw visual colormap $ \draw -> f draw fc' bc'
|
||||||
|
#endif
|
||||||
@@ -43,14 +43,16 @@ executable xmobar
|
|||||||
main-is: xmobar.hs
|
main-is: xmobar.hs
|
||||||
|
|
||||||
other-modules: Commands,
|
other-modules: Commands,
|
||||||
|
ColorCache,
|
||||||
XUtil,
|
XUtil,
|
||||||
Plugins,
|
Plugins,
|
||||||
Plugins.Audio
|
Plugins.Audio
|
||||||
-- Other library packages from which modules are imported.
|
-- Other library packages from which modules are imported.
|
||||||
build-depends: base ^>=4.17.2.1,
|
build-depends: base ^>=4.17.2.1,
|
||||||
xmobar ^>=0.47.1,
|
xmobar ^>=0.47.1,
|
||||||
process ^>=1.6.18.0
|
process ^>=1.6.18.0,
|
||||||
|
mtl >= 2.0 && < 2.2,
|
||||||
|
X11 >= 1.6.1
|
||||||
-- Directories containing source files.
|
-- Directories containing source files.
|
||||||
hs-source-dirs: .
|
hs-source-dirs: .
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user