diff options
Diffstat (limited to 'src/Rahm/Desktop/Dragging.hs')
| -rw-r--r-- | src/Rahm/Desktop/Dragging.hs | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/Rahm/Desktop/Dragging.hs b/src/Rahm/Desktop/Dragging.hs index 5252390..853cf43 100644 --- a/src/Rahm/Desktop/Dragging.hs +++ b/src/Rahm/Desktop/Dragging.hs @@ -5,8 +5,9 @@ import Control.Monad.Trans (lift) import Control.Monad.Trans.Maybe (MaybeT (MaybeT)) import Data.IORef (newIORef, readIORef, writeIORef) import Data.Maybe (fromMaybe) -import Rahm.Desktop.Common (runMaybeT_, setBorderColor, pointerWindow, pointerLocation) +import Rahm.Desktop.Common (pointerLocation, pointerWindow, runMaybeT_, setBorderColor) import Rahm.Desktop.Layout.Hole (addHoleForWindow, removeHoleForWindow, resetHole) +import Rahm.Desktop.Layout.PinWindow (isWindowPinned, pinWindow, unpinWindow) import Rahm.Desktop.Logger import Rahm.Desktop.Marking (setAlternateWindows) import qualified Rahm.Desktop.StackSet as W @@ -80,6 +81,26 @@ ifReleased but (AfterDragAction act) = AfterDragAction $ \win b -> do ifReleased' :: X.Button -> (X.Window -> X.Button -> X ()) -> AfterDragAction ifReleased' but act = ifReleased but (AfterDragAction act) +mouseResizeWindowAndThen :: (X.Window -> X ()) -> + AfterDragAction -> X.Window -> X () +mouseResizeWindowAndThen beforeAction (AfterDragAction releaseAction) window = do + beforeAction window + windowPinned <- isWindowPinned window + unpinWindow window + tilePosition <- X.withWindowSet $ return . W.windowTilePosition window + mapM_ (X.broadcastMessage . flip addHoleForWindow window) tilePosition + + X.mouseResizeWindow window + + afterDrag $ do + X.broadcastMessage $ removeHoleForWindow window + curev <- X.asks X.currentEvent + when windowPinned $ + pinWindow window + releaseAction window (maybe 0 X.ev_button curev) + X.refresh + + mouseMoveWindowAndThen :: (X.Window -> X ()) -> AfterDragAction -> @@ -87,6 +108,8 @@ mouseMoveWindowAndThen :: X () mouseMoveWindowAndThen beforeAction (AfterDragAction releaseAction) window = do beforeAction window + windowPinned <- isWindowPinned window + unpinWindow window tilePosition <- X.withWindowSet $ return . W.windowTilePosition window mapM_ (X.broadcastMessage . flip addHoleForWindow window) tilePosition X.mouseMoveWindow window @@ -94,6 +117,8 @@ mouseMoveWindowAndThen beforeAction (AfterDragAction releaseAction) window = do afterDrag $ do X.broadcastMessage $ removeHoleForWindow window curev <- X.asks X.currentEvent + when windowPinned $ + pinWindow window releaseAction window (maybe 0 X.ev_button curev) X.refresh |