$(info Build system selected: $(vomp_platform))
+ALL_THE_WARNINGS_OFF=0
+
CROSSROOT=/pi-root
# uncomment the line below if you want to build vomp application without a reboot option, automatically set for windows!
endif
-
-
+ifeq ($(ALL_THE_WARNINGS_OFF),1)
+CXXFLAGS_DEV = $(DEFINES) -DDEV -g -O0 -std=c++14 -Wno-deprecated $(CXXFLAGS_EXTRA) $(INCLUDES)
+else
CXXFLAGS_DEV = $(DEFINES) -DDEV -g -O0 -Wall -Wextra -Wshadow -Werror=return-type -Wmissing-format-attribute -Wdisabled-optimization -Wmissing-declarations -Wmissing-noreturn -Winit-self -Woverloaded-virtual -Wold-style-cast -Wconversion -std=c++14 $(CXXFLAGS_EXTRA) $(INCLUDES)
-#CXXFLAGS_DEV = $(DEFINES) -DDEV -g -O0 -std=c++14 $(CXXFLAGS_EXTRA) $(INCLUDES)
+endif
+
CXXFLAGS_REL = $(DEFINES) -O3 -Wall -Werror -std=c++14 $(CXXFLAGS_EXTRA) $(INCLUDES)
.PHONY: clean fresh all install strip
int retVal2 = 0;
int i;
+ LogNT::getInstance()->debug(TAG, "handle command {}", command);
+
if (command != Input::NA_NONE)
{
// handle command return values
for (i=numBoxes-1; i>=0; i--)
{
- // LogNT::getInstance()->debug(TAG, "Giving command to i={}", i);
+ LogNT::getInstance()->debug(TAG, "Giving command to i={}", i);
retVal = boxes[i]->handleCommand(command);
if (retVal == 1)
{
void BoxStack::processMessage(Message* m)
{
- if ((m->p_to != Message::BOXSTACK) && (m->to != this))
- {
- for (int i = numBoxes-1; i >= 0; i--)
- {
- if (boxes[i] == m->to)
- {
- LogNT::getInstance()->debug(TAG, "sending message {} from {} to {}", m->message, (void*)m->from, (void*)m->to);
- boxes[i]->processMessage(m);
- return;
- }
- }
- return;
- }
-
- // Handle mouse events
- // They just need to be delivered to top box
if (m->p_to == Message::MOUSE_RECEIVER)
{
+ // Handle mouse events
+ // They just need to be delivered to top box
if (numBoxes > 1) boxes[numBoxes-1]->processMessage(m);
return;
}
-
- LogNT::getInstance()->debug(TAG, "it's for meeee!");
-
- switch(m->message)
+ else if (m->p_to == Message::BOXSTACK)
{
- case Message::CLOSE_ME:
+ switch(m->message)
{
- remove(static_cast<Boxx*>(m->from));
- break;
- }
- case Message::ADD_VIEW:
- {
- Boxx* toAdd = reinterpret_cast<Boxx*>(m->data);
- add(toAdd);
- toAdd->draw();
- update(toAdd);
- break;
+ case Message::CLOSE_ME:
+ {
+ remove(static_cast<Boxx*>(m->from));
+ break;
+ }
+ case Message::ADD_VIEW:
+ {
+ Boxx* toAdd = reinterpret_cast<Boxx*>(m->data);
+ add(toAdd);
+ toAdd->draw();
+ update(toAdd);
+ break;
+ }
}
}
}
#include "boxx.h"
#include "region.h"
-#include "message.h"
+#include "messagequeue.h"
#include "video.h"
-
-
typedef std::list<Region> RegionList;
typedef std::stack<std::pair<Boxx*,VideoDisplay> > VideoDisplayStack;
-class BoxStack
+class BoxStack : public MessageReceiver
{
public:
BoxStack();
void Control::run()
{
if (!initted) return;
- irun = true;
// just in case
Video::getInstance()->signalOn();
vconnect->run();
}
- std::unique_lock<std::mutex> lockWrapper(messageQueueMutex); // locks. unlocks on out-of-scope
-
inputMan->start();
- while(irun)
- {
- messageQueueCond.wait(lockWrapper, [&] { return !irun || !messages.empty(); });
- logger->debug(TAG, "woke");
-
- if (!irun) break;
-
- while(!messages.empty())
- {
- Message* m = messages.front();
- messages.pop_front();
-
- lockWrapper.unlock();
-
- processMessage(m);
- delete m;
-
- lockWrapper.lock();
- }
- }
+ messageLoopRun = true;
+ messageLoop();
inputMan->stop();
delete wallpaper_pict; wallpaper_pict = NULL; wallpaper = NULL;
}
-void Control::processMessage(Message* m)
+void Control::dispatchMessage(Message* m)
{
logger->debug(TAG, "processing message {}", m->message);
{
case Message::SHUTDOWN:
{
- irun = false;
+ messageLoopRun = false;
break;
}
case Message::STOP_PLAYBACK:
}
}
}
- else
+ else if (m->p_to == Message::BOXSTACK)
{
- /* FIXME
-
- Instead of sending through the boxstack, implement a more generic MessageReceiver interface
- and have potential receivers register with something
- When a message needs to be delivered, check if the receiver is still registered, if so, deliver the message
- This could all be done using the existing big control mutex to keep it simple
- */
-
- logger->debug(TAG, "Sending message to boxstack");
boxstack->processMessage(m);
}
+ else if (m->p_to == Message::MOUSE_RECEIVER)
+ {
+ logger->debug(TAG, "Sending mouse message to boxstack for dispatch");
+ boxstack->processMessage(m);
+ }
+
+ else
+ {
+ m->to->processMessage(m);
+ }
+
+ logger->debug(TAG, "done processing message {}", m->message);
}
void Control::handleCommand(int button)
LogNT* logger;
bool initted{};
- bool irun{};
bool isStandby{};
bool firstBoot{true};
Boxx* wallpaper{};
bool advMenus{};
ASLPrefList langcodes;
- void processMessage(Message* m);
+ void dispatchMessage(Message* m);
};
#endif
Message* m = new Message();
m->message = Message::INPUT_EVENT;
m->p_to = Message::CONTROL;
- m->from = this;
+ m->from = NULL;
m->parameter = key;
MessageQueue::getInstance()->postMessage(m);
}
virtual bool loadOptionsFromServer(VDR* vdr);
virtual bool saveOptionstoServer();
+ static void sendInputKey(int key);
+
void setHWCtoCommand(HWC_TYPE hcw, UCHAR command);
void unsetHWC(HWC_TYPE hcw);
void LoadKeysConfig(VDR* vdr, const char* keynum);
virtual UCHAR TranslateHWCFixed(HWC_TYPE code) = 0;
UCHAR TranslateHWCList(HWC_TYPE code);
UCHAR TranslateHWC(HWC_TYPE code);
-
- void sendInputKey(int key);
};
#endif
#include "defines.h"
+class MessageReceiver;
+
class Message
{
public:
void* from{};
PreDefinedTarget p_to{NA}; // If this is set 'to' is ignored
- void* to{};
+ MessageReceiver* to{};
int message{};
ULONG parameter{};
ULONG tag{}; // use this for identifying which object / question is being replied to
along with VOMP. If not, see <https://www.gnu.org/licenses/>.
*/
+#include <algorithm>
+
#include "messagequeue.h"
#include "message.h"
MessageQueue* MessageQueue::instance{};
-MessageQueue::MessageQueue() { instance = this; }
+MessageQueue::MessageQueue()
+{
+ instance = this;
+ logger = LogNT::getInstance();
+}
MessageQueue::~MessageQueue() { instance = NULL; }
for (auto m : messages) delete m;
messages.clear();
}
+
+bool MessageQueue::receiverExists(MessageReceiver* mr) // call with lock..
+{
+ ReceiversI ri = std::find(receivers.begin(), receivers.end(), mr);
+ return (ri != receivers.end());
+}
+
+void MessageQueue::addReceiver(MessageReceiver* newMR)
+{
+ std::lock_guard<std::mutex> lg(messageQueueMutex);
+
+ if (std::find(receivers.begin(), receivers.end(), newMR) == receivers.end())
+ {
+ logger->debug(TAG, "addReceiver: not found, adding {}", (void*)newMR);
+ receivers.push_back(newMR);
+ }
+}
+
+void MessageQueue::removeReceiver(MessageReceiver* toRemove)
+{
+ std::unique_lock<std::mutex> ul(messageQueueMutex);
+
+ // Ignore the issue of the pre-defined targets
+ // They outlive the message queue processing loop and therefore always exist
+ // So just check message->to
+
+ while(1)
+ {
+ logger->debug(TAG, "Attempt remove receiver {}", (void*)toRemove);
+
+ if (messageBeingProcessed && (messageBeingProcessed->to == toRemove))
+ {
+ // The message currently being processed by Control is with the receiver we're trying to remove
+ // Release mutex, delay and retry
+ logger->info(TAG, "Remove delay! Does this ever happen? {}", (void*)toRemove);
+
+ ul.unlock();
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ continue;
+ }
+ else
+ {
+ ReceiversI toRemoveI = std::find(receivers.begin(), receivers.end(), toRemove);
+ if (toRemoveI == receivers.end())
+ {
+ logger->error(TAG, "Remove error 1 {}", (void*)toRemove);
+ return;
+ }
+
+ receivers.erase(toRemoveI);
+ logger->debug(TAG, "Removed receiver {}", (void*)toRemove);
+ break;
+ }
+ }
+}
+
+void MessageQueue::messageLoop()
+{
+ std::unique_lock<std::mutex> lockWrapper(messageQueueMutex); // locks. unlocks on out-of-scope
+
+ while(messageLoopRun)
+ {
+ messageQueueCond.wait(lockWrapper, [&] { return !messageLoopRun || !messages.empty(); });
+ // locked
+ logger->debug(TAG, "woke");
+
+ if (!messageLoopRun) break;
+
+ while(!messages.empty())
+ {
+ messageBeingProcessed = messages.front();
+ messages.pop_front();
+
+ if (!messageBeingProcessed->p_to && !receiverExists(messageBeingProcessed->to))
+ {
+ // Receiver for this message has been deleted already
+ logger->debug(TAG, "Dropping message {} for non-existent receiver {}", (void*)messageBeingProcessed, (void*)messageBeingProcessed->to);
+ delete messageBeingProcessed;
+ messageBeingProcessed = NULL;
+ continue;
+ }
+
+ logger->debug(TAG, "Dispatching message {} to {}", (void*)messageBeingProcessed, (void*)messageBeingProcessed->to);
+
+ lockWrapper.unlock();
+ dispatchMessage(messageBeingProcessed);
+ lockWrapper.lock();
+
+ delete messageBeingProcessed;
+ messageBeingProcessed = NULL;
+ }
+ }
+}
#define MESSAGEQUEUE_H
#include <deque>
+#include <list>
#include <mutex>
#include <condition_variable>
-class Message;
+#include "message.h" // Allow user classes just to include messagequeue.h
+
+class LogNT;
typedef std::deque<Message*> MQueue;
typedef std::deque<Message*>::iterator MQueueI;
+// Implement this in any class wanting to receive Messages
+class MessageReceiver
+{
+ public:
+ virtual void processMessage(Message* m)=0;
+ // The implementing class must not call MessageQueue::removeReceiver() from within processMessage()
+ // Also, implementing class must be aware of not causing itself to be deleted during processMessage
+ // such as generating an input event which causes BoxStack to remove/delete the object
+ // This will cause the object's destructor to call removeReceiver()
+ // If in doubt, generate an input that goes in the MessageQueue, e.g. Input::sendInputKey().
+};
+
+typedef std::list<MessageReceiver*> Receivers;
+typedef std::list<MessageReceiver*>::iterator ReceiversI;
+
class MessageQueue
{
public:
MessageQueue();
virtual ~MessageQueue();
-
static MessageQueue* getInstance();
+ void addReceiver(MessageReceiver* newReceiver);
+ void removeReceiver(MessageReceiver* toRemove);
+
virtual void postMessage(Message* m);
protected:
+ void messageLoop();
+ bool messageLoopRun{};
virtual void flushMessageQueue();
- virtual void processMessage(Message* m)=0;
+ virtual void dispatchMessage(Message* m)=0; // User class must implement and handle the message
+
+ bool receiverExists(MessageReceiver*);
MQueue messages;
- std::mutex messageQueueMutex;
- std::condition_variable messageQueueCond;
+ Receivers receivers;
+
+ std::mutex messageQueueMutex;
private:
static MessageQueue* instance;
+ LogNT* logger{};
+
+ Message* messageBeingProcessed{};
+ std::condition_variable messageQueueCond;
};
#endif
// ----------------------------------- Called from outside, one offs or info funcs
-PlayerRadioLive::PlayerRadioLive(MessageQueue* tmessageQueue, void* tmessageReceiver, ChannelList* tchanList)
+PlayerRadioLive::PlayerRadioLive(MessageQueue* tmessageQueue, MessageReceiver* tmessageReceiver, ChannelList* tchanList)
: messageQueue(tmessageQueue), messageReceiver(tmessageReceiver), afeed(this), chanList(tchanList)
{
audio = Audio::getInstance();
#include "vdr.h"
class MessageQueue;
+class MessageReceiver;
class Audio;
class LogNT;
class DemuxerTS;
class PlayerRadioLive : public PlayerLive, public Callback, public StreamReceiver
{
public:
- PlayerRadioLive(MessageQueue* messageQueue, void* messageReceiver, ChannelList* chanList);
+ PlayerRadioLive(MessageQueue* messageQueue, MessageReceiver* messageReceiver, ChannelList* chanList);
virtual ~PlayerRadioLive();
virtual int init();
private:
MessageQueue* messageQueue;
- void* messageReceiver;
+ MessageReceiver* messageReceiver;
LogNT* logger;
Audio* audio;
DemuxerTS* demuxer;
// ----------------------------------- Called from outside, one offs or info funcs
-PlayerRadioRec::PlayerRadioRec(MessageQueue* tmessageQueue, void* tmessageReceiver)
+PlayerRadioRec::PlayerRadioRec(MessageQueue* tmessageQueue, MessageReceiver* tmessageReceiver)
: messageQueue(tmessageQueue), messageReceiver(tmessageReceiver), afeed(this)
{
audio = Audio::getInstance();
class Demuxer;
class VDR;
class MessageQueue;
+class MessageReceiver;
/*
* Frames...
class PlayerRadioRec : public Callback
{
public:
- PlayerRadioRec(MessageQueue* messageQueue, void* messageReceiver);
+ PlayerRadioRec(MessageQueue* messageQueue, MessageReceiver* messageReceiver);
virtual ~PlayerRadioRec();
bool init(ULLONG lengthBytes, ULONG lengthFrames, bool IsPesRecording);
bool setLengthSeconds();
MessageQueue* messageQueue;
- void* messageReceiver;
+ MessageReceiver* messageReceiver;
LogNT* logger;
Audio* audio;
Demuxer* demuxer;
// ----------------------------------- Called from outside, one offs or info funcs
-PlayerVideoLive::PlayerVideoLive(MessageQueue* tmessageQueue, void* tmessageReceiver, OSDReceiver* tosdReceiver, ChannelList* tchanList)
+PlayerVideoLive::PlayerVideoLive(MessageQueue* tmessageQueue, MessageReceiver* tmessageReceiver, OSDReceiver* tosdReceiver, ChannelList* tchanList)
: vfeed(this), afeed(this), tfeed(this),
messageQueue(tmessageQueue), messageReceiver(tmessageReceiver), osdReceiver(tosdReceiver), chanList(tchanList)
{
#include "teletextdecodervbiebu.h"
class MessageQueue;
+class MessageReceiver;
class Audio;
class Video;
class LogNT;
class PlayerVideoLive : public PlayerLive, public Callback, public StreamReceiver
{
public:
- PlayerVideoLive(MessageQueue* messageQueue, void* messageReceiver, OSDReceiver* tosdReceiver, ChannelList* chanList);
+ PlayerVideoLive(MessageQueue* messageQueue, MessageReceiver* messageReceiver, OSDReceiver* tosdReceiver, ChannelList* chanList);
virtual ~PlayerVideoLive();
virtual int init();
AFeed afeed;
TFeed tfeed;
MessageQueue* messageQueue;
- void* messageReceiver;
+ MessageReceiver* messageReceiver;
OSDReceiver* osdReceiver;
ChannelList* chanList;
LogNT* logger;
// ----------------------------------- Called from outside, one offs or info funcs
-PlayerVideoRec::PlayerVideoRec(MessageQueue* tmessageQueue, void* tmessageReceiver, OSDReceiver* tosdReceiver)
+PlayerVideoRec::PlayerVideoRec(MessageQueue* tmessageQueue, MessageReceiver* tmessageReceiver, OSDReceiver* tosdReceiver)
: vfeed(this), afeed(this), tfeed(this),
osdReceiver(tosdReceiver), messageQueue(tmessageQueue), messageReceiver(tmessageReceiver)
{
#include "teletextdecodervbiebu.h"
class MessageQueue;
+class MessageReceiver;
class Audio;
class Video;
class VDR;
class PlayerVideoRec : public Callback
{
public:
- PlayerVideoRec(MessageQueue* messageQueue, void* messageReceiver, OSDReceiver* osdReceiver);
+ PlayerVideoRec(MessageQueue* messageQueue, MessageReceiver* messageReceiver, OSDReceiver* osdReceiver);
virtual ~PlayerVideoRec();
int init(bool p_isPesRecording,double framespersec);
TFeed tfeed;
OSDReceiver* osdReceiver;
MessageQueue* messageQueue;
- void* messageReceiver;
+ MessageReceiver* messageReceiver;
LogNT* logger;
Audio* audio;
Video* video;
if ( !renderfirstlineonly) {
Message* m= new Message();
m->message = Message::TELETEXTUPDATE;
- m->to = txtview;
+ m->to = (MessageReceiver*)txtview;
m->from = this;
m->parameter = 0;
MessageQueue::getInstance()->postMessage(m);
} else if (firstlineupdate==10) {
Message* m= new Message();
m->message = Message::TELETEXTUPDATEFIRSTLINE;
- m->to = txtview;
+ m->to = (MessageReceiver*)txtview;
m->from = this;
m->parameter = 0;
MessageQueue::getInstance()->postMessage(m);
#include "vaudioselector.h"
-VAudioSelector::VAudioSelector(void* tparent, bool* availableMpegAudioChannels,
+VAudioSelector::VAudioSelector(MessageReceiver* tparent, bool* availableMpegAudioChannels,
bool* availableAc3AudioChannels, int currentAudioChannel, bool* availableSubtitleChannels, int* ttxtpages,
int currentSubtitleChannel, int currentSubtitleType, RecInfo* recInfo)
: parent(tparent), liveMode(false)
}
}
}
+
+ MessageQueue::getInstance()->addReceiver(this);
}
-VAudioSelector::VAudioSelector(void* tparent, Channel* channel, int currentAudioChannel, int currentSubtitletype, int currentSubtitleChannel, int* ttxtpages)
+VAudioSelector::VAudioSelector(MessageReceiver* tparent, Channel* channel, int currentAudioChannel, int currentSubtitletype, int currentSubtitleChannel, int* ttxtpages)
: parent(tparent), liveMode(true)
{
UINT i;
ssl.addOption(sc.name.c_str(), &sc, selected);
}
}
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VAudioSelector::~VAudioSelector()
{
+ MessageQueue::getInstance()->removeReceiver(this);
+
Message* m = new Message();
m->from = this;
m->to = parent;
asl.setDarkSelOption(false);
asl.draw();
ssl.draw();
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (ssl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
asl.setDarkSelOption(true);
asl.draw();
ssl.draw();
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else
{
if (x < 0 || y < 0 || x > static_cast<int>(getWidth()) || y > static_cast<int>(getHeight()))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
}
#include <vector>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wselectlist.h"
class RecInfo;
typedef std::vector<AudioSubtitleChannel> AudioSubtitleChannelList;
-class VAudioSelector : public TBBoxx
+class VAudioSelector : public TBBoxx, public MessageReceiver
{
public:
- VAudioSelector(void* parent, bool* availableMpegAudioChannels, // Recording mode
+ VAudioSelector(MessageReceiver* parent, bool* availableMpegAudioChannels, // Recording mode
bool* availableAc3AudioChannels, int currentAudioChannel,
bool* availableSubtitleChannels,
int* ttxtpages,
int currentSubtitleChannel, int currentSubtitleType,
RecInfo* recInfo);
- VAudioSelector(void* tparent, Channel* channel, int currentAudioChannel,
+ VAudioSelector(MessageReceiver* tparent, Channel* channel, int currentAudioChannel,
int currentSubtitleChannel, int currentSubtitletype, int* ttxtpages); // Live mode
virtual ~VAudioSelector();
WSelectList asl;
WSelectList ssl;
- void* parent;
+ MessageReceiver* parent;
bool liveMode;
bool subtitles{};
bool editsubtitles{};
#include "vchannelselect.h"
#include "staticartwork.h"
+static const char* TAG = "VChannelList";
+
VChannelList::VChannelList(ULONG ttype)
{
boxstack = BoxStack::getInstance();
sl.setPosition(10, 30 + 5);
sl.setSize(area.w - 20, area.h - 30 - 15 - 30);
add(&sl);
+ MessageQueue::getInstance()->addReceiver(this);
}
VChannelList::~VChannelList()
{
+ MessageQueue::getInstance()->removeReceiver(this);
if (chanList)
{
{
if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- boxstack->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (coordsOutsideBox(m))
{
- boxstack->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
else if (m->message == Message::CHANNEL_CHANGE)
{
+ LogNT::getInstance()->debug(TAG, "Channel change {}", m->parameter);
Channel* chan = NULL;
for (UINT i = 0; i < chanList->size(); i++)
{
#include <vector>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "defines.h"
#include "vdr.h"
#include "wselectlist.h"
class Channel;
class BoxStack;
-class Message;
-class VChannelList : public TBBoxx
+class VChannelList : public TBBoxx, public MessageReceiver
{
public:
VChannelList(ULONG type);
// this class only works as it does because the remote command
// values for the numbers are the numbers themselves !
-VChannelSelect::VChannelSelect(Boxx* v)
+VChannelSelect::VChannelSelect(MessageReceiver* v)
{
parent = v;
numGot = 0;
#include "boxx.h"
#include "timers.h"
+class MessageReceiver;
+
class VChannelSelect : public Boxx, public TimerReceiver
{
public:
- VChannelSelect(Boxx* v);
+ VChannelSelect(MessageReceiver* v);
~VChannelSelect();
void draw();
void timercall(int clientReference);
private:
- Boxx* parent;
+ MessageReceiver* parent;
int input[10];
int numGot;
vgfactor=gfactor;
hasChanged=false;
Log::getInstance()->log("VColourTuner",Log::DEBUG,"created %p",this);
+ MessageQueue::getInstance()->addReceiver(this);
}
VColourTuner::~VColourTuner()
{
+ MessageQueue::getInstance()->removeReceiver(this);
Log::getInstance()->log("VColourTuner",Log::DEBUG,"deleted %p",this);
}
{
if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
else if (y>=(int)area.h-24 && y<=(int)area.h-6)
{
#include <algorithm>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wjpeg.h"
-class VColourTuner : public TBBoxx
+class VColourTuner : public TBBoxx, public MessageReceiver
{
public:
VColourTuner();
// Now numServers > 1
- VServerSelect* vs = new VServerSelect(vdpc, this); // deleted by handleCommand returning 4
+ VServerSelect* vs = new VServerSelect(vdpc, this); // deleted by handleCommand returning BoxStack::DELETE_ME
vs->draw();
boxstack->add(vs);
boxstack->update(vs);
#include <condition_variable>
#include "vinfo.h"
+#include "messagequeue.h"
#include "vdpc.h"
class LogNT;
class BoxStack;
-class Message;
class VDRServer;
class VConnect : public VInfo
~VConnect();
int handleCommand(int command);
- void processMessage(Message* m);
+ void processMessage(Message* m); // override
void draw();
void run();
VEpg* VEpg::instance = NULL;
-VEpg::VEpg(void* tparent, UINT tcurrentChannelIndex, ChannelList* tchanList)
+VEpg::VEpg(MessageReceiver* tparent, UINT tcurrentChannelIndex, ChannelList* tchanList)
{
instance = this;
currentChannelIndex = tcurrentChannelIndex;
vdisplay.y=10;
vdisplay.width=Video::getInstance()->getScreenWidth()/2;
vdisplay.height=Video::getInstance()->getScreenHeight()/2;
+
+ MessageQueue::getInstance()->addReceiver(this);
}
void VEpg::preDelete()
VEpg::~VEpg()
{
+ MessageQueue::getInstance()->removeReceiver(this);
instance = NULL;
{
if (chanListbox.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- boxstack->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else
{
if (x<0 || y <0 || x>(int)getWidth() || y>(int)getHeight())
{
- boxstack->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
else if (x>=(keyx+72) && y>=(keyy+4) &&x<=(keyx+72+104) &&y<=(keyy+4+getFontHeight() + 2))
{
}
else if (x>=(keyx+290) && y>=(keyy+4) &&x<=(keyx+180+290) &&y<=(keyy+4+getFontHeight() + 2))
{
- boxstack->handleCommand(Input::BACK);
+ Input::sendInputKey(Input::BACK);
}
else if (x>=(keyx+290) && y>=(keyy+ getFontHeight() + 8) &&x<=(keyx+290+180) &&y<=(keyy+8+2*getFontHeight() + 2))
{
#include <vector>
#include "boxx.h"
+#include "messagequeue.h"
#include "defines.h"
#include "timers.h"
#include "wtextbox.h"
#include "wselectlist.h"
#include "event.h"
-class Message;
class VVideoLive;
class BoxStack;
class VVideoLive;
-class VEpg : public Boxx, public TimerReceiver
+class VEpg : public Boxx, public MessageReceiver, public TimerReceiver
{
public:
- VEpg(void* parent, UINT currentChannel, ChannelList* tchanList);
+ VEpg(MessageReceiver* parent, UINT currentChannel, ChannelList* tchanList);
~VEpg();
static VEpg* getInstance();
void updateEventList();
void paintCell(Event* event, int yOffset, const DrawStyle& bg, const DrawStyle& fg);
time_t prevHour(time_t* t);
- void* parent;
+ MessageReceiver* parent;
BoxStack* boxstack;
UINT gridRows;
UINT currentChannelIndex;
static const char* TAG = "VEpgListAdvanced";
-VEpgListAdvanced::VEpgListAdvanced(VVideoLiveTV* tvideolive, ChannelList* tchanList, ULONG initialChannelNumber)
+VEpgListAdvanced::VEpgListAdvanced(MessageReceiver* tvideolive, ChannelList* tchanList, ULONG initialChannelNumber)
{
channelNumber = initialChannelNumber;
chanList = tchanList;
setButtonText();
updateEpgDataChannel();
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VEpgListAdvanced::~VEpgListAdvanced()
{
+ MessageQueue::getInstance()->removeReceiver(this);
clearEventList();
}
int y = m->tag - getScreenY();
if (sl.mouseLBDOWN(x, y))
{
- boxstack->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (boxRed.mouseLBDOWN(x, y))
{
}
else if (boxGreen.mouseLBDOWN(x, y))
{
- boxstack->handleCommand(Input::GREEN); // FIXME all these green? is this right?
+ boxstack->handleCommand(Input::GREEN); // FIXME FIXME FIXME all these green? is this right?
}
else if (boxYellow.mouseLBDOWN(x, y))
{
{
if (coordsOutsideBox(m))
{
- boxstack->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
}
#include <stack>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wtextbox.h"
#include "wselectlist.h"
#include "wtvmedia.h"
class BoxStack;
-class VVideoLiveTV;
-class VEpgListAdvanced : public TBBoxx
+class VEpgListAdvanced : public TBBoxx, public MessageReceiver
{
public:
- VEpgListAdvanced(VVideoLiveTV* tvideolive, ChannelList* tchanList, ULONG initialChannelNumber);
+ VEpgListAdvanced(MessageReceiver* tvideolive, ChannelList* tchanList, ULONG initialChannelNumber);
virtual ~VEpgListAdvanced();
void draw() { draw(false); }
ChannelList* chanList;
ULONG channelNumber;
- VVideoLiveTV* videolive;
+ MessageReceiver* videolive;
Boxx boxRed;
Boxx boxGreen;
logger->debug(TAG, "Time: {}", event->time);
logger->debug(TAG, "Duration: {}", event->duration);
logger->debug(TAG, "Channel: {}", channel->number);
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VEpgSetTimer::~VEpgSetTimer()
{
+ MessageQueue::getInstance()->removeReceiver(this);
}
char* VEpgSetTimer::genTimerString()
{
if (buttonYes.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- boxstack->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (buttonNo.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- boxstack->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (coordsOutsideBox(m))
{
- boxstack->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
}
#define VEPGSETTIMER_H
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wbutton.h"
class Event;
class Channel;
class LogNT;
class VDR;
-class Message;
class BoxStack;
-class VEpgSetTimer : public TBBoxx
+class VEpgSetTimer : public TBBoxx, public MessageReceiver
{
public:
VEpgSetTimer(Event* event, Channel* channel);
epgTVmedia.setVisible(false);
}
-
-
tabbar.activateFocus(true);
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VEpgSummary::~VEpgSummary()
{
+ MessageQueue::getInstance()->removeReceiver(this);
}
{
if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
}
#include <string.h>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wtvmedia.h"
#include "wtextbox.h"
#include "wtabbar.h"
#include "movieinfo.h"
#include "seriesinfo.h"
-class VRecordingList;
class Event;
-class Message;
class Channel;
-class VEpgSummary : public TBBoxx
+class VEpgSummary : public TBBoxx, public MessageReceiver
{
public:
VEpgSummary(Event* event, Channel* tchannel);
~VEpgSummary();
-
-
int handleCommand(int command);
void processMessage(Message* m);
setTitleBarOn(1);
setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VInfo::~VInfo()
{
+ MessageQueue::getInstance()->removeReceiver(this);
if (mainText) delete[] mainText;
}
{
if (m->message == Message::MOUSE_LBDOWN)
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
}
#include <string.h>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "defines.h"
#include "wbutton.h"
-class VInfo : public TBBoxx
+class VInfo : public TBBoxx, public MessageReceiver
{
public:
VInfo();
void okButton();
virtual int handleCommand(int command);
- void processMessage(Message* m);
+ virtual void processMessage(Message* m);
void draw();
protected:
#ifndef WIN32
LocalMediaFile::init();
#endif
+ MessageQueue::getInstance()->addReceiver(this);
}
VMediaList::~VMediaList()
{
+ MessageQueue::getInstance()->removeReceiver(this);
Log::getInstance()->log("VMediaList::~VMediaList", Log::DEBUG, "start");
Timers::getInstance()->cancelTimer(this,1);
Timers::getInstance()->cancelTimer(this,2);
if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
updateSelection();
- boxstack->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (coordsOutsideBox(m))
{
- boxstack->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
else if (m->message == Message::PLAYER_EVENT) {
#include <vector>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wselectlist.h"
#include "timers.h"
class DirList;
-class Message;
class BoxStack;
class Media;
class MediaList;
class VMediaView;
class MediaListHolder;
-class VMediaList : public TBBoxx , public TimerReceiver
+class VMediaList : public TBBoxx , public TimerReceiver, public MessageReceiver
{
public:
VMediaList();
retriggerAudioInfo=false;
audioBanner=NULL;
drawingThread=new DrawingThread(this);
+ MessageQueue::getInstance()->addReceiver(this);
}
VMediaView::~VMediaView()
{
+ MessageQueue::getInstance()->removeReceiver(this);
Log::getInstance()->log("VMediaView::~VMediaView", Log::DEBUG, "p=%p,secondSfc=%s", this,(secondSurface()?"true":"false"));
destroyPictureBanner();
if (currentPicture) delete currentPicture;
{
if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
else if (m->message = Message::PLAYER_EVENT) {
#define VMEDIAVIEW_H
#include "boxx.h"
+#include "messagequeue.h"
#include "timers.h"
#include "vmedialist.h"
#include "colour.h"
#include "imagereader.h"
#define TESTCOLOURS
-class Message;
class VInfo;
class AudioPlayer;
class DrawingThread;
class MediaOptions;
class VPreader;
-class VMediaView : public Boxx, public TimerReceiver
+class VMediaView : public Boxx, public TimerReceiver, public MessageReceiver
{
friend class VPReader;
public:
InputMan::getInstance()->addOptionsToPanes(2,&options,wop);
Video::getInstance()->addOptionsToPanes(2,&options,wop);
Audio::getInstance()->addOptionsToPanes(2,&options,wop);
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VOpts::~VOpts()
{
- // for (int i = 0; i < numPanes; i++) delete panes[i]; //Move to TabBar, Marten
+ MessageQueue::getInstance()->removeReceiver(this);
+
+ // for (int i = 0; i < numPanes; i++) delete panes[i]; //Move to TabBar, Marten
delete[] panes;
for(std::vector<Option*>::iterator j = options.begin(); j != options.end(); j++) delete *j;
}
else if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
}
#include <vector>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wtabbar.h"
#include "i18n.h"
#include "option.h"
class Boxx;
-class Message;
-class VOpts : public TBBoxx
+class VOpts : public TBBoxx, public MessageReceiver
{
public:
VOpts();
//TODO compute sizes from text
rotsize=70;
infsize=50;
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VPictureBanner::~VPictureBanner()
{
+ MessageQueue::getInstance()->removeReceiver(this);
LogNT::getInstance()->debug("VPictureBanner", "deleted {}", (void*)this);
}
if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
else if (y >= (static_cast<int>(area.h) - 24) && y <= static_cast<int>(area.h) - 6)
{
#include <algorithm>
#include "tbboxx.h"
+#include "messagequeue.h"
class VPicture;
-class VPictureBanner : public TBBoxx
+class VPictureBanner : public TBBoxx, public MessageReceiver
{
public:
VPictureBanner(bool shortInfo, bool slideshow);
#include "i18n.h"
#include "messagequeue.h"
-VQuestion::VQuestion(void* treplyTo)
+VQuestion::VQuestion(MessageReceiver* treplyTo)
+: replyTo(treplyTo)
{
- replyTo = treplyTo;
- mainText = NULL;
- selectedOption = NO;
-
buttonYes.setPosition(40, 130);
buttonNo.setPosition(140, 130);
add(&buttonYes);
add(&buttonNo);
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VQuestion::~VQuestion()
{
+ MessageQueue::getInstance()->removeReceiver(this);
if (mainText) delete[] mainText;
}
{
if (buttonYes.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (buttonNo.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
}
#include <string.h>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wbutton.h"
-class VQuestion : public TBBoxx
+class VQuestion : public TBBoxx, public MessageReceiver
{
public:
- VQuestion(void* replyTo);
+ VQuestion(MessageReceiver* replyTo);
~VQuestion();
void setDefault(UCHAR option);
void setMainText(const char* title);
const static UCHAR YES = 1;
private:
- void* replyTo;
- char* mainText;
+ MessageReceiver* replyTo;
+ char* mainText{};
void swap();
- UCHAR selectedOption;
+ UCHAR selectedOption{NO};
WButton buttonYes;
WButton buttonNo;
barBlue.set(0, 0, 0, 128);
barShowing = false;
+
+ MessageQueue::getInstance()->addReceiver(this);
}
void VRadioRec::preDelete()
VRadioRec::~VRadioRec()
{
- if (playing) stopPlay();
+ MessageQueue::getInstance()->removeReceiver(this);
+ if (playing) stopPlay();
// kill recInfo in case resumePoint has changed (likely)
myRec->dropRecInfo();
#define VRADIOREC_H
#include "boxx.h"
+#include "messagequeue.h"
#include "timers.h"
#include "defines.h"
#include "colour.h"
#include "region.h"
class Recording;
-class Message;
class VDR;
class Video;
class PlayerRadioRec;
class BoxStack;
-class VRadioRec : public Boxx, public TimerReceiver
+class VRadioRec : public Boxx, public MessageReceiver, public TimerReceiver
{
public:
VRadioRec(Recording* rec);
Directory* dir = recman->getRootDir();
sl.addOption("/", dir, 1);
addDirs(dir, "");
+ MessageQueue::getInstance()->addReceiver(this);
}
VRecMove::~VRecMove()
{
+ MessageQueue::getInstance()->removeReceiver(this);
}
-void VRecMove::setParent(void* tparent)
+void VRecMove::setParent(MessageReceiver* tparent)
{
parent = tparent;
}
{
if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
}
#include <string.h>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wselectlist.h"
class RecMan;
class Directory;
-class Message;
-class VRecMove : public TBBoxx
+class VRecMove : public TBBoxx, public MessageReceiver
{
public:
VRecMove(RecMan* recman);
~VRecMove();
- void setParent(void* parent);
+ void setParent(MessageReceiver* parent);
int handleCommand(int command);
void draw();
void processMessage(Message* m);
private:
- void* parent;
+ MessageReceiver* parent;
RecMan* recman;
WSelectList sl;
void addDirs(Directory* dir,const char* prefix);
button[selected].setActive(1);
tabbar.activateFocus(false);
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VRecording::~VRecording()
{
+ MessageQueue::getInstance()->removeReceiver(this);
}
-void VRecording::setParent(VRecordingList* tvRecList)
+void VRecording::setParent(MessageReceiver* tvRecList)
{
vRecList = tvRecList;
}
{
if (button[i].mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
buttons = true;
cancel = false;
break;
{
if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
}
#include <string.h>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wbutton.h"
#include "wtextbox.h"
#include "wtabbar.h"
-class VRecordingList;
class RecMan;
class Recording;
-class Message;
-class VRecording : public TBBoxx
+class VRecording : public TBBoxx, public MessageReceiver
{
public:
VRecording(RecMan* recman, Recording* rec);
~VRecording();
- void setParent(VRecordingList* tvRecList);
+ void setParent(MessageReceiver* tvRecList);
void draw();
private:
RecMan* recman;
- VRecordingList* vRecList;
+ MessageReceiver* vRecList;
Recording* rec;
WTabBar tabbar;
WTextbox* epgSummaryTextBox;
boxstack = BoxStack::getInstance();
recman = NULL;
loading = true;
-
+ MessageQueue::getInstance()->addReceiver(this);
}
VRecordingList::~VRecordingList()
{
+ MessageQueue::getInstance()->removeReceiver(this);
delete recman;
}
{
if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- boxstack->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (coordsOutsideBox(m))
{
- boxstack->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
else if (m->message == Message::DELETE_SELECTED_RECORDING)
#include <stack>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wselectlist.h"
-class Message;
class BoxStack;
class RecMan;
class Directory;
class Recording;
-class VRecordingList : public TBBoxx
+class VRecordingList : public TBBoxx, public MessageReceiver
{
public:
VRecordingList();
#include "vrecmove.h"
#include "boxstack.h"
#include "recman.h"
-#include "vrecordinglist.h"
#include "recording.h"
#include "message.h"
sl.addOption(tr("Move"), reinterpret_cast<void*>(4), 0);
sl.addOption(tr("Delete"), reinterpret_cast<void*>(5), 0);
add(&sl);
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VRecordingMenu::~VRecordingMenu()
{
+ MessageQueue::getInstance()->removeReceiver(this);
}
-void VRecordingMenu::setParent(VRecordingList* tvRecList)
+void VRecordingMenu::setParent(MessageReceiver* tvRecList)
{
vRecList = tvRecList;
}
{
if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
else if (m->message == Message::QUESTION_YES)
#include <string.h>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wselectlist.h"
-class VRecordingList;
class RecMan;
class Recording;
-class Message;
-class VRecordingMenu : public TBBoxx
+class VRecordingMenu : public TBBoxx, public MessageReceiver
{
public:
VRecordingMenu(RecMan* recman);
~VRecordingMenu();
- void setParent(VRecordingList* tvRecList);
+ void setParent(MessageReceiver* tvRecList);
void setRecording(Recording* rec);
int handleCommand(int command);
private:
RecMan* recman;
WSelectList sl;
- VRecordingList* vRecList;
+ MessageReceiver* vRecList;
Recording* rec;
};
#include "vserverselect.h"
-VServerSelect::VServerSelect(const VDPC& servers, void* treplyTo)
+VServerSelect::VServerSelect(const VDPC& servers, MessageReceiver* treplyTo)
{
setSize(300, 200);
createBuffer();
}
replyTo = treplyTo;
+ MessageQueue::getInstance()->addReceiver(this);
}
VServerSelect::~VServerSelect()
{
+ MessageQueue::getInstance()->removeReceiver(this);
}
void VServerSelect::draw()
{
if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ // FIXME - this probably also breaks
+ Input::sendInputKey(Input::OK);
}
}
}
#define VSERVERSELECT_H
#include "tbboxx.h"
+#include "messagequeue.h"
#include "vdpc.h"
#include "wselectlist.h"
-class Message;
-
-class VServerSelect : public TBBoxx
+class VServerSelect : public TBBoxx, public MessageReceiver
{
public:
- VServerSelect(const VDPC&, void* replyTo);
+ VServerSelect(const VDPC&, MessageReceiver* replyTo);
~VServerSelect();
int handleCommand(int command);
private:
WSelectList sl;
- void* replyTo;
+ MessageReceiver* replyTo;
};
#endif
createBuffer();
keyindigit = 1;
page = 0x100;
+
+ MessageQueue::getInstance()->addReceiver(this);
}
VTeletextView::~VTeletextView()
{
+ MessageQueue::getInstance()->removeReceiver(this);
LogNT::getInstance()->debug("VTeletextView", "destruct");
pv->draw();
BoxStack::getInstance()->update(pv);
#define VTELETEXTVIEW_H
#include "boxx.h"
-
+#include "messagequeue.h"
#include "teletextdecodervbiebu.h"
class PlayerVideoLive;
-class VTeletextView : public Boxx
+class VTeletextView : public Boxx, public MessageReceiver
{
public:
VTeletextView(TeletextDecoderVBIEBU* TTdecoder, Boxx* playerview, PlayerVideoLive* palyerObj);
-
/*
Copyright 2004-2005 Chris Tallon
TVMediaInfo *info= new TVMediaInfo();
info->setStaticArtwork(sa_timers);
setTitleBarIcon(info);
+ MessageQueue::getInstance()->addReceiver(this);
}
VTimerEdit::~VTimerEdit()
{
+ MessageQueue::getInstance()->removeReceiver(this);
}
-void VTimerEdit::setParent(VTimerList* tvTimerList)
+void VTimerEdit::setParent(MessageReceiver* tvTimerList)
{
vTimerList = tvTimerList;
}
} else if (m->message == Message::MOUSE_LBDOWN)
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (m->message == Message::QUESTION_YES)
{
#include <string.h>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "wbutton.h"
-class VTimerList;
class RecTimer;
-class Message;
-class VTimerEdit : public TBBoxx
+class VTimerEdit : public TBBoxx, public MessageReceiver
{
public:
VTimerEdit(RecTimer* rt);
void draw();
int handleCommand(int command);
void processMessage(Message* m);
- void setParent(VTimerList* tvTimerList);
+ void setParent(MessageReceiver* tvTimerList);
private:
void swap();
RecTimer* recTimer;
- VTimerList* vTimerList;
+ MessageReceiver* vTimerList;
WButton buttonBack;
WButton buttonDelete;
UINT selectedButton;
sl.setPosition(30, 30 + 5);
sl.setSize(area.w - 40, area.h - 30 - 15 - 30);
add(&sl);
+
+ MessageQueue::getInstance()->addReceiver(this);
}
void VTimerList::preDelete()
VTimerList::~VTimerList()
{
+ MessageQueue::getInstance()->removeReceiver(this);
+
if (recTimerList)
{
for (UINT i = 0; i < recTimerList->size(); i++)
{
if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
else if (coordsOutsideBox(m))
{
- BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+ Input::sendInputKey(Input::BACK);
}
}
else if (m->message == Message::DELETE_SELECTED_TIMER)
#include "vdr.h"
#include "tbboxx.h"
#include "timers.h"
+#include "messagequeue.h"
#include "wselectlist.h"
#include "region.h"
-class Message;
-
-class VTimerList : public TBBoxx, public TimerReceiver
+class VTimerList : public TBBoxx, public TimerReceiver, public MessageReceiver
{
public:
VTimerList();
vdisplay.y = 0;
vdisplay.width = 0;
vdisplay.height = 0;
+
+ MessageQueue::getInstance()->addReceiver(this);
}
void VVideoLiveTV::preDelete()
VVideoLiveTV::~VVideoLiveTV()
{
+ MessageQueue::getInstance()->removeReceiver(this);
delete player;
video->setDefaultAspect();
delData();
#include <vector>
#include <math.h>
+#include "messagequeue.h"
#include "boxx.h"
#include "region.h"
#include "vdr.h"
class VAudioSelector;
class Bitmap;
-class VVideoLiveTV : public Boxx, public TimerReceiver, public OSDReceiver
+class VVideoLiveTV : public Boxx, public MessageReceiver, public TimerReceiver, public OSDReceiver
{
public:
VVideoLiveTV(ChannelList* chanList, ULONG initialChannelNumber, VChannelList* vchannelList);
wssRegion.w = video->getScreenWidth();
wssRegion.h = 300;
}
+ MessageQueue::getInstance()->addReceiver(this);
}
VVideoMedia::~VVideoMedia()
{
+ MessageQueue::getInstance()->removeReceiver(this);
Log::getInstance()->log("VVideoMedia", Log::DEBUG, "Entering destructor");
if (vas)
if (!barShowing)
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate rok press
+ Input::sendInputKey(Input::OK);
}
else if (barRegion.x<=x && barRegion.y<=y && (barRegion.x+barRegion.w)>=x && (barRegion.y+barRegion.h)>=y)
{
}
else
{
- BoxStack::getInstance()->handleCommand(Input::OK); //simulate rok press
+ Input::sendInputKey(Input::OK);
}
}
else if (m->message == Message::PLAYER_EVENT)
#include <stdio.h>
#include "boxx.h"
+#include "messagequeue.h"
#include "timers.h"
#include "wwss.h"
#include "region.h"
class PlayerMedia;
class Recording;
class VAudioSelector;
-class Message;
class BoxStack;
class VInfo;
class Media;
class VMediaList;
-
-class VVideoMedia : public Boxx, public TimerReceiver
+class VVideoMedia : public Boxx, public TimerReceiver, public MessageReceiver
{
public:
VVideoMedia(Media* myMedia,VMediaList *lparent); //media has to contain URI
void timercall(int clientReference);
void processMessage(Message* m);
-
-
private:
BoxStack* boxstack;
Video* video;
#include <stdio.h>
#include "boxx.h"
+#include "messagequeue.h"
#include "timers.h"
#include "region.h"
#include "colour.h"
class PlayerVideoRec;
class Recording;
class VAudioSelector;
-class Message;
class BoxStack;
class VInfo;
class Bitmap;
//#include "vepg.h" // for testing EPG in NTSC with a NTSC test video
-class VVideoRec : public Boxx, public TimerReceiver, public OSDReceiver
+class VVideoRec : public Boxx, public MessageReceiver, public TimerReceiver, public OSDReceiver
{
public:
VVideoRec(Recording* rec, bool ish264);
sl.addOption(tr("7. Exit"), reinterpret_cast<void*>(7), 0,info);
#endif
-
+ MessageQueue::getInstance()->addReceiver(this);
}
void VWelcome::preDelete()
VWelcome::~VWelcome()
{
+ MessageQueue::getInstance()->removeReceiver(this);
}
void VWelcome::draw()
{
if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
{
- boxstack->handleCommand(Input::OK); //simulate OK press
+ Input::sendInputKey(Input::OK);
}
}
}
#include <string.h>
#include "tbboxx.h"
+#include "messagequeue.h"
#include "timers.h"
#include "wselectlist.h"
#ifndef GRADIENT_DRAWING
#include "region.h"
#include "defines.h"
-class Message;
class BoxStack;
-class VWelcome : public TBBoxx, public TimerReceiver
+class VWelcome : public TBBoxx, public TimerReceiver, public MessageReceiver
{
public:
VWelcome();