aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/Layout/Rotate.hs
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2022-04-12 00:38:26 -0600
committerJosh Rahm <joshuarahm@gmail.com>2022-10-09 12:19:46 -0600
commitbc1f9daeac09beb20a2c587d259048aea3b03176 (patch)
tree3e7bda9a3859ed7abb1d36109fbeb59088150a4a /src/Rahm/Desktop/Layout/Rotate.hs
parent9d4e7ae016180769eb050f4c2729475236f4ad34 (diff)
downloadrde-bc1f9daeac09beb20a2c587d259048aea3b03176.tar.gz
rde-bc1f9daeac09beb20a2c587d259048aea3b03176.tar.bz2
rde-bc1f9daeac09beb20a2c587d259048aea3b03176.zip
Break Rotate into it's own file.
Diffstat (limited to 'src/Rahm/Desktop/Layout/Rotate.hs')
-rw-r--r--src/Rahm/Desktop/Layout/Rotate.hs62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/Rahm/Desktop/Layout/Rotate.hs b/src/Rahm/Desktop/Layout/Rotate.hs
new file mode 100644
index 0000000..8a8583a
--- /dev/null
+++ b/src/Rahm/Desktop/Layout/Rotate.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+-- Layout modifier which optionally rotates the underlying layout. This actually
+-- uses the mirrorRect, so it's not strictly rotating, but when combined with
+-- flipping it works.
+module Rahm.Desktop.Layout.Rotate (
+ rotateable,
+ rotateLayout,
+ Rotate) where
+
+import XMonad
+import XMonad.Layout.LayoutModifier
+import Data.Default (Default(..))
+import Control.Arrow (second)
+
+-- Just a wrapper over a Bool.
+newtype Rotate a = Rotate Bool
+ deriving (Read, Show, Eq, Ord)
+
+-- Returns a layout that can be rotated.
+rotateable :: l a -> ModifiedLayout Rotate l a
+rotateable = ModifiedLayout def
+
+-- Message to rotate the layout.
+rotateLayout :: RotateMessage
+rotateLayout = RotateMessage $ \(Rotate n) -> Rotate (not n)
+
+-- Default instance just defaults to false..
+instance Default (Rotate a) where
+ def = Rotate False
+
+-- Rotate message is a wrapper over a function to modify a Rotate instance.
+data RotateMessage where
+ RotateMessage :: (forall k (a :: k). Rotate a -> Rotate a) -> RotateMessage
+ deriving (Message)
+
+instance (Eq a) => LayoutModifier Rotate a where
+ pureModifier (Rotate rotate) (Rectangle x' y' sw sh) _ returned =
+ if rotate
+ then (map (second (unzero . scaleRect . mirrorRect . zero)) returned, Nothing)
+ else (returned, Nothing)
+ where
+ zero (Rectangle x y w h) = Rectangle (x - x') (y - y') w h
+ unzero (Rectangle x y w h) = Rectangle (x + x') (y + y') w h
+
+ scaleRect (Rectangle x y w h) =
+ Rectangle (x * fi sw `div` fi sh)
+ (y * fi sh `div` fi sw)
+ (w * sw `div` sh)
+ (h * sh `div` sw)
+
+ fi = fromIntegral
+
+
+ pureMess r (fromMessage -> Just (RotateMessage f)) = Just (f r)
+ pureMess _ _ = Nothing
+
+ modifyDescription (Rotate rot) underlying =
+ let descr = description underlying in
+ if rot
+ then descr ++ " Rotated"
+ else descr