{-# LINE 2 "./System/Glib/Signals.chs" #-}
{-# CFILES hsgclosure.c #-}
module System.Glib.Signals (
Signal(Signal),
on, after,
SignalName,
GSignalMatchType(..),
ConnectAfter,
ConnectId(ConnectId),
signalDisconnect,
signalBlock,
signalBlockMatched,
signalUnblock,
signalStopEmission,
disconnect,
GClosure,
connectGeneric,
) where
import Control.Monad (liftM)
import System.Glib.FFI
import System.Glib.GType
import System.Glib.Flags
import System.Glib.GObject
{-# LINE 63 "./System/Glib/Signals.chs" #-}
{-# LINE 68 "./System/Glib/Signals.chs" #-}
newtype Signal object handler =
Signal (Bool -> object -> handler -> IO (ConnectId object))
on ::
object
-> Signal object callback
-> callback
-> IO (ConnectId object)
on :: forall object callback.
object
-> Signal object callback -> callback -> IO (ConnectId object)
on object
object (Signal Bool -> object -> callback -> IO (ConnectId object)
connect) callback
handler = Bool -> object -> callback -> IO (ConnectId object)
connect Bool
False object
object callback
handler
after ::
object
-> Signal object callback
-> callback
-> IO (ConnectId object)
after :: forall object callback.
object
-> Signal object callback -> callback -> IO (ConnectId object)
after object
object (Signal Bool -> object -> callback -> IO (ConnectId object)
connect) callback
handler = Bool -> object -> callback -> IO (ConnectId object)
connect Bool
True object
object callback
handler
type ConnectAfter = Bool
type SignalName = String
data GObjectClass o => ConnectId o = ConnectId (CULong) o
disconnect :: GObjectClass obj => ConnectId obj -> IO ()
disconnect :: forall obj. GObjectClass obj => ConnectId obj -> IO ()
disconnect = ConnectId obj -> IO ()
forall obj. GObjectClass obj => ConnectId obj -> IO ()
signalDisconnect
{-# DEPRECATED disconnect "use signalDisconnect instead" #-}
signalDisconnect :: GObjectClass obj => ConnectId obj -> IO ()
signalDisconnect :: forall obj. GObjectClass obj => ConnectId obj -> IO ()
signalDisconnect (ConnectId CULong
handler obj
obj) =
ForeignPtr GObject -> (Ptr GObject -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ((GObject -> ForeignPtr GObject
unGObject(GObject -> ForeignPtr GObject)
-> (obj -> GObject) -> obj -> ForeignPtr GObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
.obj -> GObject
forall o. GObjectClass o => o -> GObject
toGObject) obj
obj) ((Ptr GObject -> IO ()) -> IO ())
-> (Ptr GObject -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GObject
objPtr ->
Ptr () -> CULong -> IO ()
g_signal_handler_disconnect (Ptr GObject -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr GObject
objPtr) CULong
handler
signalBlock :: GObjectClass obj => ConnectId obj -> IO ()
signalBlock :: forall obj. GObjectClass obj => ConnectId obj -> IO ()
signalBlock (ConnectId CULong
handler obj
obj) =
ForeignPtr GObject -> (Ptr GObject -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ((GObject -> ForeignPtr GObject
unGObject(GObject -> ForeignPtr GObject)
-> (obj -> GObject) -> obj -> ForeignPtr GObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
.obj -> GObject
forall o. GObjectClass o => o -> GObject
toGObject) obj
obj) ((Ptr GObject -> IO ()) -> IO ())
-> (Ptr GObject -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GObject
objPtr ->
Ptr () -> CULong -> IO ()
g_signal_handler_block (Ptr GObject -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr GObject
objPtr) CULong
handler
data GSignalMatchType = SignalMatchId
| SignalMatchDetail
| SignalMatchClosure
| SignalMatchFunc
| SignalMatchData
| SignalMatchUnblocked
deriving (GSignalMatchType -> GSignalMatchType -> Bool
(GSignalMatchType -> GSignalMatchType -> Bool)
-> (GSignalMatchType -> GSignalMatchType -> Bool)
-> Eq GSignalMatchType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GSignalMatchType -> GSignalMatchType -> Bool
== :: GSignalMatchType -> GSignalMatchType -> Bool
$c/= :: GSignalMatchType -> GSignalMatchType -> Bool
/= :: GSignalMatchType -> GSignalMatchType -> Bool
Eq,Eq GSignalMatchType
Eq GSignalMatchType =>
(GSignalMatchType -> GSignalMatchType -> Ordering)
-> (GSignalMatchType -> GSignalMatchType -> Bool)
-> (GSignalMatchType -> GSignalMatchType -> Bool)
-> (GSignalMatchType -> GSignalMatchType -> Bool)
-> (GSignalMatchType -> GSignalMatchType -> Bool)
-> (GSignalMatchType -> GSignalMatchType -> GSignalMatchType)
-> (GSignalMatchType -> GSignalMatchType -> GSignalMatchType)
-> Ord GSignalMatchType
GSignalMatchType -> GSignalMatchType -> Bool
GSignalMatchType -> GSignalMatchType -> Ordering
GSignalMatchType -> GSignalMatchType -> GSignalMatchType
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: GSignalMatchType -> GSignalMatchType -> Ordering
compare :: GSignalMatchType -> GSignalMatchType -> Ordering
$c< :: GSignalMatchType -> GSignalMatchType -> Bool
< :: GSignalMatchType -> GSignalMatchType -> Bool
$c<= :: GSignalMatchType -> GSignalMatchType -> Bool
<= :: GSignalMatchType -> GSignalMatchType -> Bool
$c> :: GSignalMatchType -> GSignalMatchType -> Bool
> :: GSignalMatchType -> GSignalMatchType -> Bool
$c>= :: GSignalMatchType -> GSignalMatchType -> Bool
>= :: GSignalMatchType -> GSignalMatchType -> Bool
$cmax :: GSignalMatchType -> GSignalMatchType -> GSignalMatchType
max :: GSignalMatchType -> GSignalMatchType -> GSignalMatchType
$cmin :: GSignalMatchType -> GSignalMatchType -> GSignalMatchType
min :: GSignalMatchType -> GSignalMatchType -> GSignalMatchType
Ord,GSignalMatchType
GSignalMatchType -> GSignalMatchType -> Bounded GSignalMatchType
forall a. a -> a -> Bounded a
$cminBound :: GSignalMatchType
minBound :: GSignalMatchType
$cmaxBound :: GSignalMatchType
maxBound :: GSignalMatchType
Bounded)
instance Enum GSignalMatchType where
fromEnum :: GSignalMatchType -> Int
fromEnum GSignalMatchType
SignalMatchId = Int
1
fromEnum GSignalMatchType
SignalMatchDetail = Int
2
fromEnum GSignalMatchType
SignalMatchClosure = Int
4
fromEnum GSignalMatchType
SignalMatchFunc = Int
8
fromEnum GSignalMatchType
SignalMatchData = Int
16
fromEnum GSignalMatchType
SignalMatchUnblocked = Int
32
toEnum :: Int -> GSignalMatchType
toEnum Int
1 = GSignalMatchType
SignalMatchId
toEnum Int
2 = GSignalMatchType
SignalMatchDetail
toEnum Int
4 = GSignalMatchType
SignalMatchClosure
toEnum Int
8 = GSignalMatchType
SignalMatchFunc
toEnum Int
16 = GSignalMatchType
SignalMatchData
toEnum Int
32 = GSignalMatchType
SignalMatchUnblocked
toEnum Int
unmatched = [Char] -> GSignalMatchType
forall a. HasCallStack => [Char] -> a
error ([Char]
"GSignalMatchType.toEnum: Cannot match " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
unmatched)
succ :: GSignalMatchType -> GSignalMatchType
succ GSignalMatchType
SignalMatchId = GSignalMatchType
SignalMatchDetail
succ GSignalMatchType
SignalMatchDetail = GSignalMatchType
SignalMatchClosure
succ GSignalMatchType
SignalMatchClosure = GSignalMatchType
SignalMatchFunc
succ GSignalMatchType
SignalMatchFunc = GSignalMatchType
SignalMatchData
succ GSignalMatchType
SignalMatchData = GSignalMatchType
SignalMatchUnblocked
succ GSignalMatchType
_ = GSignalMatchType
forall a. HasCallStack => a
undefined
pred :: GSignalMatchType -> GSignalMatchType
pred GSignalMatchType
SignalMatchDetail = GSignalMatchType
SignalMatchId
pred GSignalMatchType
SignalMatchClosure = GSignalMatchType
SignalMatchDetail
pred GSignalMatchType
SignalMatchFunc = GSignalMatchType
SignalMatchClosure
pred GSignalMatchType
SignalMatchData = GSignalMatchType
SignalMatchFunc
pred GSignalMatchType
SignalMatchUnblocked = GSignalMatchType
SignalMatchData
pred GSignalMatchType
_ = GSignalMatchType
forall a. HasCallStack => a
undefined
enumFromTo :: GSignalMatchType -> GSignalMatchType -> [GSignalMatchType]
enumFromTo GSignalMatchType
x GSignalMatchType
y | GSignalMatchType -> Int
forall a. Enum a => a -> Int
fromEnum GSignalMatchType
x Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== GSignalMatchType -> Int
forall a. Enum a => a -> Int
fromEnum GSignalMatchType
y = [ GSignalMatchType
y ]
| Bool
otherwise = GSignalMatchType
x GSignalMatchType -> [GSignalMatchType] -> [GSignalMatchType]
forall a. a -> [a] -> [a]
: GSignalMatchType -> GSignalMatchType -> [GSignalMatchType]
forall a. Enum a => a -> a -> [a]
enumFromTo (GSignalMatchType -> GSignalMatchType
forall a. Enum a => a -> a
succ GSignalMatchType
x) GSignalMatchType
y
enumFrom :: GSignalMatchType -> [GSignalMatchType]
enumFrom GSignalMatchType
x = GSignalMatchType -> GSignalMatchType -> [GSignalMatchType]
forall a. Enum a => a -> a -> [a]
enumFromTo GSignalMatchType
x GSignalMatchType
SignalMatchUnblocked
enumFromThen :: GSignalMatchType -> GSignalMatchType -> [GSignalMatchType]
enumFromThen GSignalMatchType
_ GSignalMatchType
_ = [Char] -> [GSignalMatchType]
forall a. HasCallStack => [Char] -> a
error [Char]
"Enum GSignalMatchType: enumFromThen not implemented"
enumFromThenTo :: GSignalMatchType
-> GSignalMatchType -> GSignalMatchType -> [GSignalMatchType]
enumFromThenTo GSignalMatchType
_ GSignalMatchType
_ GSignalMatchType
_ = [Char] -> [GSignalMatchType]
forall a. HasCallStack => [Char] -> a
error [Char]
"Enum GSignalMatchType: enumFromThenTo not implemented"
{-# LINE 143 "./System/Glib/Signals.chs" #-}
instance Flags GSignalMatchType
signalBlockMatched :: GObjectClass obj
=> obj
-> [GSignalMatchType]
-> SignalName
-> GType
-> Quark
-> Maybe GClosure
-> Maybe (Ptr ())
-> Maybe (Ptr ())
-> IO Int
signalBlockMatched obj mask sigName gType quark closure func userData = do
sigId <- withCString sigName $ \strPtr ->
g_signal_lookup strPtr gType
liftM fromIntegral $ withForeignPtr (unGObject $ toGObject obj) $ \objPtr ->
g_signal_handlers_block_matched
{-# LINE 166 "./System/Glib/Signals.chs" #-}
(castPtr objPtr)
(fromIntegral $ fromFlags mask)
sigId
quark
(maybe nullPtr (\(GClosure p) -> castPtr p) closure)
(maybe nullPtr id func)
(maybe nullPtr id userData)
signalUnblock :: GObjectClass obj => ConnectId obj -> IO ()
signalUnblock :: forall obj. GObjectClass obj => ConnectId obj -> IO ()
signalUnblock (ConnectId CULong
handler obj
obj) =
ForeignPtr GObject -> (Ptr GObject -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ((GObject -> ForeignPtr GObject
unGObject(GObject -> ForeignPtr GObject)
-> (obj -> GObject) -> obj -> ForeignPtr GObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
.obj -> GObject
forall o. GObjectClass o => o -> GObject
toGObject) obj
obj) ((Ptr GObject -> IO ()) -> IO ())
-> (Ptr GObject -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GObject
objPtr ->
Ptr () -> CULong -> IO ()
g_signal_handler_unblock (Ptr GObject -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr GObject
objPtr) CULong
handler
signalStopEmission :: GObjectClass obj => obj -> SignalName -> IO ()
signalStopEmission :: forall obj. GObjectClass obj => obj -> [Char] -> IO ()
signalStopEmission obj
obj [Char]
sigName =
ForeignPtr GObject -> (Ptr GObject -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ((GObject -> ForeignPtr GObject
unGObject(GObject -> ForeignPtr GObject)
-> (obj -> GObject) -> obj -> ForeignPtr GObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
.obj -> GObject
forall o. GObjectClass o => o -> GObject
toGObject) obj
obj) ((Ptr GObject -> IO ()) -> IO ())
-> (Ptr GObject -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GObject
objPtr ->
[Char] -> (CString -> IO ()) -> IO ()
forall a. [Char] -> (CString -> IO a) -> IO a
withCString [Char]
sigName ((CString -> IO ()) -> IO ()) -> (CString -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \CString
strPtr ->
Ptr () -> CString -> IO ()
g_signal_stop_emission_by_name (Ptr GObject -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr GObject
objPtr) CString
strPtr
newtype GClosure = GClosure (Ptr (GClosure))
{-# LINE 209 "./System/Glib/Signals.chs" #-}
connectGeneric :: GObjectClass obj =>
SignalName
-> ConnectAfter
-> obj
-> handler
-> IO (ConnectId obj)
connectGeneric :: forall obj handler.
GObjectClass obj =>
[Char] -> Bool -> obj -> handler -> IO (ConnectId obj)
connectGeneric [Char]
signal Bool
after obj
obj handler
user = do
StablePtr handler
sptr <- handler -> IO (StablePtr handler)
forall a. a -> IO (StablePtr a)
newStablePtr handler
user
Ptr GClosure
gclosurePtr <- StablePtr handler -> IO (Ptr GClosure)
forall a. StablePtr a -> IO (Ptr GClosure)
gtk2hs_closure_new StablePtr handler
sptr
CULong
sigId <-
[Char] -> (CString -> IO CULong) -> IO CULong
forall a. [Char] -> (CString -> IO a) -> IO a
withCString [Char]
signal ((CString -> IO CULong) -> IO CULong)
-> (CString -> IO CULong) -> IO CULong
forall a b. (a -> b) -> a -> b
$ \CString
signalPtr ->
ForeignPtr GObject -> (Ptr GObject -> IO CULong) -> IO CULong
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ((GObject -> ForeignPtr GObject
unGObject(GObject -> ForeignPtr GObject)
-> (obj -> GObject) -> obj -> ForeignPtr GObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
.obj -> GObject
forall o. GObjectClass o => o -> GObject
toGObject) obj
obj) ((Ptr GObject -> IO CULong) -> IO CULong)
-> (Ptr GObject -> IO CULong) -> IO CULong
forall a b. (a -> b) -> a -> b
$ \Ptr GObject
objPtr ->
(\Ptr ()
arg1 CString
arg2 (GClosure Ptr GClosure
arg3) CInt
arg4 -> Ptr () -> CString -> Ptr GClosure -> CInt -> IO CULong
g_signal_connect_closure Ptr ()
arg1 CString
arg2 Ptr GClosure
arg3 CInt
arg4)
{-# LINE 225 "./System/Glib/Signals.chs" #-}
(castPtr objPtr)
CString
signalPtr
(Ptr GClosure -> GClosure
GClosure Ptr GClosure
gclosurePtr)
(Bool -> CInt
forall a. Num a => Bool -> a
fromBool Bool
after)
ConnectId obj -> IO (ConnectId obj)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (ConnectId obj -> IO (ConnectId obj))
-> ConnectId obj -> IO (ConnectId obj)
forall a b. (a -> b) -> a -> b
$ CULong -> obj -> ConnectId obj
forall o. GObjectClass o => CULong -> o -> ConnectId o
ConnectId CULong
sigId obj
obj
foreign import ccall unsafe "gtk2hs_closure_new"
gtk2hs_closure_new :: StablePtr a -> IO (Ptr GClosure)
foreign import ccall safe "g_signal_handler_disconnect"
g_signal_handler_disconnect :: ((Ptr ()) -> (CULong -> (IO ())))
foreign import ccall safe "g_signal_handler_block"
g_signal_handler_block :: ((Ptr ()) -> (CULong -> (IO ())))
foreign import ccall safe "g_signal_lookup"
g_signal_lookup :: ((Ptr CChar) -> (CULong -> (IO CUInt)))
foreign import ccall safe "g_signal_handlers_block_matched"
g_signal_handlers_block_matched :: ((Ptr ()) -> (CInt -> (CUInt -> (CUInt -> ((Ptr ()) -> ((Ptr ()) -> ((Ptr ()) -> (IO CUInt))))))))
foreign import ccall safe "g_signal_handler_unblock"
g_signal_handler_unblock :: ((Ptr ()) -> (CULong -> (IO ())))
foreign import ccall safe "g_signal_stop_emission_by_name"
g_signal_stop_emission_by_name :: ((Ptr ()) -> ((Ptr CChar) -> (IO ())))
foreign import ccall safe "g_signal_connect_closure"
g_signal_connect_closure :: ((Ptr ()) -> ((Ptr CChar) -> ((Ptr GClosure) -> (CInt -> (IO CULong)))))