Forget empty window groups

This commit is contained in:
Matthias Schiffer 2011-03-01 02:31:21 +01:00
parent 5af4daccc8
commit 2ec96d9c24
2 changed files with 33 additions and 10 deletions

View file

@ -4,13 +4,16 @@ module ProcessWorkspaces ( setProcessWorkspace
, getProcessWorkspace
, doAutoShift
, doIgnoreProcessWorkspace
, ignoreProcessWorkspace
, ignoreWinProcessWorkspace
, regroupProcess
, regroupWinProcess
, shiftIgnoreGroup
, shiftWinIgnoreGroup
, shiftGroup
, shiftWinGroup
, processWorkspaceStorage
, handleForgetEmptyWindowGroups
, processWorkspaceManager
, spawnOn
, spawnOnCurrent
) where
@ -21,17 +24,20 @@ import qualified XMonad.StackSet as W
import XMonad.Layout.LayoutModifier (LayoutModifier(..), ModifiedLayout(..))
import XMonad.Hooks.ManageHelpers (pid)
import Graphics.X11.Types (Window)
import Graphics.X11.Xlib.Extras (Event)
import System.Posix.Process (getProcessPriority)
import System.Posix.Types (ProcessID)
import Control.Monad
import Data.Maybe
import Data.Monoid
import qualified Data.Map as M
import Storage
doAutoShift :: ManageHook
doAutoShift = do
mp <- pid
@ -53,6 +59,12 @@ doIgnoreProcessWorkspace = do
liftX $ setProcessWorkspace (fromJust mp) Nothing
idHook
ignoreProcessWorkspace :: X ()
ignoreProcessWorkspace = withFocused ignoreWinProcessWorkspace
ignoreWinProcessWorkspace :: Window -> X ()
ignoreWinProcessWorkspace w = runQuery doIgnoreProcessWorkspace w >> return ()
regroupProcess :: WorkspaceId -> X ()
regroupProcess ws = withFocused $ regroupWinProcess ws
@ -67,7 +79,7 @@ shiftIgnoreGroup ws = withFocused $ shiftWinIgnoreGroup ws
shiftWinIgnoreGroup :: WorkspaceId -> Window -> X ()
shiftWinIgnoreGroup ws w = do
runQuery doIgnoreProcessWorkspace w
ignoreWinProcessWorkspace w
windows $ W.shiftWin ws w
shiftGroup :: WorkspaceId -> X ()
@ -89,13 +101,25 @@ shiftWinGroup ws w = do
_ ->
windows $ W.shiftWin ws w
handleForgetEmptyWindowGroups :: Event -> X All
handleForgetEmptyWindowGroups (UnmapEvent {ev_window = w}) = do
mp <- runQuery pid w
when (isJust mp) $ do
wins <- withWindowSet $ return . W.allWindows
hasWindows <- foldM (\b w' -> liftM ((|| b) . (&& (w /= w')) . (== mp)) . runQuery pid $ w') False wins
unless hasWindows $ updateStoreData ((\(ProcessWorkspaceStoreData map) -> ProcessWorkspaceStoreData $ M.delete (fromJust mp) map))
return $ All True
handleForgetEmptyWindowGroups _ = return $ All True
data ProcessWorkspaceStoreData = ProcessWorkspaceStoreData (M.Map ProcessID (Maybe WorkspaceId))
deriving (Typeable, Show, Read)
instance StoreData ProcessWorkspaceStoreData
processWorkspaceStorage :: (LayoutClass l a) => l a -> ModifiedLayout (Storage ProcessWorkspaceStoreData) l a
processWorkspaceStorage = storage $ ProcessWorkspaceStoreData M.empty
processWorkspaceManager :: (LayoutClass l a) => l a -> ModifiedLayout (Storage ProcessWorkspaceStoreData) l a
processWorkspaceManager = storage (ProcessWorkspaceStoreData M.empty)
setProcessWorkspace :: ProcessID -> Maybe WorkspaceId -> X ()
setProcessWorkspace pid ws = do

View file

@ -93,12 +93,10 @@ myManageHook :: ManageHook
myManageHook = composeAll
[ isDialog --> doFloat
, composeOne
[ className =? "Guake.py" -?> (doFloatMaybeFullscreen <+> doIgnoreProcessWorkspace) -- <+> doConfigBorderOff)
--, className =? "Do" -?> (doFloat <+> doConfigBorderOff)
, className =? "Gmpc" -?> doIgnoreProcessWorkspace
, className =? "Liferea" -?> doIgnoreProcessWorkspace
, className =? "Gnome-session" -?> doIgnoreProcessWorkspace
[ className =? "Guake.py" -?> doFloatMaybeFullscreen -- <+> doConfigBorderOff)
--, className =? "Do" -?> (doFloat <+> doConfigBorderOff)
, className =? "MPlayer" -?> doCenterFloat
, className =? "Gnome-session" -?> doIgnoreProcessWorkspace
, className =? "Gimp" -?> doFloat
, className =? "Display" -?> doFloat
, className =? "Wine" -?> doFloat
@ -111,7 +109,7 @@ myManageHook = composeAll
]
myLayoutHook = processWorkspaceStorage $ manageFullscreen $ smartBorders (Full ||| tiled ||| Mirror tiled)
myLayoutHook = processWorkspaceManager $ manageFullscreen $ smartBorders (Full ||| tiled ||| Mirror tiled)
where
-- default tiling algorithm partitions the screen into two panes
tiled = ResizableTall nmaster delta ratio []
@ -127,5 +125,6 @@ myLayoutHook = processWorkspaceStorage $ manageFullscreen $ smartBorders (Full |
myEventHook :: Event -> X All
myEventHook ev = do
handleForgetEmptyWindowGroups ev
handleFullscreen ev
(handleEventHook gnomeConfig) ev