繁体   English   中英

如何修改 XMonad 中的 windowSet?

[英]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上的函数StackStateXState上的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM