
On Fri, Sep 21, 2007 at 09:08:13AM +0200, Andrea Rossato wrote:
Hi, I think there's a huge flaw in the Haskell design:
I don't know if this is a feature, the fact that most of the times you can find a solution to your problems by yourself, but only after polluting the haskell-cafe mailing list with your question...
Basically there are two C types I'm having problem with:
1. GList: even though I read the gtk2hs code I do not exactly understand how to create a GList to feed to this function:
void xmms_remote_playlist_add(gint session, GList * list);
As far as I understand this function takes a session number and a list of files' names. Still I seem not to be able to create a wrapper function around the imported one.
Well I used gtk2hs more carefully and that's the wrapper:
foreign import ccall unsafe "beepctrl.h xmms_remote_playlist_add"
c_xmms_remote_playlist_add :: CInt -> GList -> IO ()
xmms_remote_playlist_add :: Session -> [String] -> IO ()
xmms_remote_playlist_add s fns = do
l <- mapM newCString fns >>= toGList
c_xmms_remote_playlist_add (fromIntegral s) l
-- stolen from gtk2hs
#include
2. what a "gchar ** list" is? As far as my C goes, it should be an array of strings, right? What should I use on the Haskell side, newArray? void xmms_remote_playlist(gint session, gchar ** list, gint num, gboolean enqueue);
yes, indeed: foreign import ccall unsafe "beepctrl.h xmms_remote_playlist" c_xmms_remote_playlist :: CInt -> Ptr CString -> CInt -> {# type gboolean #} -> IO () xmms_remote_playlist :: Session -> [String] -> Bool -> IO () xmms_remote_playlist s l b = do la <- newArray =<< mapM newCString l c_xmms_remote_playlist (fromIntegral s) la (fromIntegral $ length l) (fromBool b) The next two question are still waiting for an answer though...;-)
3. c2hs v. hsc2hs? Which should I prefer? In c2hs I write {#pointer * GList#}. What is the equivalent in hsc2hs?
4. As I said, I solved my personal problem: I imported enough functions to create the client I needed. Releasing the library is just something I would like to do, to give something back to the Haskell community. So this is something useful if I can provide robust and well designed code. This is a name space question: what is the name of the exported module? Sound.XMMS, Sound.XmmsRemote? Is the some kind of convention I should be referring to?
I apologize for the noise. The auto-replay is for documentation (who knows, maybe others searching the list archives may find this info useful). Andrea