aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/Layout/Redescribe.hs
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2022-04-12 01:05:48 -0600
committerJosh Rahm <joshuarahm@gmail.com>2022-10-09 12:19:46 -0600
commit7481428cc081a6e330d35ad01637addcb93c06c7 (patch)
tree8eacfed9c4f9b0eaecfa6bfd9ac428c7e08cc07d /src/Rahm/Desktop/Layout/Redescribe.hs
parentbb05b03906a60b1a4a87a454b750a698cda913e3 (diff)
downloadrde-7481428cc081a6e330d35ad01637addcb93c06c7.tar.gz
rde-7481428cc081a6e330d35ad01637addcb93c06c7.tar.bz2
rde-7481428cc081a6e330d35ad01637addcb93c06c7.zip
Move Rahm.Desktop.Layout.Layout to Rahm.Desktop.Layout
Diffstat (limited to 'src/Rahm/Desktop/Layout/Redescribe.hs')
-rw-r--r--src/Rahm/Desktop/Layout/Redescribe.hs35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/Rahm/Desktop/Layout/Redescribe.hs b/src/Rahm/Desktop/Layout/Redescribe.hs
new file mode 100644
index 0000000..c5c7472
--- /dev/null
+++ b/src/Rahm/Desktop/Layout/Redescribe.hs
@@ -0,0 +1,35 @@
+
+-- Module to enable redescribing layouts. Unlike LayoutModifiers though, this
+-- class is aware of the underlying type as it may need to access some internals
+-- to generate the new description.
+module Rahm.Desktop.Layout.Redescribe where
+
+import XMonad
+
+import qualified XMonad.StackSet as W
+import Data.Typeable (Typeable)
+
+-- Type-class to modify the description of a layout.
+class Describer m l where
+
+ -- Returns the new description from the given description modifier, the layout
+ -- and the existing description.
+ newDescription :: m -> l a -> String -> String
+
+-- With a DescriptionModifier,
+data Redescribe m l a = Redescribe m (l a)
+ deriving (Show, Read)
+
+-- Delegates to the underlying Layout, except for the description
+instance (Typeable m, Show m, Describer m l, LayoutClass l a) =>
+ LayoutClass (Redescribe m l) a where
+
+ runLayout (W.Workspace t (Redescribe m l) a) rect = do
+ (rects, maybeNewLayout) <- runLayout (W.Workspace t l a) rect
+ return (rects, fmap (Redescribe m) maybeNewLayout)
+
+ handleMessage (Redescribe m l) a = do
+ maybeNewLayout <- handleMessage l a
+ return (Redescribe m <$> maybeNewLayout)
+
+ description (Redescribe m l) = newDescription m l (description l)