[Xmonad] darcs patch: ManageHook list interface (and 1 more)

David Roundy droundy at darcs.net
Thu Oct 11 21:09:12 EDT 2007


On Fri, Oct 12, 2007 at 01:06:22AM +0200, mail at joachim-breitner.de wrote:
> Sat Oct  6 18:03:24 CEST 2007  mail at joachim-breitner.de
>   * ManageHook list interface
>   This patch implements the proposed manageLog interface outlined in
>   http://code.google.com/p/xmonad/issues/detail?id=54
>   
>   Note that all the Data.Monoid stuff is just to avoid writing
>   foldl (.) id
>   as mconcat. Maybe foldl (.) id is nicer in this case.
>   
>   I'm not sure if I put the ManageHook type declaration in the right spot.
>   
>   I did not adjust any plugins to the new interface, although the recently commited
>   ManageDocks.hs by chance already had this interface :-)
>   
>   The Config.hs could probably need some example, as soon as some plugins use
>   this interface
>   > -- Add hooks from imported extensions, e.g.
>   > manageHooks = [ floatGimp, manageDocksHook ]

> hunk ./Operations.hs 68
> - -    n <- fmap (fromMaybe "") $ io $ fetchName d w
> - -    (ClassHint rn rc) <- io $ getClassHint d w
> - -    g <- manageHook w n rn rc
> +    -- Unfortunately, we don't have
> +    -- > instance Monoid (a -> a)
> +    -- and have to wrap it with Endo. Or we just use
> +    -- > fold (.) id
> +    -- instead of
> +    -- (appEndo . mconcat . map (Endo))
> +    g <- (appEndo . mconcat . map (Endo)) `fmap` mapM ($w) manageHooks

Why not put this code into a module? There's no reason not to do so, that
I'm aware of.  If there *is* a reason this should be in core, perhaps you
could tell us.

> +-- ------------------------------------------------------------------
> +-- |
> +-- Manage Hook type
> +-- This is the type for hooks that want to run when a window is first managed.
> +-- Hooks can examine the Window and do an appropriate action.
> +-- If they do not apply, they should return id.
> +--
> +type ManageHook = Window -> X (WindowSet -> WindowSet)

Why not use the more user-friendly type that's already in place?

type ManageHook :: Window -- ^ the new window to manage
                -> String -- ^ window title
                -> String -- ^ window resource name
                -> String -- ^ window resource class
                -> X (WindowSet -> WindowSet)

It's not really any more difficult to use, and is just plain more powerful
and easy to use.  The folks who want to write two-line functions can do so
beautifully and easily (and relatively readably).

We could extend this a bit with something like

data WindowInfo = WindowInfo { w :: Window, title :: String, ... }

which might make the code even more readable, but I don't see any reason to
clutter Config with actual monadic calls to discover the window's title
(not to mention the inelegance of doing so N times for N hooks).

-- 
David Roundy
Department of Physics
Oregon State University


More information about the Xmonad mailing list