summaryrefslogtreecommitdiff
path: root/src/Gtk/Signal.icl
diff options
context:
space:
mode:
authorCamil Staps2019-10-19 19:57:53 +0200
committerCamil Staps2019-10-20 09:11:19 +0200
commitad98343da1467653dacc811a9e52b7da2282c200 (patch)
tree159ee3beadf5ddb022d1640ba441aebee7f39a54 /src/Gtk/Signal.icl
Initial commit
Diffstat (limited to 'src/Gtk/Signal.icl')
-rw-r--r--src/Gtk/Signal.icl26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/Gtk/Signal.icl b/src/Gtk/Signal.icl
new file mode 100644
index 0000000..4bc14b5
--- /dev/null
+++ b/src/Gtk/Signal.icl
@@ -0,0 +1,26 @@
+implementation module Gtk.Signal
+
+import StdEnv
+
+import Control.Monad
+import Control.Monad.Identity
+import Control.Monad.State
+import qualified Data.Map as M
+
+import qualified Gtk.Internal as I
+import Gtk.State
+import Gtk.Widgets
+
+installSignalHandler :: !w !GSignalHandler -> State GtkState () | gtkWidget w
+installSignalHandler widget handler =
+ modify (\st ->
+ { st
+ & signal_handlers = 'M'.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 _ -> 'I'.g_signal_connect_void (gtkPtr widget) signal_name id
+where
+ (signal_name,handler_internal) = case handler of
+ DestroyHandler f -> ("destroy",GSHI_Void f)