diff options
| -rw-r--r-- | UnityCore/GLibSignal.cpp | 5 | ||||
| -rw-r--r-- | UnityCore/GLibSignal.h | 5 | ||||
| -rw-r--r-- | tests/test_glib_signals.cpp | 28 |
3 files changed, 33 insertions, 5 deletions
diff --git a/UnityCore/GLibSignal.cpp b/UnityCore/GLibSignal.cpp index 0a155aede..d577c2f2e 100644 --- a/UnityCore/GLibSignal.cpp +++ b/UnityCore/GLibSignal.cpp @@ -122,13 +122,14 @@ SignalBase::Ptr SignalManager::Add(SignalBase::Ptr const& signal) bool SignalManager::ForeachMatchedSignal(void* object, std::string const& signal_name, std::function<void(SignalBase::Ptr const&)> action, bool erase_after) { bool action_performed = false; - bool all_signals = signal_name.empty(); + bool all_objects = (object == reinterpret_cast<void*>(std::numeric_limits<uintptr_t>::max())); + bool all_signals = all_objects || signal_name.empty(); for (auto it = connections_.begin(); it != connections_.end();) { auto const& signal = *it; - if (signal->object() == object && (all_signals || signal->name() == signal_name)) + if ((all_objects || signal->object() == object) && (all_signals || signal->name() == signal_name)) { if (action) { diff --git a/UnityCore/GLibSignal.h b/UnityCore/GLibSignal.h index d60ebc249..6dc536111 100644 --- a/UnityCore/GLibSignal.h +++ b/UnityCore/GLibSignal.h @@ -21,6 +21,7 @@ #ifndef UNITY_GLIB_SIGNAL_H #define UNITY_GLIB_SIGNAL_H +#include <limits> #include <string> #include <vector> #include <memory> @@ -94,8 +95,8 @@ public: template <typename R, typename G, typename... Ts> SignalBase::Ptr Add(G object, std::string const& signal_name, typename Signal<R, G, Ts...>::SignalCallback const&); - bool Block(void* object, std::string const& signal_name = ""); - bool Unblock(void* object, std::string const& signal_name = ""); + bool Block(void* object = (void*) std::numeric_limits<uintptr_t>::max(), std::string const& signal_name = ""); + bool Unblock(void* object = (void*) std::numeric_limits<uintptr_t>::max(), std::string const& signal_name = ""); bool Disconnect(void* object, std::string const& signal_name = ""); diff --git a/tests/test_glib_signals.cpp b/tests/test_glib_signals.cpp index 100b1bca9..724e18fec 100644 --- a/tests/test_glib_signals.cpp +++ b/tests/test_glib_signals.cpp @@ -34,7 +34,8 @@ public: virtual ~TestGLibSignals() { - g_object_unref(test_signals_); + if (test_signals_) + g_object_unref(test_signals_); } void Signal0Callback(TestSignals* signals) @@ -511,6 +512,31 @@ TEST_F(TestGLibSignals, TestManagerBlockAll) EXPECT_TRUE(signal1_received_); } +TEST_F(TestGLibSignals, TestManagerBlockAllObjects) +{ + SignalManager manager; + + manager.Add<void, TestSignals*>(test_signals_, + "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + manager.Add<void, TestSignals*, const char*>(test_signals_, + "signal1", + sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)); + EXPECT_TRUE(manager.Block()); + + g_signal_emit_by_name(test_signals_, "signal0"); + g_signal_emit_by_name(test_signals_, "signal1", "blocked"); + EXPECT_FALSE(signal0_received_); + EXPECT_FALSE(signal1_received_); + + EXPECT_TRUE(manager.Unblock()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_TRUE(signal0_received_); + g_signal_emit_by_name(test_signals_, "signal1", "unblocked"); + EXPECT_TRUE(signal1_received_); +} + TEST_F(TestGLibSignals, TestManagerObjectDisconnection) { SignalManager manager; |
