RFC: Handling fullscreen with layouts

As mentioned in another mail, I'm currently experimenting with handling fullscreening applications in the layout itself, using layout messages. I'll highlight the approach here. First, we'll need a new layout message: data FullscreenMessage = AddFullscreen Window | RemoveFullscreen Window deriving (Typeable) instance Message FullscreenMessage This message will be sent to all layouts when a window requests fullscreen through the _NET_WM_STATE protocol, using a special event hook (resembling the fullscreenEventHook in X.H.EwmhDesktops, but sending messages instead of modifying the window). Also, we'll need a manage hook that sends an AddFullscreen on the window if it starts out with the fullscreen property. Now we can write a simple layout modifier to make the modified layout respect fullscreen: data FullscreenFull a = FullscreenFull [a] deriving (Read, Show) instance LayoutModifier FullscreenFull Window where -- This handler maintains the modifier's list of fullscreen windows pureMess (FullscreenFull fulls) m = case fromMessage m of Just (AddFullscreen win) -> Just $ FullscreenFull $ nub $ win:fulls Just (RemoveFullscreen win) -> Just $ FullscreenFull $ delete win $ fulls Nothing -> Nothing -- All the fullscreened windows should fill the screen, the rest of the windows are left in place pureModifier (FullscreenFull fulls) rect _ list = (zip visfulls (repeat rect) ++ rest, Nothing) where visfulls = intersect fulls $ map fst list rest = [(w,r) | (w,r) <- list, w `notElem` fulls] The advantage of this approach is made clearer by a small variant of the above modifier that only fullscreens the window if it is focused: data FullscreenFocus a = FullscreenFocus [a] deriving (Read, Show) instance LayoutModifier FullscreenFocus Window where -- pureMess like above -- The focused window should fill the screen pureModifier (FullscreenFocus fulls) rect (Just (W.Stack {W.focus = f})) list = (if f `elem` fulls then (f,rect):rest else list, Nothing) where rest = [(w,r) | (w,r) <- list, w /= f] pureModifier _ _ Nothing list = (list, Nothing) You can even toggle between such variants using something like X.L.MultiToggle. There are a few disadvantages to this approach: * Complexity - this is a lot more code than a simple event hook * More configuration - you need to add a manage hook and a layout modifier in addition to the event hook to use this * Floating windows are difficult to handle. I have tried to hack together a layout modifier that would call the X monad in order to fullscreen floating windows, but even if it works it's going to be ugly * Youtube fullscreen won't work with this, unless you add another manage hook like this: className =? "Npviewer.bin" --> doFullFloat I've attached the module I'm currently keeping in my .xmonad/lib directory, implementing all of this. Does anyone have any thoughts about it? -- Audun Skaugen
participants (1)
-
Gmail