[Xmonad] xmonad-utils: small x apps for xmonad

Gwern Branwen gwern0 at gmail.com
Wed Aug 22 12:09:21 EDT 2007

On  0, Andrea Rossato <mailing_list at istitutocolli.org> scribbled:
> On Wed, Aug 22, 2007 at 10:02:40AM -0400, Gwern Branwen wrote:
> > Hey: would it be possible to have a version of hxsel which is a function you could call in Xmonad's Config.hs?
> well, you've got that version: it's just the code below...;-)
> I didn't test it but it looks fine to me.
> >         else do  destroyWindow dpy win >> return "" -- Is destroyWindow really needed?
> yes, as far as I remember, otherwise we leak memory.

Ah, I suspected as much - I would've been surprised if you could create windows and not have to manually free them.

> You can send it as a contrib module if you feel like.
> Generally speaking I prefer to keep this stuff outside XMonad: less
> memory, less code, less bugs, but this is a matter of personal taste I
> think.
> Cheers,
> Andrea

Well, my reasoning is that given that Xmonad is already linking in so much X-related stuff, that calling the shell to call another program (with all the overhead involved in those indirections and standalone binaries,, like the 500KB RTS system GHC inserts) is less of a win than just putting in some stripped down code. Plus, shells are often sources of problems, and it's tidier to have all the logic in one place.

Anyway, I don't think I'll send in a contrib module just yet. hxsel should probably be factored out into two functions, a main that prints stuff to stdout and the actual selection-fetching code; that way it doesn't have to be duplicated. Further, I'm having problems integrating it into Config.hs: I finally got it to compile like this:
     , ((modMask .|. shiftMask, xK_g     ), spawn $ "google" ++ unsafePerformIO(getSelection))

But notice I used unsafePerformIO. The reason is that if you try to simply concatenate "google" and getSelection, there's a type mismatch. You can then try using liftM to do it, like ("google"++) `liftM` getSelection, and that will work well. Unfortunately, spawn :: String -> X (), so spawn needs to be lifted. (The internal /bin/sh stuff apparently requires a String too, so it's not spawn's fault.) But if you go 'spawn (("google"++) `liftM` getSelection' - which on its own would work - the resulting type is something like IO ( X ()). And that just can't be allowed inside 'keys'. At least, the only solution I could find was to just slice the Gordian knot and avoid introducing the IO signature in the first place. Monads may be the greatest thing since sliced bread, but most of the time they're just a pain :(

extraction Iris MITM Fortezza FBIS Chelsea Love Coderpunks 64 stakeout
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/xmonad/attachments/20070822/7beea953/attachment.bin

More information about the Xmonad mailing list