Forget empty window groups
This commit is contained in:
parent
5af4daccc8
commit
2ec96d9c24
2 changed files with 33 additions and 10 deletions
|
@ -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
|
||||||
|
|
11
xmonad.hs
11
xmonad.hs
|
@ -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
|
||||||
|
|
Reference in a new issue