summaryrefslogtreecommitdiff
path: root/src/Gdk
diff options
context:
space:
mode:
Diffstat (limited to 'src/Gdk')
-rw-r--r--src/Gdk/Events.dcl9
-rw-r--r--src/Gdk/Events.icl13
-rw-r--r--src/Gdk/Internal.dcl10
-rw-r--r--src/Gdk/Internal.icl44
4 files changed, 76 insertions, 0 deletions
diff --git a/src/Gdk/Events.dcl b/src/Gdk/Events.dcl
new file mode 100644
index 0000000..e3d5bd7
--- /dev/null
+++ b/src/Gdk/Events.dcl
@@ -0,0 +1,9 @@
+definition module Gdk.Events
+
+from StdMaybe import :: Maybe
+
+from System._Pointer import :: Pointer
+
+:: GdkEvent =: GdkEvent Pointer
+
+getKeyvalName :: !GdkEvent -> Maybe String
diff --git a/src/Gdk/Events.icl b/src/Gdk/Events.icl
new file mode 100644
index 0000000..58ca045
--- /dev/null
+++ b/src/Gdk/Events.icl
@@ -0,0 +1,13 @@
+implementation module Gdk.Events
+
+import StdEnv
+import StdMaybe
+
+import Data.Functor
+import Data.Maybe
+import System._Pointer
+
+import Gdk.Internal
+
+getKeyvalName :: !GdkEvent -> Maybe String
+getKeyvalName (GdkEvent ev) = gdk_keyval_name <$> gdk_event_get_keyval ev
diff --git a/src/Gdk/Internal.dcl b/src/Gdk/Internal.dcl
new file mode 100644
index 0000000..ccc157e
--- /dev/null
+++ b/src/Gdk/Internal.dcl
@@ -0,0 +1,10 @@
+definition module Gdk.Internal
+
+from StdMaybe import :: Maybe
+
+from System._Pointer import :: Pointer
+
+gdk_event_get_keyval :: !Pointer -> Maybe Int
+
+gdk_keyval_from_name :: !String -> Int
+gdk_keyval_name :: !Int -> String
diff --git a/src/Gdk/Internal.icl b/src/Gdk/Internal.icl
new file mode 100644
index 0000000..a922d84
--- /dev/null
+++ b/src/Gdk/Internal.icl
@@ -0,0 +1,44 @@
+implementation module Gdk.Internal
+
+import StdEnv
+import StdMaybe
+
+import System._Pointer
+
+gdk_event_get_keyval :: !Pointer -> Maybe Int
+gdk_event_get_keyval event
+ # arr = {#0}
+ # ok = get event (get_array_pointer arr)
+ | ok
+ = Just (arr.[0])
+ = Nothing
+where
+ get :: !Pointer !Pointer -> Bool
+ get _ _ = code {
+ ccall gdk_event_get_keyval "pp:I"
+ }
+
+gdk_keyval_from_name :: !String -> Int
+gdk_keyval_from_name name = get (packString name)
+where
+ get :: !String -> Int
+ get _ = code {
+ ccall gdk_keyval_from_name "s:I"
+ }
+
+gdk_keyval_name :: !Int -> String
+gdk_keyval_name keyval = derefString (get keyval)
+where
+ get :: !Pointer -> Pointer
+ get _ = code {
+ ccall gdk_keyval_name "p:p"
+ }
+
+get_array_pointer :: !{#Int} -> Pointer
+get_array_pointer arr = get arr + IF_INT_64_OR_32 24 12
+where
+ get :: !{#Int} -> Pointer
+ get _ = code {
+ push_a_b 0
+ pop_a 1
+ }