diff options
| -rw-r--r-- | Xmobar.hs | 66 | 
1 files changed, 38 insertions, 28 deletions
| @@ -115,14 +115,14 @@ eventLoop xc@(XConf d _ w fs c) v = block $ do  -- and the TVar the command will be writing to.  startCommand :: (Runnable,String,String) -> IO (Maybe ThreadId, TVar String)  startCommand (com,s,ss) -    | alias com == ""  = do var <- atomically $ newTVar is -                            atomically $ writeTVar var "Could not parse the template" -                            return (Nothing,var) -    | otherwise        = do var <- atomically $ newTVar is -                            let cb str = atomically $ writeTVar var (s ++ str ++ ss) -                            h <- forkIO $ start com cb -                            return (Just h,var) -    where is = "Updating... " +    | alias com == "" = do var <- atomically $ newTVar is +                           atomically $ writeTVar var "Could not parse the template" +                           return (Nothing,var) +    | otherwise       = do var <- atomically $ newTVar is +                           let cb str = atomically $ writeTVar var (s ++ str ++ ss) +                           h <- forkIO $ start com cb +                           return (Just h,var) +    where is = s ++ "Updating..." ++ ss  -- $window @@ -160,20 +160,29 @@ getStrutValues h c      | position c == Bottom = [0, 0, 0   , fi h]      | otherwise            = [0, 0, 0   , 0   ] -  updateWin :: TVar String -> X ()  updateWin v = do -  c  <- asks config -  r  <- asks rect -  i  <- io $ atomically $ readTVar v -  ps <- io $ parseString c i -  drawInWin r ps +  xc <- ask +  let (conf,rec) = (config &&& rect) xc +      [lc,rc]    = if length (alignSep conf) == 2  +                   then alignSep conf  +                   else alignSep defaultConfig +  i <- io $ atomically $ readTVar v +  let [l,c,r] = if (lc `elem` i && rc `elem` i) +                then let (le,_:re) = break (==lc) i +                         (ce,_:ri) = break (==rc) re +                     in [le,ce,ri] +                else [i,[],[]] +  ps <- io $ mapM (parseString conf) [l,c,r] +  drawInWin rec ps  -- $print +data Align = C | L | R +  -- | Draws in and updates the window -drawInWin :: Rectangle -> [(String, String)] -> X () -drawInWin (Rectangle _ _ wid ht) str = do +drawInWin :: Rectangle -> [[(String, String)]] -> X () +drawInWin (Rectangle _ _ wid ht) ~[left,center,right] = do    r <- ask    let (c,d ) = (config &&& display) r        (w,fs) = (window &&& fontS  ) r @@ -188,21 +197,23 @@ drawInWin (Rectangle _ _ wid ht) str = do    io $ setForeground d gc bgcolor    io $ fillRectangle d p gc 0 0 wid ht    -- write to the pixmap the new string -  let strWithLenth = map (\(s,cl) -> (s,cl,textWidth fs s)) str -  printStrings p gc fs 1 strWithLenth  +  let strWithLenth str = map (\(s,cl) -> (s,cl,textWidth fs s)) str +  printStrings p gc fs 1 L $ strWithLenth left +  printStrings p gc fs 1 R $ strWithLenth right +  printStrings p gc fs 1 C $ strWithLenth center    -- copy the pixmap with the new string to the window    io $ copyArea   d p w gc 0 0 wid ht 0 0    -- free up everything (we do not want to leak memory!)    io $ freeGC     d gc    io $ freePixmap d p    -- resync -  io $ sync d True +  io $ sync       d True  -- | An easy way to print the stuff we need to print  printStrings :: Drawable -> GC -> FontStruct -> Position -             -> [(String, String, Position)] -> X () -printStrings _ _ _ _ [] = return () -printStrings dr gc fontst offs sl@((s,c,l):xs) = do +             -> Align -> [(String, String, Position)] -> X () +printStrings _ _ _ _ _ [] = return () +printStrings dr gc fontst offs a sl@((s,c,l):xs) = do    r <- ask    let (conf,d)    = (config &&& display) r        (Rectangle _ _ wid ht ) = rect r @@ -210,11 +221,10 @@ printStrings dr gc fontst offs sl@((s,c,l):xs) = do        totSLen     = foldr (\(_,_,len) -> (+) len) 0 sl        valign      = (fi ht + fi as - fi ds) `div` 2        remWidth    = fi wid - fi totSLen -      offset      = case (align conf) of -                      "center" -> (remWidth + offs) `div` 2 -                      "right"  -> remWidth - 1 -                      "left"   -> offs -                      _        -> offs +      offset      = case a of +                      C -> (remWidth + offs) `div` 2 +                      R -> remWidth - 1 +                      L -> offs    (fc,bc) <- case (break (==',') c) of                 (f,',':b) -> do                   fgc <- io $ initColor d f @@ -227,7 +237,7 @@ printStrings dr gc fontst offs sl@((s,c,l):xs) = do    io $ setForeground d gc fc    io $ setBackground d gc bc    io $ drawImageString d dr gc offset valign s -  printStrings dr gc fontst (offs + l) xs +  printStrings dr gc fontst (offs + l) a xs  {- $unmanwin | 
