all repos — fluxbox @ 02bb93590c69b619150735f026f7719df2e5c271

custom fork of the fluxbox windowmanager

Added FbTk::relaySignal, which relays new signals to old Subject type signals.
Henrik Kinnunen fluxgen@fluxbox.org
commit

02bb93590c69b619150735f026f7719df2e5c271

parent

31a458f3657e53b51849111cf5ddc438c7e612a2

3 files changed, 87 insertions(+), 3 deletions(-)

jump to
A 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
M src/tests/Makefilesrc/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
M src/tests/testSignals.ccsrc/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 <string>

@@ -138,5 +141,24 @@ "Visible to the two args function.",

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<void, string> source; + FbTk::relaySignal(source, destination); + // the new signal should now make the old + // subject notify its observers + source.emit("hello world"); + } }