From 3a7859e2147e714471717d4dcb58d9a19c24cb88 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 4 Feb 2013 03:17:50 +0400 Subject: Handle XReadBitmapFile errors --- src/Bitmap.hs | 11 ++++++++--- src/XGraphic.hs | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Bitmap.hs b/src/Bitmap.hs index c512ff2..9df2f67 100644 --- a/src/Bitmap.hs +++ b/src/Bitmap.hs @@ -46,9 +46,14 @@ loadBitmap d w p = do exist <- doesFileExist p if exist then do - (bw, bh, bp, _, _) <- readBitmapFile d w p - addFinalizer bp (freePixmap d bp) - return $ Just $ Bitmap bw bh bp + bmap <- readBitmapFile d w p + case bmap of + Right (bw, bh, bp, _, _) -> do + addFinalizer bp (freePixmap d bp) + return $ Just $ Bitmap bw bh bp + Left err -> do + putStrLn err + return Nothing else return Nothing diff --git a/src/XGraphic.hs b/src/XGraphic.hs index 9343580..416177f 100644 --- a/src/XGraphic.hs +++ b/src/XGraphic.hs @@ -22,7 +22,7 @@ import Foreign.C -- | interface to the X11 library function @XWriteBitmapFile@. readBitmapFile :: Display -> Drawable -> String - -> IO (Dimension, Dimension, Pixmap, Maybe CInt, Maybe CInt) + -> IO (Either String (Dimension, Dimension, Pixmap, Maybe CInt, Maybe CInt)) readBitmapFile display d filename = withCString filename $ \ c_filename -> alloca $ \ width_return -> @@ -30,7 +30,7 @@ readBitmapFile display d filename = alloca $ \ bitmap_return -> alloca $ \ x_hot_return -> alloca $ \ y_hot_return -> do - _ <- xReadBitmapFile display d c_filename width_return height_return + rv <- xReadBitmapFile display d c_filename width_return height_return bitmap_return x_hot_return y_hot_return width <- peek width_return height <- peek height_return @@ -41,7 +41,12 @@ readBitmapFile display d filename = | otherwise = Just x_hot m_y_hot | y_hot == -1 = Nothing | otherwise = Just y_hot - return (fromIntegral width, fromIntegral height, bitmap, m_x_hot, m_y_hot) + case rv of + 0 -> return $ Right (fromIntegral width, fromIntegral height, bitmap, m_x_hot, m_y_hot) + 1 -> return $ Left "readBitmapFile: BitmapOpenFailed" + 2 -> return $ Left "readBitmapFile: BitmapFileInvalid" + 3 -> return $ Left "readBitmapFile: BitmapNoMemory" + _ -> return $ Left "readBitmapFile: BitmapUnknownError" foreign import ccall unsafe "X11/Xlib.h XReadBitmapFile" xReadBitmapFile :: Display -> Drawable -> CString -> Ptr CInt -> Ptr CInt -> Ptr Pixmap -> Ptr CInt -> Ptr CInt -> IO CInt -- cgit v1.2.3