haskell - 是否可以切换 XMonad.Hooks.EwmhDesktops.fullscreenEventHook?
问题描述
我使用 Xmonad 作为窗口管理器。为了自动处理全屏窗口,我使用 XMonad.Hooks.EwmhDesktops.fullscreenEventHook。并将其放入我的配置中:
, handleEventHook = handleEventHook def <+> docksEventHook <+> XMonad.Hooks.EwmhDesktops.fullscreenEventHook
我希望能够通过键绑定来切换它。因此,默认情况下,全屏窗口占据整个屏幕,但是当我关闭 EwmhDesktops.fullscreenEventHook 时,它只是在“平铺”空间中的全屏窗口占据。
完整配置在这里
解决方案
向 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
提升IO
为X
monad。现在,在我们的 main 函数中,我们要构造IORef
with newIORef
:
main = do
fullscreenRef <- newIORef True -- default to being on
-- rest of main goes here
现在,我们还将编辑handleEventHook
main 行以使用我们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),它使用以下命令切换 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 切换全屏事件挂钩。
推荐阅读
- sql - 如何根据我的选择语句中的其他 3 列创建新列
- angularjs - 将服务的值保存在变量中
- mysql - 无法使用联合引擎 mysql 在 ipv6 上连接远程服务器
- apache - 在 > 1024 的端口上运行 apache 容器
- android-recyclerview - 拖放后如何将项目位置存储在 RecyclerView 中
- python - python中一个大列表的总和
- python - 查询关于时区的一天
- sql-server - 将 Microsoft SQL Server 中的文件表链接到 Microsoft Access 2016 中的表
- node.js - Elasticsearch nodejs检查队列是否已满
- html - 具有多个 colspan 的两个表头