summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Operations.hs6
-rw-r--r--StackSet.hs15
2 files changed, 11 insertions, 10 deletions
diff --git a/Operations.hs b/Operations.hs
index 9d20841..d7f6639 100644
--- a/Operations.hs
+++ b/Operations.hs
@@ -66,15 +66,11 @@ manage w = whenX (fmap not $ isClient w) $ withDisplay $ \d -> do
-- | unmanage. A window no longer exists, remove it from the window
-- list, on whatever workspace it is.
--
--- FIXME: clearFloating should be taken care of in W.delete, but if we do it
--- there, floating status is lost when moving windows between workspaces,
--- because W.shift calls W.delete.
---
-- should also unmap?
--
unmanage :: Window -> X ()
unmanage w = do
- windows (W.sink w . W.delete w)
+ windows (W.delete w)
setWMState w 0 {-withdrawn-}
modify (\s -> s {mapped = S.delete w (mapped s), waitingUnmap = M.delete w (waitingUnmap s)})
diff --git a/StackSet.hs b/StackSet.hs
index bd7a6fa..48006dd 100644
--- a/StackSet.hs
+++ b/StackSet.hs
@@ -26,7 +26,7 @@ module StackSet (
focusWindow, tagMember, member, findIndex,
-- * Modifying the stackset
-- $modifyStackset
- insertUp, delete, filter,
+ insertUp, delete, delete', filter,
-- * Setting the master window
-- $settingMW
swapMaster, swapUp, swapDown, modify, modify', float, sink, -- needed by users
@@ -453,9 +453,14 @@ insertUp a s = if member a s then s else insert
-- * otherwise, delete doesn't affect the master.
--
delete :: (Ord a, Eq s) => a -> StackSet i a s sd -> StackSet i a s sd
-delete w s = s { current = removeFromScreen (current s)
- , visible = map removeFromScreen (visible s)
- , hidden = map removeFromWorkspace (hidden s) }
+delete w = sink w . delete' w
+
+-- only temporarily remove the window from the stack, thereby not destroying special
+-- information saved in the Stackset
+delete' :: (Ord a, Eq s) => a -> StackSet i a s sd -> StackSet i a s sd
+delete' w s = s { current = removeFromScreen (current s)
+ , visible = map removeFromScreen (visible s)
+ , hidden = map removeFromWorkspace (hidden s) }
where removeFromWorkspace ws = ws { stack = stack ws >>= filter (/=w) }
removeFromScreen scr = scr { workspace = removeFromWorkspace (workspace scr) }
@@ -495,5 +500,5 @@ swapMaster = modify' $ \c -> case c of
shift :: (Ord a, Eq s, Eq i) => i -> StackSet i a s sd -> StackSet i a s sd
shift n s | n `tagMember` s && n /= curtag = maybe s go (peek s)
| otherwise = s
- where go w = view curtag . insertUp w . view n . delete w $ s
+ where go w = view curtag . insertUp w . view n . delete' w $ s
curtag = tag (workspace (current s))