
Axel Simon wrote:
I think this is one of the mid-level features we want to keep: A convenient syntax, not just a bunch of IO functions like
buttonOnClick :: IO () -> Button -> IO () buttonGetOnClick :: Button -> IO (IO ())
The "convenient syntax" only makes sense if you view events and callbacks as being in 1:1 correspondence. Not all toolkits take this view. Xt has callback lists, where callbacks can be added and removed independently (callbacks are identified by equality on function pointers, which becomes problematic if you want to pass Haskell functions directly); similarly for the signal/slot approach. Gtk uses a very similar approach in that each event can have several callbacks registered and you can remove each callback individually. So I
On Tue, Mar 18, 2003 at 06:46:42PM +0000, Glynn Clements wrote: think my proposal serves this 1:n correspondance. You can say: remove :: MVar (IO ()) <- newEmptyMVar button [label =: "Open Dialogs", on click := messageBox "hi there", onOff click remove := messageBox "bye there"] which will attach two callbacks to the same event whereas the remove MVar will only get the unregister function for the second callback. If you want to remove both at a time you say: button [label =: "Open Dialogs", opeonOff click remove =: messageBox "hi there", onOff click remove =: messageBox "bye there"] and "withMVar remove id" as an IO action will remove both callbacks. Note: a) fits into syntax b) 1:n event:callback correspondance c) the MVar approach is actually convenient in practice (as you need to store the unregister function/signal-id somewhere anyway) d) can be implemented with equality on C function pointers under the hood if necessary No? Axel.