<div dir="ltr">For what it's worth, you normally get the XConf via `ask` (Control.Monad.Reader) instead of passing it around. The primary exception is in ManageHooks, which have a different Reader on top and you must use `liftX` first to get at the other one.<div><br></div><div>Your own actions would not normally be part of the XConf or XConfig, but a separate type which you would pass around. Compare something like XMonad.Prompt and its `XPConfig` type.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Apr 3, 2020 at 10:46 AM Michal J. <<a href="mailto:wlst-xmonad@zruze.cz">wlst-xmonad@zruze.cz</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello friendly folks,<br>
<br>
I'm a relative newb to both xmonad and Haskell, and for a while I<br>
wrestled with a seemingly simple task -- to make XMonad.Actions.WindowMenu<br>
(from xmonad-contrib) configurable.<br>
<br>
Essentially I wanted to go from:<br>
<br>
windowMenu :: X ()<br>
windowMenu = ...<br>
<br>
to:<br>
<br>
windowMenu :: ??? -> X ()<br>
windowMenu actions = ...<br>
<br>
so I can customize the actions that pop up. So I can bind different menus<br>
to different key combos.<br>
<br>
Now, I documented some of my struggles at Stack Overflow:<br>
<a href="https://stackoverflow.com/q/61001342/1177128" rel="noreferrer" target="_blank">https://stackoverflow.com/q/61001342/1177128</a><br>
and eventually came up with a solution (with help from others!):<br>
<a href="https://stackoverflow.com/a/61013887/1177128" rel="noreferrer" target="_blank">https://stackoverflow.com/a/61013887/1177128</a><br>
<br>
But given that grepping the xmonad and xmonad-contrib sources for<br>
":: XConf ->" returns exactly 1 result (spoiler: `runX` in `Core.hs`), I'm<br>
pretty sure I'm holding it wrong:<br>
<br>
```haskell<br>
defaultActions :: XConf -> [(String, X ())]<br>
defaultActions = do<br>
    tags <- asks (workspaces . config)<br>
    return ([ ("Cancel menu", return ())<br>
            , ("Close"      , kill)<br>
            , ("Maximize"   , withFocused $ \w -> sendMessage $ maximizeRestore w)<br>
            , ("Minimize"   , withFocused $ \w -> minimizeWindow w)<br>
            ] ++<br>
            [ ("Move to " ++ tag, windows $ W.shift tag) | tag <- tags ])<br>
<br>
windowMenu' :: (XConf -> [(String, X ())]) -> X ()<br>
windowMenu' actions = withFocused $ \w -> do<br>
    acts <- asks actions<br>
    Rectangle x y wh ht <- getSize w<br>
    Rectangle sx sy swh sht <- gets $ screenRect . W.screenDetail . W.current . windowset<br>
    let originFractX = (fi x - fi sx + fi wh / 2) / fi swh<br>
        originFractY = (fi y - fi sy + fi ht / 2) / fi sht<br>
        gsConfig = (buildDefaultGSConfig colorizer)<br>
                    { gs_originFractX = originFractX<br>
                    , gs_originFractY = originFractY }<br>
    runSelectedAction gsConfig acts<br>
<br>
-- now it composes well, and I can pass in my own `actions` to `windowMenu`<br>
windowMenu = windowMenu' defaultActions<br>
```<br>
<br>
Can anyone well versed in the idiosyncrasies of Haskell and XMonad please<br>
point out what would be the proper -- nay, canonical -- solution if it were<br>
done by someone who actually knows what they're doing?<br>
<br>
It'd be greatly appreciated. :-)<br>
<br>
Cheers,<br>
<br>
Michal<br>
<br>
PS: If the refactor seems like I really have no clue what's going on...<br>
    well... I don't. And if you have a pointer to some text I should<br>
        read to understand all this better, I'm all ears.<br>
_______________________________________________<br>
xmonad mailing list<br>
<a href="mailto:xmonad@haskell.org" target="_blank">xmonad@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>brandon s allbery kf8nh</div><div><a href="mailto:allbery.b@gmail.com" target="_blank">allbery.b@gmail.com</a></div></div></div></div></div>