LoadFont

module LoadFont(loadQueryFont, queryFont, loadFont, loadQueryFontF, 
                queryFontF, loadFontF,safeLoadQueryFont, safeLoadQueryFontF,
                listFonts,listFontsF,listFontsWithInfo,tryLoadFont) where
import Command(XRequest(..))
import Event
import Font(fsl2fs) --FontStruct,FontStructList,
--import Fudget
--import Geometry(Line, Point, Rect, Size(..))
--import EitherUtils(stripMaybe,mapMaybe)
import Data.Maybe(fromJust)
import HbcUtils(mapSnd)
import Cont(tryM)
import Xrequest
import Xtypes

lf k fontname =
    let cmd = LoadFont fontname
        expected (FontLoaded fid) = Just fid
        expected _ = Nothing
    in k cmd expected

loadFont x = lf xrequest x
loadFontF = lf xrequestF

qf k fid =
    let cmd = QueryFont fid
        expected (FontQueried fs) = Just (fsl2fs (fromJust fs))
        expected _ = Nothing
    in  k cmd expected

queryFont x = qf xrequest x
queryFontF = qf xrequestF

lqf k fontname =
    let cmd = LoadQueryFont fontname
        expected (FontQueried optfs) = Just (fmap fsl2fs optfs)
        expected _ = Nothing
    in  k cmd expected

loadQueryFont x = lqf xrequest x
loadQueryFontF = lqf xrequestF

safeLqf lqf fn k =
  tryM (lqf fn)
       (lqf ("fixed"::FontName) $ \ (Just fs) -> k fs)
       k

safeLoadQueryFont x = safeLqf loadQueryFont x
safeLoadQueryFontF = safeLqf loadQueryFontF

lif k pattern maxnames =
    let cmd = ListFonts pattern maxnames
        expected (GotFontList fns) = Just fns
	expected _ = Nothing
    in k cmd expected

listFonts x = lif xrequest x
listFontsF = lif xrequestF

listFontsWithInfo pattern maxnames =
    let cmd = ListFontsWithInfo pattern maxnames
        expected (GotFontListWithInfo fis) = Just (mapSnd fsl2fs fis)
--      expected (GotFontListWithInfo fis) = Just (map ((,) pattern . fsl2fs) fis)
	expected _ = Nothing
    in xrequest cmd expected

-- Since loadFont succeeds and returns a FontId even if the font doesn't exist:
tryLoadFont fn k =
  listFonts fn 1 $ \ fns ->
  case fns of
    fn:_ -> loadFont fn (k . Just)
    _ -> k Nothing