diff options
| author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2017-07-12 18:13:47 +0200 | 
|---|---|---|
| committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2017-07-12 18:13:47 +0200 | 
| commit | af2d08087a6e2386aa6edd5e133f5b581779c013 (patch) | |
| tree | 933a5a9858e2c92cc97ebb4d1a420d74b1986331 | |
| parent | e4c421bc64b1aad5bc971faca2c0e1ad84e64db7 (diff) | |
GLibSignal: allow to block, unblock signals
(bzr r4245.2.3)
| -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; | 
