如何在 Xmonad 中创建和处理自定义消息?

How to create and handle custom messages in Xmonad?

我想实现由自定义布局处理的自定义消息。

data ModifySideContainer = IncrementLeftColumnContainer | IncrementRightColumnContainer deriving Typeable
instance Message ModifySideContainer

我不太确定如何在 pureMessage(https://hackage.haskell.org/package/xmonad-0.13/docs/XMonad-Core.html#v:pureMessage)

中处理自定义消息

这是我当前的 pureMessage 实现(在自定义布局中):

  pureMessage l@(MiddleColumn sr mcc deltaInc _) m = msum [
    fmap resize     (fromMessage m),
    fmap incmastern (fromMessage m)
    ]
    where
      resize Expand = l {splitRatio = (min 0.5 $ sr + deltaInc)}
      resize Shrink = l {splitRatio = (max 0 $ sr - deltaInc)}
      incmastern (IncMasterN x) = l { middleColumnCount = max 0 (mcc+x) }

我不太明白这个逻辑是如何工作的(我从某处复制的),msum在这里做什么?我想一旦找到 mplus for Maybe 的实例声明,我就会知道了。

想通了。您只需要在列表中添加额外的 'layouts'。

基本上 msum 所做的就是获取第一个 Just 值和 return 例如: msum [Nothing, Nothing, Just 1, Just 2, Nothing] 将 return Just 1.

  pureMessage l@(MiddleColumn sRatio mcc deltaInc _ leftCount rightCount) m = msum [
    fmap resize     (fromMessage m),
    fmap incmastern (fromMessage m),
    fmap incSideContainer (fromMessage m)
    ]
    where
      incSideContainer IncrementLeftColumnContainer = l
        { leftContainerCount = leftCount + 1, rightContainerCount = rightCount - 1}
      incSideContainer IncrementRightColumnContainer = l
        { leftContainerCount = leftCount - 1, rightContainerCount = rightCount + 1}
      resize Expand = l {splitRatio = (min 0.5 $ sRatio + deltaInc)}
      resize Shrink = l {splitRatio = (max 0 $ sRatio - deltaInc)}
      incmastern (IncMasterN x) = l { middleColumnCount = max 0 (mcc+x) }