如何在 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) }
我想实现由自定义布局处理的自定义消息。
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) }