aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/Layout.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.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.hs')
-rw-r--r--src/Rahm/Desktop/Layout.hs103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/Rahm/Desktop/Layout.hs b/src/Rahm/Desktop/Layout.hs
new file mode 100644
index 0000000..6c9ac5a
--- /dev/null
+++ b/src/Rahm/Desktop/Layout.hs
@@ -0,0 +1,103 @@
+module Rahm.Desktop.Layout where
+
+import GHC.TypeLits
+
+import Data.Proxy (Proxy(..))
+import Control.Arrow (second)
+import XMonad.Hooks.ManageDocks
+import XMonad.Layout.Circle
+import XMonad.Layout.Accordion
+import Control.Applicative
+import XMonad.Layout.Spacing
+import Data.List
+import Data.Typeable (cast)
+import XMonad.Layout.Spiral
+import XMonad.Layout.ThreeColumns
+import XMonad.Layout.Grid
+import XMonad.Layout.Dishes
+import XMonad.Layout.MosaicAlt
+import XMonad.Layout.Fullscreen
+import qualified XMonad.Layout.Dwindle as D
+import XMonad.Layout
+import XMonad.Layout.LayoutModifier
+import XMonad
+import XMonad.Core
+import XMonad.Layout.NoBorders (smartBorders, noBorders)
+
+import Rahm.Desktop.Layout.CornerLayout (Corner(..))
+import Rahm.Desktop.Layout.LayoutList
+import Rahm.Desktop.Windows
+import Rahm.Desktop.Layout.ReinterpretMessage
+import Rahm.Desktop.Layout.Pop
+import Rahm.Desktop.Layout.Flip
+import Rahm.Desktop.Layout.Rotate
+import Rahm.Desktop.Layout.Redescribe
+
+import qualified Data.Map as M
+import qualified XMonad.StackSet as W
+
+mods = reinterpretResize . poppable . flippable . rotateable
+
+myLayout =
+ fullscreenFull $
+ avoidStruts $
+ spacingRaw True (Border 5 5 5 5) True (Border 5 5 5 5) True $
+ layoutZipper $
+ mods (reinterpretIncMaster $ spiral (6/7)) |:
+ mods (modifyMosaic (MosaicAlt M.empty :: MosaicAlt Window)) |:
+ mods (reinterpretIncMaster $ Corner (3/4) (3/100)) |:
+ mods (Redescribe UsingTall (Tall 1 (3/100) (1/2))) |:
+ mods (Redescribe UsingThreeCol (ThreeCol 1 (3/100) (1/2))) |:
+ mods Grid |:
+ mods (Dishes 2 (1/6)) |:
+ mods (reinterpretIncMaster $ D.Dwindle D.R D.CW 1.5 1.1) |:
+ nil
+
+-- Mosaic doesn't have the concept of a "Master Space", so reinterpret messages
+-- intended to modify the master space and instead have those messages expand
+-- and shrink the current window.
+--
+-- "ForMosaic" is an instance of the Symbol kind. This is some neat type-system
+-- hacking one can do in Haskell.
+instance DoReinterpret "ForMosaic" where
+
+ -- IncMaster message
+ reinterpretMessage _ (fromMessage -> Just (IncMasterN n)) = do
+ fmap (SomeMessage .
+ (if n > 0
+ then expandWindowAlt
+ else shrinkWindowAlt)) <$> getFocusedWindow
+
+ -- ResizeMaster message
+ reinterpretMessage _ (fromMessage -> Just m) = do
+ fmap (SomeMessage .
+ (case m of
+ Expand -> expandWindowAlt
+ Shrink -> shrinkWindowAlt)) <$> getFocusedWindow
+
+ -- Messages that don't match the above, just leave it unmodified.
+ reinterpretMessage _ m = return (Just m)
+
+instance DoReinterpret "IncMasterToResizeMaster" where
+ reinterpretMessage _ (fromMessage -> Just (IncMasterN n)) =
+ return $ Just $
+ if n > 0
+ then SomeMessage Expand
+ else SomeMessage Shrink
+ reinterpretMessage _ m = return (Just m)
+
+modifyMosaic :: l a -> ModifiedLayout (ReinterpretMessage "ForMosaic") l a
+modifyMosaic = ModifiedLayout ReinterpretMessage
+
+reinterpretIncMaster ::
+ l a -> ModifiedLayout (ReinterpretMessage "IncMasterToResizeMaster") l a
+reinterpretIncMaster = ModifiedLayout ReinterpretMessage
+
+data UsingTall = UsingTall deriving (Read, Show)
+instance Describer UsingTall Tall where
+ newDescription _ (Tall mast _ _) _ = "Tall(" ++ show mast ++ ")"
+
+data UsingThreeCol = UsingThreeCol deriving (Read, Show)
+instance Describer UsingThreeCol ThreeCol where
+ newDescription _ (ThreeCol mast _ _) _ = "ThreeCol(" ++ show mast ++ ")"
+ newDescription _ (ThreeColMid mast _ _) _ = "ThreeColMid(" ++ show mast ++ ")"