/** * \file dispatcher.h * * \brief Deklaration eines abstrakten Event-Dispatchers und des * Dispatcher-Managers. * *

In einem Dispatcher werden callbacks eingetragen, die bei bestimmten * Events aufgerufen werden sollen, Der Dispatcher kümmert sich dann * darum das diese zum richtigen Zeitpunk und für das richtige Event * aufgerufen werden. Der Dispatcher wird mit der Event-Quelle initialisiert, * die die Events erzeugt. Die hier definierte Dispatcher Klasse ist abstrakt * und muß noch in einer abgeleiteten Klasse konkretisiert werden. So * kann ich diverse Dispatcher erzeugen, die intern unterschiedlich arbeiten, * im Moment existiert die X11 implementation eines Dispatches.

*

Im Dispatcher Manager werden die einzelnen Dispatcher registriert. Er * sorgt dann dann standartmäßig dafür, das die einzelnen * Dispatcher immer wieder nacheinenader in der Reihenfolge in der sie dem * Manager hinzugefügt wurden ausgeführt werden und so alle Events immer * wieder gecheckt werden. Dieses verhalten kann man aber ändern indem * man einen neuen Manager von diesem ableitet und die virtuellen Methoden * entsprechend überschreibt.

* * \author Georg Steffers * * \date 04.12.2003 * * \version ..2002 (Georg Steffers): erste funktionierende Implementation * \version 04.12.2003 (Georg Steffers): beginn der Dokumentation via doxygen */ /* * Copyright (C)2003 Georg Steffers * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __dispatcher_h__ #define __dispatcher_h__ #include "callback.h" #include "event_source.h" class disp_manager; class dispatcher { friend class disp_manager; protected: callback cb[MaxEvent]; event_source* e_src; int halt_f; public: dispatcher(event_source* es=NULL) { e_src=es; halt_f=false; } virtual ~dispatcher() {} void register_callback(event e, callback _cb) { if(e_src) cb[e]=_cb; } virtual void go(void)=0; virtual void trigger_event(event)=0; void halt(void) { halt_f=true; } void cont(void) { halt_f=false; } }; // Da ich u.U. mehrere Eventquellen in einem Programm habe brauche // ich eine Klasse die die verschiedenen Dispatcher-Klassen kontrolliert // nacheinander aufruft. class disp_manager { private: dispatcher** disp; unsigned disp_count; unsigned run; public: disp_manager(dispatcher* = NULL); ~disp_manager() { delete [] disp; } dispatcher*& operator[](unsigned index); unsigned count(void) { return disp_count; } virtual void start(void); virtual void stop(event_source*, void*) { run=false; } virtual void do_once(void); }; class dispatcher_factory { public: virtual dispatcher* create(event_source* es) const=0; }; #endif // __dispatcher_h__