summaryrefslogtreecommitdiff
path: root/src/Gtk/Signal.icl
blob: 5861e92290b9cc2b2a7e873a64822504a757f7cd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
implementation module Gtk.Signal

import StdEnv

import Control.Monad
import Control.Monad.Identity
import Control.Monad.State
import qualified Data.Map

import Gtk.Internal
import Gtk.State
import Gtk.Widgets

installSignalHandler :: !GSignalHandler !w -> State GtkState w | gtkWidget w
installSignalHandler handler widget =
	modify (\st ->
		{ st
		& signal_handlers = 'Data.Map'.put (st.signal_counter+1) handler_internal st.signal_handlers
		, signal_counter  = st.signal_counter+1
		}) >>|
	gets (\st -> st.signal_counter) >>= \id ->
	(toState case handler_internal of
		GSHI_Void _ -> g_signal_connect_void (toPtr (gtkWidget widget)) signal_name id) >>|
	pure widget
where
	(signal_name,handler_internal) = case handler of
		DestroyHandler f  -> ("destroy", GSHI_Void f)
		ActivateHandler f -> ("activate",GSHI_Void f)