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 , getProcessWorkspace
, doAutoShift , doAutoShift
, doIgnoreProcessWorkspace , doIgnoreProcessWorkspace
, ignoreProcessWorkspace
, ignoreWinProcessWorkspace
, regroupProcess , regroupProcess
, regroupWinProcess , regroupWinProcess
, shiftIgnoreGroup , shiftIgnoreGroup
, shiftWinIgnoreGroup , shiftWinIgnoreGroup
, shiftGroup , shiftGroup
, shiftWinGroup , shiftWinGroup
, processWorkspaceStorage , handleForgetEmptyWindowGroups
, processWorkspaceManager
, spawnOn , spawnOn
, spawnOnCurrent , spawnOnCurrent
) where ) where
@ -21,17 +24,20 @@ import qualified XMonad.StackSet as W
import XMonad.Layout.LayoutModifier (LayoutModifier(..), ModifiedLayout(..)) import XMonad.Layout.LayoutModifier (LayoutModifier(..), ModifiedLayout(..))
import XMonad.Hooks.ManageHelpers (pid) import XMonad.Hooks.ManageHelpers (pid)
import Graphics.X11.Types (Window) import Graphics.X11.Types (Window)
import Graphics.X11.Xlib.Extras (Event)
import System.Posix.Process (getProcessPriority) import System.Posix.Process (getProcessPriority)
import System.Posix.Types (ProcessID) import System.Posix.Types (ProcessID)
import Control.Monad import Control.Monad
import Data.Maybe import Data.Maybe
import Data.Monoid
import qualified Data.Map as M import qualified Data.Map as M
import Storage import Storage
doAutoShift :: ManageHook doAutoShift :: ManageHook
doAutoShift = do doAutoShift = do
mp <- pid mp <- pid
@ -53,6 +59,12 @@ doIgnoreProcessWorkspace = do
liftX $ setProcessWorkspace (fromJust mp) Nothing liftX $ setProcessWorkspace (fromJust mp) Nothing
idHook idHook
ignoreProcessWorkspace :: X ()
ignoreProcessWorkspace = withFocused ignoreWinProcessWorkspace
ignoreWinProcessWorkspace :: Window -> X ()
ignoreWinProcessWorkspace w = runQuery doIgnoreProcessWorkspace w >> return ()
regroupProcess :: WorkspaceId -> X () regroupProcess :: WorkspaceId -> X ()
regroupProcess ws = withFocused $ regroupWinProcess ws regroupProcess ws = withFocused $ regroupWinProcess ws
@ -67,7 +79,7 @@ shiftIgnoreGroup ws = withFocused $ shiftWinIgnoreGroup ws
shiftWinIgnoreGroup :: WorkspaceId -> Window -> X () shiftWinIgnoreGroup :: WorkspaceId -> Window -> X ()
shiftWinIgnoreGroup ws w = do shiftWinIgnoreGroup ws w = do
runQuery doIgnoreProcessWorkspace w ignoreWinProcessWorkspace w
windows $ W.shiftWin ws w windows $ W.shiftWin ws w
shiftGroup :: WorkspaceId -> X () shiftGroup :: WorkspaceId -> X ()
@ -89,13 +101,25 @@ shiftWinGroup ws w = do
_ -> _ ->
windows $ W.shiftWin ws w 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)) data ProcessWorkspaceStoreData = ProcessWorkspaceStoreData (M.Map ProcessID (Maybe WorkspaceId))
deriving (Typeable, Show, Read) deriving (Typeable, Show, Read)
instance StoreData ProcessWorkspaceStoreData 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 :: ProcessID -> Maybe WorkspaceId -> X ()
setProcessWorkspace pid ws = do setProcessWorkspace pid ws = do

View file

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