
On 03/05/2017 03:08 PM, Tuncer Ayaz wrote:
My patches are for fixing mupdf-gl (the GLFW created OpenGL viewer).
desktopConfig, which is what I use in my extended version of example-config.hs, has basic EWMH enabled. Nonetheless, I've added handleEventHook with EwmhDesktops.fullscreenEventHook, but it didn't make a difference.
I think you tried the x11 viewer and not glfw. Test mupdf-gl instead.
Ah, yes, i've tried `mupdf-x11`. But now, i think, i found the reason why fullscreen doesn't work: as Brandon Allbery noted, the problem is in advertising EWMH. It turns out, two atoms are missed in `_NET_SUPPORTED`: `_NET_WM_STATE` and `_NET_WM_STATE_FULLSCREEN`. Without them glfw goes with "override redirect" way and fullscreen does not work properly. Here is the relevant code from `glfw/src/x11_window.c`: static void updateWindowMode(_GLFWwindow* window) { if (window->monitor) { if (_glfw.x11.xinerama.available && _glfw.x11.NET_WM_FULLSCREEN_MONITORS) { sendEventToWM(window, _glfw.x11.NET_WM_FULLSCREEN_MONITORS, window->monitor->x11.index, window->monitor->x11.index, window->monitor->x11.index, window->monitor->x11.index, 0); } if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN) { sendEventToWM(window, _glfw.x11.NET_WM_STATE, _NET_WM_STATE_ADD, _glfw.x11.NET_WM_STATE_FULLSCREEN, 0, 1, 0); } else { // This is the butcher's way of removing window decorations // Setting the override-redirect attribute on a window makes the // window manager ignore the window completely (ICCCM, section 4) // The good thing is that this makes undecorated full screen windows // easy to do; the bad thing is that we have to do everything // manually and some things (like iconify/restore) won't work at // all, as those are tasks usually performed by the window manager XSetWindowAttributes attributes; attributes.override_redirect = True; XChangeWindowAttributes(_glfw.x11.display, window->x11.handle, CWOverrideRedirect, &attributes); window->x11.overrideRedirect = GLFW_TRUE; } The right way is when (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN) == True. So, apart from regular `XMonad.Hooks.EwmhDesktops` i need to advertise two more atoms in `_NET_SUPPORTED`. Here is xmonad config working for me: import Data.Maybe import Control.Monad import XMonad import XMonad.Hooks.EwmhDesktops addNETSupported :: Atom -> X () addNETSupported x = withDisplay $ \dpy -> do r <- asks theRoot a_NET_SUPPORTED <- getAtom "_NET_SUPPORTED" a <- getAtom "ATOM" liftIO $ do sup <- (join . maybeToList) <$> getWindowProperty32 dpy a_NET_SUPPORTED r when (fromIntegral x `notElem` sup) $ changeProperty32 dpy r a_NET_SUPPORTED a propModeAppend [fromIntegral x] addEWMHFullscreen :: X () addEWMHFullscreen = do wms <- getAtom "_NET_WM_STATE" wfs <- getAtom "_NET_WM_STATE_FULLSCREEN" mapM_ addNETSupported [wms, wfs] main :: IO () main = xmonad . ewmh $ def { modMask = mod4Mask , handleEventHook = fullscreenEventHook <+> handleEventHook def , startupHook = startupHook def >> addEWMHFullscreen }