summaryrefslogtreecommitdiff
diff options
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2017-07-12 18:13:47 +0200
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2017-07-12 18:13:47 +0200
commitaf2d08087a6e2386aa6edd5e133f5b581779c013 (patch)
tree933a5a9858e2c92cc97ebb4d1a420d74b1986331
parente4c421bc64b1aad5bc971faca2c0e1ad84e64db7 (diff)
GLibSignal: allow to block, unblock signals
(bzr r4245.2.3)
-rw-r--r--UnityCore/GLibSignal.cpp26
-rw-r--r--UnityCore/GLibSignal.h3
-rw-r--r--tests/test_glib_signals.cpp34
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;