From cc6e55dfcdeea2eb5052b1b909384c7b2bd7a676 Mon Sep 17 00:00:00 2001 From: Don Stewart Date: Wed, 7 Mar 2007 04:21:39 +0100 Subject: comments for Main.hs, add io_, like io but return () darcs-hash:20070307032139-9c5c1-b063c7a18960d67fabf03d42b6b9d01a855c9cf5.gz --- Main.hs | 110 ++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 73 insertions(+), 37 deletions(-) (limited to 'Main.hs') diff --git a/Main.hs b/Main.hs index 9f2d8cd..0c455f8 100644 --- a/Main.hs +++ b/Main.hs @@ -6,7 +6,7 @@ -- -- Maintainer : sjanssen@cse.unl.edu -- Stability : unstable --- Portability : not portable, uses cunning newtype deriving +-- Portability : not portable, uses mtl, X11, posix -- ----------------------------------------------------------------------------- -- @@ -27,11 +27,57 @@ import System.Exit import Wm +------------------------------------------------------------------------ + +-- +-- let's get underway +-- +main :: IO () +main = do + dpy <- openDisplay "" + runWm realMain $ WmState + { display = dpy + , screenWidth = displayWidth dpy (defaultScreen dpy) + , screenHeight = displayHeight dpy (defaultScreen dpy) + , windows = Seq.empty + } + return () + +-- +-- Grab the display and input, and jump into the input loop +-- +realMain :: Wm () +realMain = do + dpy <- getDisplay + let screen = defaultScreen dpy + io $ do root <- rootWindow dpy screen + selectInput dpy root (substructureRedirectMask .|. substructureNotifyMask) + sync dpy False + grabkeys + loop + +-- +-- The main event handling loop +-- +loop :: Wm () +loop = do + dpy <- getDisplay + forever $ do + e <- io $ allocaXEvent $ \ev -> nextEvent dpy ev >> getEvent ev + handler e + where + forever a = a >> forever a + +-- +-- The event handler +-- handler :: Event -> Wm () handler (MapRequestEvent {window = w}) = manage w + handler (DestroyWindowEvent {window = w}) = do modifyWindows (Seq.fromList . filter (/= w) . Fold.toList) refresh + handler (KeyEvent {event_type = t, state = mod, keycode = code}) | t == keyPress = do dpy <- getDisplay @@ -41,6 +87,9 @@ handler (KeyEvent {event_type = t, state = mod, keycode = code}) ((_, _, act):_) -> act handler _ = return () +-- +-- switch focus (?) +-- switch :: Wm () switch = do ws' <- getWindows @@ -50,19 +99,27 @@ switch = do setWindows (ws |> w) refresh +-- +-- | spawn. Launch an external application +-- spawn :: String -> Wm () -spawn c = do - io $ runCommand c - return () +spawn = io_ . runCommand +-- +-- | Keys we understand. +-- keys :: [(KeyMask, KeySym, Wm ())] -keys = +keys = [ (mod1Mask .|. shiftMask, xK_Return, spawn "xterm") - , (controlMask, xK_space, spawn "gmrun") - , (mod1Mask, xK_Tab, switch) - , (mod1Mask .|. shiftMask, xK_q, io $ exitWith ExitSuccess) + , (controlMask, xK_space, spawn "gmrun") + , (mod1Mask, xK_Tab, switch) + , (mod1Mask .|. shiftMask, xK_q, io $ exitWith ExitSuccess) ] +-- +-- | grabkeys. Register key commands +-- +grabkeys :: Wm () grabkeys = do dpy <- getDisplay root <- io $ rootWindow dpy (defaultScreen dpy) @@ -70,6 +127,9 @@ grabkeys = do code <- io $ keysymToKeycode dpy sym io $ grabKey dpy code mod root True grabModeAsync grabModeAsync +-- +-- +-- manage :: Window -> Wm () manage w = do trace "manage" @@ -81,6 +141,9 @@ manage w = do io $ mapWindow d w refresh +-- +-- refresh the windows +-- refresh :: Wm () refresh = do v <- getWindows @@ -90,33 +153,6 @@ refresh = do d <- getDisplay sw <- getScreenWidth sh <- getScreenHeight - io $ moveResizeWindow d w 0 0 (fromIntegral sw) (fromIntegral sh) - io $ raiseWindow d w - -main = do - dpy <- openDisplay "" - runWm main' (WmState - { display = dpy - , screenWidth = displayWidth dpy (defaultScreen dpy) - , screenHeight = displayHeight dpy (defaultScreen dpy) - , windows = Seq.empty - }) - return () - -main' = do - dpy <- getDisplay - let screen = defaultScreen dpy - io $ do root <- rootWindow dpy screen - selectInput dpy root (substructureRedirectMask .|. substructureNotifyMask) - sync dpy False - grabkeys - loop + io $ do moveResizeWindow d w 0 0 (fromIntegral sw) (fromIntegral sh) + raiseWindow d w -loop :: Wm () -loop = do - dpy <- getDisplay - e <- io $ allocaXEvent $ \ev -> do - nextEvent dpy ev - getEvent ev - handler e - loop -- cgit v1.2.3