Virtual desktop underlay for Wayland and X11
git clone https://github.com/m-col/xanadu
Files | Refs | Readme | License

Commit aa402ea45d3c7c7b8488568aa1f9a3d7d9615f69
Parent: 4922c6351ff54e1b6ac87da32521d7405a3017dd
Author: mcol <mcol@posteo.net>
Date: 2021-11-02 16:36:47 +0000
Committer: mcol <mcol@posteo.net>
Committed: 2021-11-02 16:36:47 +0000

Implement wlr-layer-surface protocol

src/Window.hs Modified

@@ -1,4 +1,3 @@
-{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedLabels #-}
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -8,12 +7,12 @@
 
 import Control.Monad.IO.Class (liftIO)
 import Control.Monad.Trans.Maybe
-import GHC.Int (Int32)
 
 import Data.GI.Base
 import qualified GI.Gdk as Gdk
 import qualified GI.Gdk.Enums as Enums
 import qualified GI.Gtk as Gtk
+import qualified GI.GtkLayerShell as LS
 
 initWindow :: Gtk.Application -> IO Gtk.ApplicationWindow
 initWindow app = do
@@ -23,23 +22,30 @@
         , #resizable := False
         ]
 
-    geometry <- runMaybeT getGeometry
-    case geometry of
-        Nothing -> error "Could not open display."
-        Just (width, height) -> Gtk.windowSetDefaultSize win width height
-
+    initWayland win
+    runMaybeT $ initX11 win
     addCSS win
-    Gtk.windowSetTypeHint win Enums.WindowTypeHintDesktop
     return win
 
-getGeometry :: MaybeT IO (Int32, Int32)
-getGeometry = do
+initWayland :: Gtk.ApplicationWindow -> IO ()
+initWayland win = do
+    LS.initForWindow win
+    LS.setLayer win LS.LayerBackground
+    LS.setKeyboardMode win LS.KeyboardModeOnDemand
+    LS.setAnchor win LS.EdgeTop True
+    LS.setAnchor win LS.EdgeBottom True
+    LS.setAnchor win LS.EdgeLeft True
+    LS.setAnchor win LS.EdgeRight True
+
+initX11 :: Gtk.ApplicationWindow -> MaybeT IO ()
+initX11 win = do
+    Gtk.windowSetTypeHint win Enums.WindowTypeHintDesktop
     display <- MaybeT Gdk.displayGetDefault
     monitor <- MaybeT $ Gdk.displayGetMonitor display 0
     rect <- liftIO $ Gdk.monitorGetGeometry monitor
     width <- Gdk.getRectangleWidth rect
     height <- Gdk.getRectangleHeight rect
-    return (width, height)
+    Gtk.windowSetDefaultSize win width height
 
 addCSS :: Gtk.ApplicationWindow -> IO ()
 addCSS win = do