是否可以切换 XMonad.Hooks.EwmhDesktops.fullscreenEventHook?

Is it possible to toggle XMonad.Hooks.EwmhDesktops.fullscreenEventHook?

我正在使用 Xmonad 作为 window 管理器。要自动处理全屏 window,我使用 XMonad.Hooks.EwmhDesktops.fullscreenEventHook。并将其放入我的配置中:

        , handleEventHook = handleEventHook def <+> docksEventHook <+> XMonad.Hooks.EwmhDesktops.fullscreenEventHook 

我希望能够通过键绑定来切换它。所以默认情况下,全屏 window 占据了整个屏幕,但是当我关闭 EwmhDesktops.fullscreenEventHook 时,它仅在“平铺”space 中全屏显示,window 占据。

完整配置为 here

很难将状态添加到 XMonad 本身,因此我们必须使用 IORef 来添加外部状态。首先,我们将制作一个全屏事件挂钩,它检查来自 IORef 的布尔值,并且仅在为真时运行实际的事件挂钩:

toggleableFullscreen :: IORef Bool -> Event -> X All
toggleableFullscreen ref evt =
    io (readIORef ref) >>= \isOn ->
        if isOn
            then XMonad.Hooks.EwmhDesktops.fullscreenEventHook evt
            else return (All True)

这使用 io :: IO a -> X a to lift an IO monad into an X monad. Now, in our main function, we want to construct the IORef with newIORef:

main = do
    fullscreenRef <- newIORef True -- default to being on
    -- rest of main goes here

现在,我们还将编辑 main 的 handleEventHook 行以使用我们的 toggleableFullscreen 和传入的 fullscreenRef

, handleEventHook = handleEventHook def <+> docksEventHook <+> toggleableFullscreen fullscreenRef

那么,事件挂钩部分就完成了。现在我们需要一种方法来切换它。 myKeys 函数也需要将 fullscreenRef 作为参数,所以你必须添加它:

myKeys fullscreenRef conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
    -- rest of myKeys

(这是您配置的第 125 行)

然后,您必须添加一个新的键绑定(比如 mod+shift+f),使用 modifyIORef:

切换 IORef
, ((modm .|. shiftMask, xK_f), io (modifyIORef fullscreenRef not))

然后,在您的主函数中,将 fullscreenRef 传递给 myKeys:

, keys = myKeys fullscreenRef

(第 400 行)

并删除整个块,因为您不使用它(并且它不会进行类型检查):

defaults = def {
      -- simple stuff
        terminal           = myTerminal,
        focusFollowsMouse  = myFocusFollowsMouse,
        clickJustFocuses   = myClickJustFocuses,
        borderWidth        = myBorderWidth,
        modMask            = myModMask,
        workspaces         = myWorkspaces,
        normalBorderColor  = myNormalBorderColor,
        focusedBorderColor = myFocusedBorderColor,

      -- key bindings
        keys               = myKeys,
        mouseBindings      = myMouseBindings,

      -- hooks, layouts
        layoutHook         = myLayout,
        manageHook         = myManageHook,
        handleEventHook    = myEventHook,
        logHook            = myLogHook,
        startupHook        = myStartupHook
    }

(第 446-467 行)

然后,重新启动 xmonad,您应该可以使用 mod+shift+f 切换全屏事件挂钩。