[英]How can I modify the windowSet in XMonad?
我有一个看起来像的函数:
sinkFocus :: StackSet i l a s sd -> Maybe (StackSet i l a s sd)
sinkFocus = (fmap . flip sink) <*> peek
但是我想要一个X ()
以便我可以使用它。 例如additionalKeys
使用X ()
。
文档说X
是一个带有一些状态和读取器转换器的IO
,所以我的印象是StackSet
包含在X
的状态中。 所以理论上应该可以修改状态的相关部分。 然而,可访问的状态是XState
而不是我想要的StackState
,所以我需要能够将StackState
上的函数StackState
为XState
上的XState
。
如果我有一个类型的函数,这将很容易
(StackSet i l a s sd -> StackSet i l a s sd) -> X ()
然而,在文档中挖掘之后,我还没有能够拼凑出一种方法来做到这一点。 有没有办法在StackSet
上获取一个函数并创建一个X ()
来执行该函数?
X
monad 有一个MonadState
实例
instance MonadState XState X
所以我们可以使用modify
为
modify :: (XState -> XState) -> X ()
所以我们需要在XState
函数转换为 1。 如果我们看一下定义
XState
windowset :: !WindowSet
mapped :: !(Set Window)
waitingUnmap :: !(Map Window Int)
dragging :: !(Maybe (Position -> Position -> X (), X ()))
numberlockMask :: !KeyMask
extensibleState :: !(Map String (Either String StateExtension))
我们将看到WindowSet
,它是特定StackState
的类型别名。 所以,你可以把从函数StackState
在S成一个XState
就像这样:
overWindowSet :: (WindowSet -> WindowSet) -> XState -> XState
overWindowSet f xState = xState { windowset = f (windowset xState) }
这可以与modify
结合使用以制作您想要的完整功能:
modify . overWindowSet
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.