summaryrefslogtreecommitdiffstats
path: root/Main.hs
diff options
context:
space:
mode:
authorDon Stewart <dons@cse.unsw.edu.au>2007-03-07 07:45:39 +0100
committerDon Stewart <dons@cse.unsw.edu.au>2007-03-07 07:45:39 +0100
commit8b3fae31bfdefbb7449c295ea4b8a569b7033380 (patch)
tree01db2f25b437d942c856ce4774f510d4f242e59c /Main.hs
parent94608f2544104e334bb3e60d433c17f93927863c (diff)
downloadmetatile-8b3fae31bfdefbb7449c295ea4b8a569b7033380.tar
metatile-8b3fae31bfdefbb7449c295ea4b8a569b7033380.zip
focus left and right (mod-j/mod-k)
darcs-hash:20070307064539-9c5c1-2578ea84009c449b3baeba8a58bfda5b39096fba
Diffstat (limited to 'Main.hs')
-rw-r--r--Main.hs65
1 files changed, 27 insertions, 38 deletions
diff --git a/Main.hs b/Main.hs
index 7cf9858..3974467 100644
--- a/Main.hs
+++ b/Main.hs
@@ -67,7 +67,9 @@ keys =
[ (mod1Mask .|. shiftMask, xK_Return, spawn "xterm")
, (mod1Mask, xK_p, spawn "exe=`dmenu_path | dmenu` && exec $exe")
, (controlMask, xK_space, spawn "gmrun")
- , (mod1Mask, xK_Tab, switch)
+ , (mod1Mask, xK_Tab, focus 1)
+ , (mod1Mask, xK_j, focus 1)
+ , (mod1Mask, xK_k, focus (-1))
, (mod1Mask .|. shiftMask, xK_q, io $ exitWith ExitSuccess)
]
@@ -112,63 +114,50 @@ handle _ = return ()
-- ---------------------------------------------------------------------
-- Managing windows
--- | Modify the current window list with a pure funtion, and refresh
-withWindows :: (Windows -> Windows) -> W ()
-withWindows f = do
- modifyWindows f
- refresh
-
--- | Run an action on the currently focused window
-withCurrent :: (Window -> W ()) -> W ()
-withCurrent f = do
- ws <- gets windows
- case ws of
- [] -> return ()
- (w:_) -> f w
-
--
-- | refresh. Refresh the currently focused window. Resizes to full
-- screen and raises the window.
--
refresh :: W ()
-refresh = withCurrent $ \w -> do
- d <- gets display
- sw <- gets screenWidth
- sh <- gets screenHeight
- io $ do moveResizeWindow d w 0 0 (fromIntegral sw) (fromIntegral sh)
- raiseWindow d w
+refresh = do
+ ws <- gets windows
+ case ws of
+ [] -> return ()
+ (w:_) -> do
+ d <- gets display
+ sw <- liftM fromIntegral (gets screenWidth)
+ sh <- liftM fromIntegral (gets screenHeight)
+ io $ do moveResizeWindow d w 0 0 sw sh
+ raiseWindow d w
+
+-- | Modify the current window list with a pure funtion, and refresh
+withWindows :: (Windows -> Windows) -> W ()
+withWindows f = do
+ modifyWindows f
+ refresh
---
-- | manage. Add a new window to be managed
---
manage :: Window -> W ()
manage w = do
trace "manage"
d <- gets display
- withWindows $ \ws -> if w `elem` ws then ws else w:ws -- a set
+ withWindows (nub . (w :))
io $ mapWindow d w
---
-- | unmanage, a window no longer exists, remove it from the stack
---
unmanage :: Window -> W ()
unmanage w = do
dpy <- gets display
- io $ grabServer dpy
- modifyWindows (filter (/= w))
- io $ sync dpy False
- io $ ungrabServer dpy
- refresh
+ io $ do grabServer dpy
+ sync dpy False
+ ungrabServer dpy
+ withWindows $ filter (/= w)
---
--- | switch. switch focus to next window in list.
+-- | focus. focus to window at offset 'n' in list.
-- The currently focused window is always the head of the list
---
-switch :: W ()
-switch = withWindows rotate
+focus :: Int -> W ()
+focus n = withWindows (rotate n)
---
-- | spawn. Launch an external application
---
spawn :: String -> W ()
spawn = io_ . runCommand