From 02bb93590c69b619150735f026f7719df2e5c271 Mon Sep 17 00:00:00 2001 From: Henrik Kinnunen Date: Thu, 18 Mar 2010 19:35:19 +0100 Subject: Added FbTk::relaySignal, which relays new signals to old Subject type signals. --- src/FbTk/RelaySignal.hh | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ src/tests/Makefile | 4 ++-- src/tests/testSignals.cc | 24 ++++++++++++++++++- 3 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 src/FbTk/RelaySignal.hh diff --git a/src/FbTk/RelaySignal.hh b/src/FbTk/RelaySignal.hh new file mode 100644 index 0000000..e9b7281 --- /dev/null +++ b/src/FbTk/RelaySignal.hh @@ -0,0 +1,62 @@ +// RelaySignal.hh +// Copyright (c) 2010 Fluxbox Team (fluxgen at fluxbox dot org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef FBTK_RELAY_SIGNAL_HH +#define FBTK_RELAY_SIGNAL_HH + +#include "Signal.hh" +#include "MemFun.hh" +#include "Subject.hh" + +namespace FbTk { + +/** + * Relays a new signal type to the old subject type signal. When the new signal + * emits the subject notify() will be called. + * This function is temporary and just a helper during transition between old + * and new signal system. + * + * @param from The original source of the signal. + * @param to_subject The destination Subject. + */ +template < typename Signal > +void relaySignal(Signal& from, FbTk::Subject& to_subject) { + from.connect(MemFunIgnoreArgs(to_subject, &FbTk::Subject::notify)); +} + +/** + * Relays a new signal type to the old subject type signal. When the new signal + * emits the subject notify() will be called. + * This function is temporary and just a helper during transition between old + * and new signal system. + * + * @param tracker Keeps track of signals + * @param from The original source of the signal. + * @param to_subject The destination Subject + */ +template < typename Signal > +void relaySignal(SignalTracker& tracker, Signal& from, FbTk::Subject& to_subject) { + tracker.join(from, MemFunIgnoreArgs(to_subject, &FbTk::Subject::notify)); +} + +} // end namespace FbTk + +#endif // FBTK_RELAY_SIGNAL_HH diff --git a/src/tests/Makefile b/src/tests/Makefile index 668126e..dd329e6 100644 --- a/src/tests/Makefile +++ b/src/tests/Makefile @@ -1,5 +1,5 @@ CXX=g++ -CXXFLAGS= -I.. -I../FbTk -I../.. -DDEBUG -DUSE_XFT -Wall -g -O2 ../FbTk/libFbTk.a +CXXFLAGS= -I.. -I../FbTk -I../.. -DDEBUG -DUSE_XFT -Wall -g -O2 -fno-inline LIBS= XFLAGS= -I/usr/X11R6/include XLIBS= -L/usr/X11R6/lib -lX11 -lXft -lXpm -lImlib2 @@ -17,7 +17,7 @@ glxtest: ../FbTk/App.hh glxtest.cc ${CXX} glxtest.cc ${CXXFLAGS} ${XLIBS} -lGL -lGLU -lXpm -o glxtest testSignals: testSignals.o ../FbTk/Signal.hh ../FbTk/MemFun.hh - $(CXX) $(LIBS) testSignals.o -o testSignals + $(CXX) $(LIBS) testSignals.o -o testSignals ../FbTk/libFbTk.a testStringUtil: StringUtiltest.o $(CXX) $(LIBS) StringUtiltest.o ../FbTk/libFbTk.a -o testStringUtil diff --git a/src/tests/testSignals.cc b/src/tests/testSignals.cc index 6d68d3a..f382289 100644 --- a/src/tests/testSignals.cc +++ b/src/tests/testSignals.cc @@ -3,6 +3,9 @@ using namespace std; #include "../FbTk/Signal.hh" #include "../FbTk/MemFun.hh" +#include "../FbTk/RelaySignal.hh" +#include "../FbTk/Observer.hh" +#include "../FbTk/Subject.hh" #include @@ -138,5 +141,24 @@ int main() { 2.9); } - + // Test relay new signals to old + { + cout << "---------- Testing relay of signals" << endl; + struct Observer: public FbTk::Observer { + void update(FbTk::Subject* subj) { + cout << "Observer called." << endl; + } + }; + // setup old subject->observer listening + FbTk::Subject destination; + Observer obs; + destination.attach(&obs); + // create a new signal and relay it to the + // old subject + FbTk::Signal source; + FbTk::relaySignal(source, destination); + // the new signal should now make the old + // subject notify its observers + source.emit("hello world"); + } } -- cgit v0.11.2