aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/Layout
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2022-04-11 23:28:18 -0600
committerJosh Rahm <joshuarahm@gmail.com>2022-10-09 12:19:46 -0600
commit76ddb5b75808fe61e6f12bd3d9a54270d9b73886 (patch)
treed20047603fc6448a66b720d456982bd70286791e /src/Rahm/Desktop/Layout
parent106695b521dedb23e314d94ba9a87e7c2e142a37 (diff)
downloadrde-76ddb5b75808fe61e6f12bd3d9a54270d9b73886.tar.gz
rde-76ddb5b75808fe61e6f12bd3d9a54270d9b73886.tar.bz2
rde-76ddb5b75808fe61e6f12bd3d9a54270d9b73886.zip
Fix bug with Poppable where it was passing the Resize to the underlying layout.
Unfortunately it's a little hacky how this ended up working, but I don't have a great solution yet.
Diffstat (limited to 'src/Rahm/Desktop/Layout')
-rw-r--r--src/Rahm/Desktop/Layout/Layout.hs9
-rw-r--r--src/Rahm/Desktop/Layout/LayoutDraw.hs4
-rw-r--r--src/Rahm/Desktop/Layout/Pop.hs61
3 files changed, 48 insertions, 26 deletions
diff --git a/src/Rahm/Desktop/Layout/Layout.hs b/src/Rahm/Desktop/Layout/Layout.hs
index fd34c33..135b9a0 100644
--- a/src/Rahm/Desktop/Layout/Layout.hs
+++ b/src/Rahm/Desktop/Layout/Layout.hs
@@ -88,10 +88,11 @@ reinterpretIncMaster ::
reinterpretIncMaster = ModifiedLayout ReinterpretMessage
mods =
- poppable .
- ModifiedLayout (Flippable False) .
- ModifiedLayout (HFlippable False) .
- ModifiedLayout (Rotateable False)
+ reinterpretResize .
+ poppable .
+ ModifiedLayout (Flippable False) .
+ ModifiedLayout (HFlippable False) .
+ ModifiedLayout (Rotateable False)
data ModifyDescription m l a = ModifyDescription m (l a)
diff --git a/src/Rahm/Desktop/Layout/LayoutDraw.hs b/src/Rahm/Desktop/Layout/LayoutDraw.hs
index 7e59284..99828e3 100644
--- a/src/Rahm/Desktop/Layout/LayoutDraw.hs
+++ b/src/Rahm/Desktop/Layout/LayoutDraw.hs
@@ -11,7 +11,7 @@ import Control.Monad.Writer (execWriter, tell)
import Data.Foldable (find)
import Data.Maybe (fromMaybe)
import Rahm.Desktop.Hash (quickHash)
-import Rahm.Desktop.Layout.Layout (ZoomModifier(..))
+import Rahm.Desktop.Layout.Pop (PopMessage(..))
import System.Directory (createDirectoryIfMissing, doesFileExist)
import System.FilePath ((</>))
import Text.Printf (printf)
@@ -48,7 +48,7 @@ drawLayout = do
-- Gotta reset the layout to a consistent state.
layout' <- foldM (flip ($)) layout [
handleMessage' $ ModifyWindowBorder $ const $ Border 0 0 0 0,
- handleMessage' Unzoom
+ handleMessage' Unpop
]
(cached, xpm) <- drawXpmIO layout'
diff --git a/src/Rahm/Desktop/Layout/Pop.hs b/src/Rahm/Desktop/Layout/Pop.hs
index 194e645..037e664 100644
--- a/src/Rahm/Desktop/Layout/Pop.hs
+++ b/src/Rahm/Desktop/Layout/Pop.hs
@@ -4,13 +4,19 @@
-- frame in the middle of the screen, sort of like fullscreen, but only taking
-- up a percentage of the screen rather than the whole screen so other windows
-- are still visible, alebeit typically not usable.
-module Rahm.Desktop.Layout.Pop (Poppable(..), PopMessage(..), poppable) where
+module Rahm.Desktop.Layout.Pop (
+ Poppable(..),
+ PopMessage(..),
+ poppable,
+ reinterpretResize) where
import XMonad
import XMonad.Layout.LayoutModifier (LayoutModifier(..), ModifiedLayout(..))
import Data.Default (Default(..))
import qualified XMonad.StackSet as W
+import Rahm.Desktop.Layout.ReinterpretMessage
+
data Poppable a = Poppable {
-- True if the current window is popped out or not.
isPopped :: Bool
@@ -29,6 +35,18 @@ instance Default (Poppable a) where
, yFrac = 0.05
}
+-- Returns a modified layout that converts Resize (Shrink/Expand) into ResizePop
+-- messages. Unfortunately this is required because a LayoutModifier has no way
+-- to intercept messages and block them from propegating, which is pretty silly.
+--
+-- So, reinterpretResize will turn a Shrink/Expand into a ResizePop, this will
+-- be consumed by the Poppable layout modifier. If the Poppable LayoutModifier
+-- is not active, it will turn the ResizePop back into a Shrink/Expand and
+-- forward it to the underlying layout.
+reinterpretResize ::
+ l a -> ModifiedLayout (ReinterpretMessage "ForPop") l a
+reinterpretResize = ModifiedLayout ReinterpretMessage
+
poppable :: l a -> ModifiedLayout Poppable l a
poppable = ModifiedLayout def
@@ -36,6 +54,15 @@ poppable = ModifiedLayout def
data PopMessage = TogglePop | Pop | Unpop | ResizePop Float
deriving (Typeable, Show, Eq, Ord, Message)
+instance DoReinterpret "ForPop" where
+ reinterpretMessage _ (fromMessage -> Just mess) =
+ return $ Just $ SomeMessage $
+ case mess of
+ Shrink -> ResizePop (-0.05)
+ Expand -> ResizePop 0.05
+
+ reinterpretMessage _ _ = return Nothing
+
instance (Eq a) => LayoutModifier Poppable a where
-- If the current layout is not popped, then just return what the underlying
@@ -59,25 +86,19 @@ instance (Eq a) => LayoutModifier Poppable a where
(h - fromIntegral (hp * 2))
-- Handle the Pop messages associated with this layout.
- pureMess self (fromMessage -> Just mess) =
- Just $ case mess of
- TogglePop -> self { isPopped = not (isPopped self) }
- Pop -> self { isPopped = True }
- Unpop -> self { isPopped = False }
- ResizePop amt -> self {
- xFrac = guard (xFrac self + amt),
- yFrac = guard (yFrac self + amt)
- }
+ handleMessOrMaybeModifyIt self (fromMessage -> Just mess) =
+ return $ Just $ case mess of
+ TogglePop -> Left $ self { isPopped = not (isPopped self) }
+ Pop -> Left $ self { isPopped = True }
+ Unpop -> Left $ self { isPopped = False }
+ ResizePop amt | isPopped self ->
+ Left $ self {
+ xFrac = guard (xFrac self + amt),
+ yFrac = guard (yFrac self + amt)
+ }
+ ResizePop amt -> Right $ SomeMessage $
+ if amt > 0 then Expand else Shrink
where
guard = min 0.45 . max 0
- -- Handle Shrink and Expand if it is currently in the popped state.
- pureMess
- self@Poppable { isPopped = True }
- (fromMessage -> Just mess) =
- pureMess self $ SomeMessage $
- case mess of
- Shrink -> ResizePop (-0.05)
- Expand -> ResizePop 0.05
-
- pureMess _ _ = Nothing
+ handleMessOrMaybeModifyIt _ _ = return Nothing