diff options
| -rw-r--r-- | UnityCore/GLibSignal.cpp | 26 | ||||
| -rw-r--r-- | UnityCore/GLibSignal.h | 3 | ||||
| -rw-r--r-- | tests/test_glib_signals.cpp | 34 |
3 files changed, 63 insertions, 0 deletions
diff --git a/UnityCore/GLibSignal.cpp b/UnityCore/GLibSignal.cpp index f0949e84a..b649e2543 100644 --- a/UnityCore/GLibSignal.cpp +++ b/UnityCore/GLibSignal.cpp @@ -51,6 +51,32 @@ bool SignalBase::Disconnect() return disconnected; } +bool SignalBase::Block() const +{ + bool blocked = false; + + if (connection_id_ && G_IS_OBJECT(object_)) + { + g_signal_handler_block(object_, connection_id_); + blocked = true; + } + + return blocked; +} + +bool SignalBase::Unblock() const +{ + bool unblocked = false; + + if (connection_id_ && G_IS_OBJECT(object_)) + { + g_signal_handler_unblock(object_, connection_id_); + unblocked = true; + } + + return unblocked; +} + GObject* SignalBase::object() const { return object_; diff --git a/UnityCore/GLibSignal.h b/UnityCore/GLibSignal.h index 46914bd00..894b7843c 100644 --- a/UnityCore/GLibSignal.h +++ b/UnityCore/GLibSignal.h @@ -41,6 +41,9 @@ public: bool Disconnect(); + bool Block() const; + bool Unblock() const; + GObject* object() const; std::string const& name() const; diff --git a/tests/test_glib_signals.cpp b/tests/test_glib_signals.cpp index df17f8366..a514f8d86 100644 --- a/tests/test_glib_signals.cpp +++ b/tests/test_glib_signals.cpp @@ -243,6 +243,40 @@ TEST_F(TestGLibSignals, TestSignal6) EXPECT_EQ(ret, TRUE); } +TEST_F(TestGLibSignals, TestBlock) +{ + Signal<void, TestSignals*> signal; + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); + EXPECT_TRUE(signal.Block()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_FALSE(signal0_received_); + + signal0_received_ = false; + EXPECT_TRUE(signal.Unblock()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_TRUE(signal0_received_); +} + +TEST_F(TestGLibSignals, TestUnblock) +{ + Signal<void, TestSignals*> signal; + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); + EXPECT_TRUE(signal.Unblock()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_TRUE(signal0_received_); + + signal0_received_ = false; + EXPECT_TRUE(signal.Block()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_FALSE(signal0_received_); +} + TEST_F(TestGLibSignals, TestDisconnection) { Signal<void, TestSignals*> signal; |
