首页 > 解决方案 > 是否可以切换 XMonad.Hooks.EwmhDesktops.fullscreenEventHook?

问题描述

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

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

我希望能够通过键绑定来切换它。因此,默认情况下,全屏窗口占据整个屏幕,但是当我关闭 EwmhDesktops.fullscreenEventHook 时,它只是在“平铺”空间中的全屏窗口占据。

完整配置在这里

标签: haskellxmonad

解决方案


向 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)

这用于将 monadio :: IO a -> X a提升IOXmonad。现在,在我们的 main 函数中,我们要构造IORefwith newIORef

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

现在,我们还将编辑handleEventHookmain 行以使用我们toggleableFullscreenfullscreenRef传入:

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

至此,事件钩子部分就完成了。现在我们需要一种方法来切换它。该myKeys函数还需要fullscreenRef作为参数接收,因此您必须将其添加到:

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

(这是您配置的第 125 行)

然后,您必须添加一个新的键绑定(比如说 mod+shift+f),它使用以下命令切换 IORef modifyIORef

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

然后,在您的 main 函数中,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 切换全屏事件挂钩。


推荐阅读