{-# LANGUAGE CPP #-} module DShellF(ShellF,shellF, shellF', shellKF, shellKF', setDeleteWindowAction, getDeleteWindowActionMaybe', -- for use in titleShellF DeleteWindowAction(..),setDeleteQuit, HasClickToType(..),setInitPos,setFocusMgr, HasVisible(..)) where import FDefaults import Dlayout(sF) import AutoLayout(autoLayoutF',nowait) import QuitK import Fudget import EitherUtils import CompOps import Geometry(Point(..)) import Command import Xcommand import Xtypes import Defaults(defaultSep,defaultPosition) import CmdLineEnv(argFlag) import FocusMgr(focusMgr) --import Placer --import Spacers import Spacer(marginF) --import LayoutRequest import Sizing(Sizing(..)) import NullF import ParK --import Maptrace(ctrace) -- debugging {- HBC uses "cpp -C -traditional" which causes all the to be left behind when the macro definitions are processed. That is why the definitions are inside a comment. -} newtype ShellF = Pars [Pars] data Pars = WinAttr [WindowAttributes] | DeleteWindowAction (Maybe DeleteWindowAction) | ClickToType Bool | FocusMgr Bool -- mainly for internal use | Visible Bool | Margin Int | Sizing Sizing | InitPos (Maybe Point) data DeleteWindowAction = DeleteQuit | DeleteUnmap deriving (Eq,Show) setInitPos p = cust (\ (Pars ps) -> Pars (InitPos p:ps)); getInitPos (Pars ps) = getpar (\x->case x of InitPos p -> Just p; _-> Nothing) ps; getInitPosMaybe (Pars ps) = getparMaybe (\x->case x of InitPos p -> Just p; _-> Nothing) ps setFocusMgr p = cust (\ (Pars ps) -> Pars (FocusMgr p:ps)); getFocusMgr (Pars ps) = getpar (\x->case x of FocusMgr p -> Just p; _-> Nothing) ps; getFocusMgrMaybe (Pars ps) = getparMaybe (\x->case x of FocusMgr p -> Just p; _-> Nothing) ps instance HasWinAttr (ShellF) where { setWinAttr p (Pars ps) = Pars (WinAttr p:ps); getWinAttrMaybe (Pars ps) = getparMaybe (\x->case x of WinAttr p -> Just p; _-> Nothing) ps } setDeleteWindowAction p = cust (\ (Pars ps) -> Pars (DeleteWindowAction p:ps)); getDeleteWindowAction (Pars ps) = getpar (\x->case x of DeleteWindowAction p -> Just p; _-> Nothing) ps; getDeleteWindowActionMaybe (Pars ps) = getparMaybe (\x->case x of DeleteWindowAction p -> Just p; _-> Nothing) ps getDeleteWindowActionMaybe' pm = getDeleteWindowActionMaybe (pm (Pars [])) -- Backwards compatibility: setDeleteQuit b = setDeleteWindowAction (if b then Just DeleteQuit else Nothing) class HasClickToType xxx where { setClickToType :: (Bool) -> Customiser xxx; getClickToType :: xxx -> (Bool); getClickToTypeMaybe :: xxx -> Maybe (Bool); getClickToType = fromMaybe (error "get ClickToType: missing default") . getClickToTypeMaybe } instance HasClickToType (ShellF) where { setClickToType p (Pars ps) = Pars (ClickToType p:ps); getClickToTypeMaybe (Pars ps) = getparMaybe (\x->case x of ClickToType p -> Just p; _-> Nothing) ps } class HasVisible xxx where { setVisible :: (Bool) -> Customiser xxx; getVisible :: xxx -> (Bool); getVisibleMaybe :: xxx -> Maybe (Bool); getVisible = fromMaybe (error "get Visible: missing default") . getVisibleMaybe } instance HasVisible (ShellF) where { setVisible p (Pars ps) = Pars (Visible p:ps); getVisibleMaybe (Pars ps) = getparMaybe (\x->case x of Visible p -> Just p; _-> Nothing) ps } instance HasMargin (ShellF) where { setMargin p (Pars ps) = Pars (Margin p:ps); getMarginMaybe (Pars ps) = getparMaybe (\x->case x of Margin p -> Just p; _-> Nothing) ps } instance HasSizing (ShellF) where { setSizing p (Pars ps) = Pars (Sizing p:ps); getSizingMaybe (Pars ps) = getparMaybe (\x->case x of Sizing p -> Just p; _-> Nothing) ps } shellF = shellF' standard shellF' pmod s f = stripEither >^=< shellKF' pmod k f >=^< Right where k = xcommandK (StoreName s) nullK shellKF = shellKF' standard shellKF' :: (Customiser ShellF)->K a b -> F c d -> F (Either a c) (Either b d) shellKF' pmod k f = genShellF siz clicktt focusmgr vis pos sep [] kernel f where ps = pmod (Pars [WinAttr [],DeleteWindowAction (Just DeleteQuit), ClickToType ctt, FocusMgr defFocusMgr, InitPos defaultPosition, -- hmm Visible True,Margin defaultSep,Sizing Dynamic]) -- !! Change default Sizing? d_action = getDeleteWindowAction ps clicktt = getClickToType ps focusmgr = getFocusMgr ps sep = getMargin ps vis = getVisible ps wa = getWinAttr ps siz = getSizing ps pos = getInitPos ps kernel = xcommandK (ChangeWindowAttributes wa) $ maybe (wmDeleteWindowK (const k)) -- see (*) in QuitK.hs (\ a -> quitK (action a) `parK` k) d_action action DeleteQuit = exitK action DeleteUnmap = unmapWindowK genShellF sizing ctt focusmgr map pos sep cmds k f = sF (not map) pos cmds k (filter (sepf f)) where filter = if focusmgr then focusMgr sizing ctt else autoLayoutF' nowait sizing -- usually sits inside a groupF in focusMgr sepf = if sep == 0 then id else marginF sep ctt = argFlag "ctt" True defFocusMgr = argFlag "focusmgr" True