是否可以切换 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 切换全屏事件挂钩。
我正在使用 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
:
, ((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 切换全屏事件挂钩。