-- ----------------------------------------------------------------------- -- -- $Source: /repository/uni/htk/containers/Window.hs,v $ -- -- HTk - a GUI toolkit for Haskell - (c) Universitaet Bremen -- -- $Revision: 1.7 $ from $Date: 2002/01/07 21:14:13 $ -- Last modification by $Author: ludi $ -- -- ----------------------------------------------------------------------- --- -- Basic types and classes concerning toplevel window resources. module Window ( Window(..), Display, HasGeometry(..), HasSize(..), HasPosition(..), HasText(..), maxSize, getMaxSize, minSize, getMinSize, raiseWin, lowerWin, WindowState(..), AspectRatio, Whom, isWMConfig, ) where import Resources import Geometry import Configuration import ReferenceVariables import Core import Char import Computation import IOExts type Display = String -- ----------------------------------------------------------------------- -- class Window -- ----------------------------------------------------------------------- --- -- Toplevel windows instantiate the class Window. class GUIObject w => Window w where --- -- Iconifies the window. iconify :: w -> IO () --- -- Deiconifies the window. deiconify :: w -> IO () --- -- Withdraws the window. withdraw :: w -> IO () --- -- Puts the window on top. putWinOnTop :: w -> IO () --- -- Puts the window at bottom. putWinAtBottom :: w -> IO () --- -- Sets the screen for this window. screen :: Display -> Config w --- -- Gets the screen from this window. getScreen :: w -> IO (Display) --- -- Returns the resource class of the given window. getClassName :: w -> IO String --- -- Gets the current window state. getWindowState :: w -> IO WindowState --- -- Sets the aspect ratio for the given window. aspectRatio :: AspectRatio -> Config w --- -- Gets the aspect ratio of the given window. getAspectRatio :: w -> IO AspectRatio --- -- Set 'Whom' to be Program or -- User. positionFrom :: Whom -> Config w --- -- Gets the current setting. getPositionFrom :: w -> IO Whom --- -- Set 'Whom' to be Program or sizeFrom :: Whom -> Config w --- -- Gets the current setting. getSizeFrom :: w -> IO Whom iconify win = cset win "state" Iconified >> done deiconify win = do {cset win "state" Deiconified; done} withdraw win = do {cset win "state" Withdrawn; done} putWinOnTop win = execMethod win (\nm -> [tkPutOnTop nm]) putWinAtBottom win = execMethod win (\nm -> [tkPutAtBottom nm]) screen "" win = cset win "screen" ":0.0" screen scr win = cset win "screen" scr getScreen win = cget win "screen" getClassName win = evalMethod win (\nm -> [tkWInfoClass nm]) getWindowState win = cget win "state" aspectRatio ratio win = cset win "aspect" ratio getAspectRatio win = cget win "aspect" positionFrom w win = cset win "positionfrom" w getPositionFrom win = cget win "positionfrom" sizeFrom w win = cset win "sizefrom" w getSizeFrom win = cget win "sizefrom" -- ----------------------------------------------------------------------- -- instances -- ----------------------------------------------------------------------- --- -- A window has a configureable size and anchor position (geometry). instance Window w => HasGeometry w where --- -- Sets the window's geometry. geometry g win = cset win "geometry" g --- -- Gets the current geometry of the given window. getGeometry win = cget win "geometry" --- -- A window has a configureable size. instance Window w => HasSize w where --- -- Sets the window's width. width w win = getGeometry win >>= \(_,h,x,y) -> geometry (w,h,x,y) win --- -- Gets the window's width. getWidth win = getGeometry win >>= \ (w,_,_,_) -> return w --- -- Sets the window's height. height h win = getGeometry win >>= \(w,_,x,y) -> geometry (w,h,x,y) win --- -- Gets the window's height. getHeight win = do (_,h,_, _) <- getGeometry win return h --- -- Sets the window's width and height. size (w,h) win = do (_,_,x,y) <- getGeometry win geometry (w,h,x,y) win --- -- Gets the window's width and height. getSize win = getGeometry win >>= \(w,h,_,_) -> return (w,h) --- -- A window has a position on the associated screen. instance Window w => HasPosition w where --- -- Sets the window's position- position (x,y) win = do (w, h, _, _) <- getGeometry win geometry (w, h, x, y) win --- -- Gets the window's position. getPosition win = do (_, _, x, y) <- getGeometry win return (x, y) --- -- A window has a title. instance (Window w, GUIValue v) => HasText w v where --- -- Sets the window's title. text s win = cset win "iconname" s >> cset win "title" s --- -- Gets the window's title. getText win = cget win "title" -- ----------------------------------------------------------------------- -- maximum and minimum size's -- ----------------------------------------------------------------------- --- -- Constraints the maximum size of the window. maxSize :: Window w => Size -> Config w maxSize s win = cset win "maxsize" s --- -- Gets the maximum size of the window. getMaxSize :: Window w => w -> IO Size getMaxSize win = cget win "maxsize" --- -- Constraints the minimum size of the window. minSize :: Window w => Size -> Config w minSize s win = cset win "minsize" s --- -- Gets the minimum size of the window. getMinSize :: Window w => w -> IO Size getMinSize win = cget win "minsize" -- ----------------------------------------------------------------------- -- stack order -- ----------------------------------------------------------------------- --- -- Puts the first given window just above the second given window -- in the stacking order. -- @param w1 - the first window. -- @param w2 - the second window. -- @return result - None. raiseWin :: (Window w1, Window w2) => w1 -> w2 -> IO () raiseWin win1 win2 = do nm2 <- getObjectName (toGUIObject win2) execMethod win1 (\nm1 -> [tkRaise nm1 nm2]) --- -- Puts the first given window just below the second given window -- in the stacking order. -- @param w1 - the first window. -- @param w2 - the second window. -- @return result - None. lowerWin :: (Window w1, Window w2) => w1 -> w2 -> IO () lowerWin win1 win2 = do nm2 <- getObjectName (toGUIObject win2) execMethod win1 (\nm1 -> [tkLower nm1 nm2]) -- ----------------------------------------------------------------------- -- WindowState -- ----------------------------------------------------------------------- --- -- The WindowState datatype. data WindowState = Deiconified | Iconified | Withdrawn deriving (Eq,Ord,Enum) --- -- Internal. instance GUIValue WindowState where --- -- Internal. cdefault = Deiconified --- -- Internal. instance Read WindowState where --- -- Internal. readsPrec p b = case dropWhile (isSpace) b of 'n':'o':'r':'m':'a':'l':xs -> [(Deiconified,xs)] 'i':'c':'o':'n':'i':'c':xs -> [(Iconified,xs)] 'w':'i':'t':'h':'d':'r':'a':'w':xs -> [(Withdrawn,xs)] _ -> [] --- -- Internal. instance Show WindowState where --- -- Internal. showsPrec d p r = (case p of Deiconified -> "deiconify" Iconified -> "iconic" Withdrawn -> "withdraw") ++ r -- ----------------------------------------------------------------------- -- AspectRatio -- ----------------------------------------------------------------------- --- -- The AspectRatio datatype. data AspectRatio = AspectRatio Int Int Int Int deriving Eq --- -- Internal. instance GUIValue AspectRatio where --- -- Internal. cdefault = AspectRatio 0 0 0 0 --- -- Internal. toGUIValue v = GUIVALUE HaskellTk (show v) --- -- Internal. maybeGUIValue (GUIVALUE _ s) = case [x | (x,t) <- reads s, ("","") <- lex t] of [x] -> Just x _ -> Nothing --- -- Internal. instance Show AspectRatio where --- -- Internal. showsPrec d c r = cshow c ++ r where cshow (AspectRatio xt yt xf yf) = (show xt) ++ " " ++ (show yt) ++ " " ++ (show xf) ++ " " ++ (show yf) --- -- Internal. instance Read AspectRatio where --- -- Internal. readsPrec p str = [(cread str,[])] where cread str = AspectRatio (read xt) (read yt) (read xf) (read yf) [xt,yt,xf,yf] = words str -- ----------------------------------------------------------------------- -- Whom -- ----------------------------------------------------------------------- --- -- The Whom datatype. data Whom = Program | User deriving (Eq,Ord,Enum) --- -- Internal. instance GUIValue Whom where --- -- Internal. cdefault = Program --- -- Internal. instance Read Whom where --- -- Internal. readsPrec p b = case dropWhile (isSpace) b of 'u':'s':'e':'r':xs -> [(User,xs)] 'p':'r':'o':'g':'r':'a':'m':xs -> [(Program,xs)] _ -> [] --- -- Internal. instance Show Whom where --- -- Internal. showsPrec d p r = (case p of Program -> "program" User -> "user") ++ r -- ----------------------------------------------------------------------- -- auxiliary functions -- ----------------------------------------------------------------------- --- -- Internal. isWMConfig :: ConfigID -> Bool isWMConfig "state" = True isWMConfig "geometry" = True isWMConfig "minsize" = True isWMConfig "maxsize" = True isWMConfig "aspect" = True isWMConfig "sizefrom" = True isWMConfig "positionfrom" = True isWMConfig "title" = True isWMConfig "transient" = True isWMConfig "group" = True isWMConfig "iconname" = True isWMConfig "iconbitmap" = True isWMConfig "iconposition" = True isWMConfig "iconmask" = True isWMConfig "focusmodel" = True isWMConfig _ = False -- ----------------------------------------------------------------------- -- unparsing of commands -- ----------------------------------------------------------------------- tkWInfoClass :: ObjectName -> TclCmd tkWInfoClass nm = "winfo class " ++ show nm {-# INLINE tkWInfoClass #-} tkPutOnTop :: ObjectName -> TclCmd tkPutOnTop win = "raise " ++ show win {-# INLINE tkPutOnTop #-} tkPutAtBottom :: ObjectName -> TclCmd tkPutAtBottom win = "lower " ++ show win {-# INLINE tkPutAtBottom #-} tkRaise :: ObjectName -> ObjectName -> TclCmd tkRaise win1 win2 = "raise " ++ show win1 ++ " " ++ show win2 {-# INLINE tkRaise #-} tkLower :: ObjectName -> ObjectName -> TclCmd tkLower win1 win2 = "lower " ++ show win1 ++ " " ++ show win2 {-# INLINE tkLower #-}