mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 03:20:21 -07:00
Minimize: Replaced calls to 'sendMessage' (BW.focusDown) and 'windows' with alternative methods
Calling these functions during message handling results in the loss of layout state. This fixes a number of bugs related to the combination of X.L.Minimize with a decoration.
This commit is contained in:
parent
980a22434b
commit
82147d137c
@ -62,7 +62,7 @@ windowMenu = withFocused $ \w -> do
|
|||||||
actions = [ ("Cancel menu", return ())
|
actions = [ ("Cancel menu", return ())
|
||||||
, ("Close" , kill)
|
, ("Close" , kill)
|
||||||
, ("Maximize" , sendMessage $ maximizeRestore w)
|
, ("Maximize" , sendMessage $ maximizeRestore w)
|
||||||
, ("Minimize" , sendMessage $ MinimizeWin w)
|
, ("Minimize" , minimizeWindow w)
|
||||||
] ++
|
] ++
|
||||||
[ ("Move to " ++ tag, windows $ W.shift tag)
|
[ ("Move to " ++ tag, windows $ W.shift tag)
|
||||||
| tag <- tags ]
|
| tag <- tags ]
|
||||||
|
@ -141,7 +141,7 @@ bluetileKeys conf@(XConfig {XMonad.modMask = modMask'}) = M.fromList $
|
|||||||
, ((modMask' , xK_z), withFocused (sendMessage . maximizeRestore))
|
, ((modMask' , xK_z), withFocused (sendMessage . maximizeRestore))
|
||||||
|
|
||||||
-- Minimizing
|
-- Minimizing
|
||||||
, ((modMask', xK_m ), withFocused (\f -> sendMessage (MinimizeWin f)))
|
, ((modMask', xK_m ), withFocused minimizeWindow)
|
||||||
, ((modMask' .|. shiftMask, xK_m ), sendMessage RestoreNextMinimizedWin)
|
, ((modMask' .|. shiftMask, xK_m ), sendMessage RestoreNextMinimizedWin)
|
||||||
]
|
]
|
||||||
++
|
++
|
||||||
|
@ -47,7 +47,7 @@ minimizeEventHook (ClientMessageEvent {ev_window = w,
|
|||||||
when (mt == a_cs) $ do
|
when (mt == a_cs) $ do
|
||||||
let message = fromIntegral . head $ dt
|
let message = fromIntegral . head $ dt
|
||||||
when (message == normalState) $ sendMessage (RestoreMinimizedWin w)
|
when (message == normalState) $ sendMessage (RestoreMinimizedWin w)
|
||||||
when (message == iconicState) $ sendMessage (MinimizeWin w)
|
when (message == iconicState) $ minimizeWindow w
|
||||||
|
|
||||||
return (All True)
|
return (All True)
|
||||||
minimizeEventHook _ = return (All True)
|
minimizeEventHook _ = return (All True)
|
||||||
|
@ -62,7 +62,7 @@ titleBarButtonHandler mainw distFromLeft distFromRight = do
|
|||||||
then focus mainw >> sendMessage (maximizeRestore mainw) >> return True
|
then focus mainw >> sendMessage (maximizeRestore mainw) >> return True
|
||||||
else if (fi distFromRight >= minimizeButtonOffset &&
|
else if (fi distFromRight >= minimizeButtonOffset &&
|
||||||
fi distFromRight <= minimizeButtonOffset + buttonSize)
|
fi distFromRight <= minimizeButtonOffset + buttonSize)
|
||||||
then focus mainw >> sendMessage (MinimizeWin mainw) >> return True
|
then focus mainw >> minimizeWindow mainw >> return True
|
||||||
else return False
|
else return False
|
||||||
action
|
action
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ imageTitleBarButtonHandler mainw distFromLeft distFromRight = do
|
|||||||
then focus mainw >> sendMessage (maximizeRestore mainw) >> return True
|
then focus mainw >> sendMessage (maximizeRestore mainw) >> return True
|
||||||
else if (fi distFromRight >= minimizeButtonOffset &&
|
else if (fi distFromRight >= minimizeButtonOffset &&
|
||||||
fi distFromRight <= minimizeButtonOffset + buttonSize)
|
fi distFromRight <= minimizeButtonOffset + buttonSize)
|
||||||
then focus mainw >> sendMessage (MinimizeWin mainw) >> return True
|
then focus mainw >> minimizeWindow mainw >> return True
|
||||||
else return False
|
else return False
|
||||||
action
|
action
|
||||||
|
|
||||||
|
@ -18,7 +18,8 @@ module XMonad.Layout.Minimize (
|
|||||||
-- * Usage
|
-- * Usage
|
||||||
-- $usage
|
-- $usage
|
||||||
minimize,
|
minimize,
|
||||||
MinimizeMsg(..)
|
minimizeWindow,
|
||||||
|
MinimizeMsg(RestoreMinimizedWin,RestoreNextMinimizedWin)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import XMonad
|
import XMonad
|
||||||
@ -47,7 +48,7 @@ import Foreign.C.Types (CLong)
|
|||||||
--
|
--
|
||||||
-- In the key-bindings, do something like:
|
-- In the key-bindings, do something like:
|
||||||
--
|
--
|
||||||
-- > , ((modm, xK_m ), withFocused (\f -> sendMessage (MinimizeWin f)))
|
-- > , ((modm, xK_m ), withFocused minimizeWindow)
|
||||||
-- > , ((modm .|. shiftMask, xK_m ), sendMessage RestoreNextMinimizedWin)
|
-- > , ((modm .|. shiftMask, xK_m ), sendMessage RestoreNextMinimizedWin)
|
||||||
--
|
--
|
||||||
-- The first action will minimize the focused window, while the second one will restore
|
-- The first action will minimize the focused window, while the second one will restore
|
||||||
@ -75,6 +76,8 @@ data MinimizeMsg = MinimizeWin Window
|
|||||||
deriving (Typeable, Eq)
|
deriving (Typeable, Eq)
|
||||||
instance Message MinimizeMsg
|
instance Message MinimizeMsg
|
||||||
|
|
||||||
|
minimizeWindow :: Window -> X ()
|
||||||
|
minimizeWindow w = sendMessage (MinimizeWin w) >> BW.focusDown
|
||||||
|
|
||||||
setMinimizedState :: Window -> Int -> (CLong -> [CLong] -> [CLong]) -> X ()
|
setMinimizedState :: Window -> Int -> (CLong -> [CLong] -> [CLong]) -> X ()
|
||||||
setMinimizedState win st f = do
|
setMinimizedState win st f = do
|
||||||
@ -103,34 +106,34 @@ instance LayoutModifier Minimize Window where
|
|||||||
|
|
||||||
handleMess (Minimize minimized unfloated) m
|
handleMess (Minimize minimized unfloated) m
|
||||||
| Just (MinimizeWin w) <- fromMessage m, not (w `elem` minimized) = do
|
| Just (MinimizeWin w) <- fromMessage m, not (w `elem` minimized) = do
|
||||||
BW.focusDown
|
|
||||||
setMinimized w
|
setMinimized w
|
||||||
ws <- gets windowset
|
ws <- gets windowset
|
||||||
case M.lookup w (W.floating ws) of
|
case M.lookup w (W.floating ws) of
|
||||||
Nothing -> return $ Just $ Minimize (w:minimized) unfloated
|
Nothing -> return $ Just $ Minimize (w:minimized) unfloated
|
||||||
Just r -> do
|
Just r -> do
|
||||||
(windows . W.sink) w
|
modify (\s -> s { windowset = W.sink w ws})
|
||||||
return $ Just $ Minimize (w:minimized) (M.insert w r unfloated)
|
return $ Just $ Minimize (w:minimized) (M.insert w r unfloated)
|
||||||
| Just (RestoreMinimizedWin w) <- fromMessage m = do
|
| Just (RestoreMinimizedWin w) <- fromMessage m = do
|
||||||
setNotMinimized w
|
setNotMinimized w
|
||||||
case M.lookup w unfloated of
|
case M.lookup w unfloated of
|
||||||
Nothing -> return $ Just $ Minimize (minimized \\ [w]) unfloated
|
Nothing -> return $ Just $ Minimize (minimized \\ [w]) unfloated
|
||||||
Just r -> do
|
Just r -> do
|
||||||
(windows . (W.float w)) r
|
ws <- gets windowset
|
||||||
|
modify (\s -> s { windowset = W.float w r ws})
|
||||||
return $ Just $ Minimize (minimized \\ [w]) (M.delete w unfloated)
|
return $ Just $ Minimize (minimized \\ [w]) (M.delete w unfloated)
|
||||||
| Just RestoreNextMinimizedWin <- fromMessage m =
|
| Just RestoreNextMinimizedWin <- fromMessage m = do
|
||||||
|
ws <- gets windowset
|
||||||
if not (null minimized)
|
if not (null minimized)
|
||||||
then case M.lookup (head minimized) unfloated of
|
then case M.lookup (head minimized) unfloated of
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
let w = head minimized
|
let w = head minimized
|
||||||
setNotMinimized w
|
setNotMinimized w
|
||||||
focus w
|
modify (\s -> s { windowset = W.focusWindow w ws})
|
||||||
return $ Just $ Minimize (tail minimized) unfloated
|
return $ Just $ Minimize (tail minimized) unfloated
|
||||||
Just r -> do
|
Just r -> do
|
||||||
let w = head minimized
|
let w = head minimized
|
||||||
setNotMinimized w
|
setNotMinimized w
|
||||||
(windows . (W.float w)) r
|
modify (\s -> s { windowset = (W.focusWindow w . W.float w r) ws})
|
||||||
focus w
|
|
||||||
return $ Just $ Minimize (tail minimized) (M.delete w unfloated)
|
return $ Just $ Minimize (tail minimized) (M.delete w unfloated)
|
||||||
else return Nothing
|
else return Nothing
|
||||||
| Just BW.UpdateBoring <- fromMessage m = do
|
| Just BW.UpdateBoring <- fromMessage m = do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user