From c7c26b047919b8f365b7fa79a958812ca2f77a01 Mon Sep 17 00:00:00 2001 From: Tomas Janousek Date: Sun, 15 Nov 2020 16:38:12 +0000 Subject: Fix crash on x when no additional fonts are specified This fixes the following crash that happens with the default xmobar configuration (using HOME=/ makes xmobar ignore ~/.xmobarrc): $ echo "x" | HOME=/ xmobar xmobar: Prelude.!!: index too large Commit 3e9e1cb9d300 ("Fix crashes/busy looping happening via index") meant to fix this but apparently it only fixed indexing of fontlist, not voffs, so the crash was still there. Fixes: https://github.com/jaor/xmobar/issues/504 --- src/Xmobar/App/Main.hs | 2 +- src/Xmobar/X11/Draw.hs | 5 +++-- src/Xmobar/X11/Types.hs | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/Xmobar/App/Main.hs b/src/Xmobar/App/Main.hs index 03a01a1..b2bdc5c 100644 --- a/src/Xmobar/App/Main.hs +++ b/src/Xmobar/App/Main.hs @@ -63,7 +63,7 @@ xmobar conf = withDeferSignals $ do let ic = Map.empty to = textOffset conf ts = textOffsets conf ++ replicate (length fl) (-1) - startLoop (XConf d r w (fs :| fl) (to:ts) ic conf) sig refLock vars + startLoop (XConf d r w (fs :| fl) (to :| ts) ic conf) sig refLock vars configFromArgs :: Config -> IO Config configFromArgs cfg = getArgs >>= getOpts >>= doOpts cfg . fst diff --git a/src/Xmobar/X11/Draw.hs b/src/Xmobar/X11/Draw.hs index 1ded312..6c00ee6 100644 --- a/src/Xmobar/X11/Draw.hs +++ b/src/Xmobar/X11/Draw.hs @@ -131,7 +131,7 @@ printString dpy drw fs@(Xft fonts) _ fc bc x y ay ht s al = #endif -- | An easy way to print the stuff we need to print -printStrings :: Drawable -> GC -> NE.NonEmpty XFont -> [Int] -> Position +printStrings :: Drawable -> GC -> NE.NonEmpty XFont -> NE.NonEmpty Int -> Position -> Align -> [((Position, Position), Box)] -> [(Widget, TextRenderInfo, Int, Position)] -> X () printStrings _ _ _ _ _ _ _ [] = return () printStrings dr gc fontlist voffs offs a boxes sl@((s,c,i,l):xs) = do @@ -142,6 +142,7 @@ printStrings dr gc fontlist voffs offs a boxes sl@((s,c,i,l):xs) = do totSLen = foldr (\(_,_,_,len) -> (+) len) 0 sl remWidth = fi wid - fi totSLen fontst = safeIndex fontlist i + voff = safeIndex voffs i offset = case a of C -> (remWidth + offs) `div` 2 R -> remWidth @@ -149,7 +150,7 @@ printStrings dr gc fontlist voffs offs a boxes sl@((s,c,i,l):xs) = do (fc,bc) = case break (==',') (tColorsString c) of (f,',':b) -> (f, b ) (f, _) -> (f, bgColor conf) - valign <- verticalOffset ht s fontst (voffs !! i) conf + valign <- verticalOffset ht s fontst voff conf let (ht',ay) = case (tBgTopOffset c, tBgBottomOffset c) of (-1,_) -> (0, -1) (_,-1) -> (0, -1) diff --git a/src/Xmobar/X11/Types.hs b/src/Xmobar/X11/Types.hs index b22f807..a403e11 100644 --- a/src/Xmobar/X11/Types.hs +++ b/src/Xmobar/X11/Types.hs @@ -35,7 +35,7 @@ data XConf = , rect :: Rectangle , window :: Window , fontListS :: NE.NonEmpty XFont - , verticalOffsets :: [Int] + , verticalOffsets :: NE.NonEmpty Int , iconS :: Map FilePath Bitmap , config :: Config } -- cgit v1.2.3