]> git.vomp.tv Git - vompclient.git/commitdiff
Restructure messages to go direct to target rather than through BoxStack
authorChris Tallon <chris@vomp.tv>
Sat, 25 Sep 2021 15:42:47 +0000 (16:42 +0100)
committerChris Tallon <chris@vomp.tv>
Sat, 25 Sep 2021 15:42:47 +0000 (16:42 +0100)
74 files changed:
GNUmakefile
boxstack.cc
boxstack.h
control.cc
control.h
input.cc
input.h
message.h
messagequeue.cc
messagequeue.h
playerradiolive.cc
playerradiolive.h
playerradiorec.cc
playerradiorec.h
playervideolive.cc
playervideolive.h
playervideorec.cc
playervideorec.h
teletextdecodervbiebu.cc
vaudioselector.cc
vaudioselector.h
vchannellist.cc
vchannellist.h
vchannelselect.cc
vchannelselect.h
vcolourtuner.cc
vcolourtuner.h
vconnect.cc
vconnect.h
vepg.cc
vepg.h
vepglistadvanced.cc
vepglistadvanced.h
vepgsettimer.cc
vepgsettimer.h
vepgsummary.cc
vepgsummary.h
vinfo.cc
vinfo.h
vmedialist.cc
vmedialist.h
vmediaview.cc
vmediaview.h
vopts.cc
vopts.h
vpicturebanner.cc
vpicturebanner.h
vquestion.cc
vquestion.h
vradiorec.cc
vradiorec.h
vrecmove.cc
vrecmove.h
vrecording.cc
vrecording.h
vrecordinglist.cc
vrecordinglist.h
vrecordingmenu.cc
vrecordingmenu.h
vserverselect.cc
vserverselect.h
vteletextview.cc
vteletextview.h
vtimeredit.cc
vtimeredit.h
vtimerlist.cc
vtimerlist.h
vvideolivetv.cc
vvideolivetv.h
vvideomedia.cc
vvideomedia.h
vvideorec.h
vwelcome.cc
vwelcome.h

index c5cf6ab42ee6bd8ebf754465948a34981eaad4bf..37c7ae2258ef7234aaafaabf2bacdf92d42040c2 100644 (file)
@@ -15,6 +15,8 @@ vomp_platform=$(shell ./select-platform)
 
 $(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!
@@ -101,10 +103,12 @@ CXXFLAGS_EXTRA = $(SYSROOT) -Wno-psabi -mtune=cortex-a7 -mfloat-abi=hard -fopenm
 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
index c5d6d9c554752895564c914d180d5494b8003cf9..415fb4b6af15745df12af8ed545423da6dee6a3e 100644 (file)
@@ -496,6 +496,8 @@ int BoxStack::handleCommand(int command)
   int retVal2 = 0;
   int i;
 
+  LogNT::getInstance()->debug(TAG, "handle command {}", command);
+
   if (command != Input::NA_NONE)
   {
     // handle command return values
@@ -506,7 +508,7 @@ int BoxStack::handleCommand(int command)
 
     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)
       {
@@ -540,44 +542,30 @@ int BoxStack::handleCommand(int command)
 
 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;
+      }
     }
   }
 }
index fae2fd0145cc2121f0777246215e59c28ffc9d6c..e930c1d534cd28adf3206e7695b7bb9470df20c1 100644 (file)
 
 #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();
index 5bc2888e3d6c6235c61b995378e6a6f35807b9a8..c5ea16466dc69136e1d83a98cbe754ed62b5a7bb 100644 (file)
@@ -385,7 +385,6 @@ void Control::doWallpaper()
 void Control::run()
 {
   if (!initted) return;
-  irun = true;
 
   // just in case
   Video::getInstance()->signalOn();
@@ -404,30 +403,10 @@ void Control::run()
     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();
 
@@ -436,7 +415,7 @@ void Control::run()
   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);
 
@@ -446,7 +425,7 @@ void Control::processMessage(Message* m)
     {
       case Message::SHUTDOWN:
       {
-        irun = false;
+        messageLoopRun = false;
         break;
       }
       case Message::STOP_PLAYBACK:
@@ -523,19 +502,22 @@ void Control::processMessage(Message* m)
       }
     }
   }
-  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)
index 6bb6cae17ff6ff69a6e8066dc1e6a29120bdfabd..68ca368fa43410328bc6670c92687e5fa87a00ad 100644 (file)
--- a/control.h
+++ b/control.h
@@ -102,7 +102,6 @@ class Control : public MessageQueue
     LogNT* logger;
 
     bool initted{};
-    bool irun{};
     bool isStandby{};
     bool firstBoot{true};
     Boxx* wallpaper{};
@@ -113,7 +112,7 @@ class Control : public MessageQueue
     bool advMenus{};
     ASLPrefList langcodes;
         
-    void processMessage(Message* m);
+    void dispatchMessage(Message* m);
 };
 
 #endif
index dcc4413781d117aa437aa567f58d6551734d0836..92ea2cd3f2c6498998b9dd774b4a696ac9f6be24 100644 (file)
--- a/input.cc
+++ b/input.cc
@@ -150,7 +150,7 @@ void Input::sendInputKey(int key)
   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);
 }
diff --git a/input.h b/input.h
index 5b53613ec961b480625fec34152d5ceb05253809..74942fdaa1777711035eacd389bf89fef9f847b3 100644 (file)
--- a/input.h
+++ b/input.h
@@ -49,6 +49,8 @@ class Input: public AbstractOption
     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);
@@ -146,8 +148,6 @@ class Input: public AbstractOption
     virtual UCHAR TranslateHWCFixed(HWC_TYPE code) = 0;
     UCHAR TranslateHWCList(HWC_TYPE code);
     UCHAR TranslateHWC(HWC_TYPE code);
-
-    void sendInputKey(int key);
 };
 
 #endif
index 1b13703d8184c417df013c543363bd90a57b791d..4abaeb7888f64a87c930e6ae70d85effd9b71e6b 100644 (file)
--- a/message.h
+++ b/message.h
@@ -24,6 +24,8 @@
 
 #include "defines.h"
 
+class MessageReceiver;
+
 class Message
 {
   public:
@@ -42,7 +44,7 @@ class Message
 
     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
index 6bad8b4c2235be8a4a41e0e4bab583d9018e265d..51d67f2b198a0a0d0f6b98ea36426bcace4842d5 100644 (file)
@@ -17,6 +17,8 @@
     along with VOMP.  If not, see <https://www.gnu.org/licenses/>.
 */
 
+#include <algorithm>
+
 #include "messagequeue.h"
 
 #include "message.h"
@@ -26,7 +28,11 @@ static const char* TAG = "MessageQueue";
 
 MessageQueue* MessageQueue::instance{};
 
-MessageQueue::MessageQueue() { instance = this; }
+MessageQueue::MessageQueue()
+{
+  instance = this;
+  logger = LogNT::getInstance();
+}
 
 MessageQueue::~MessageQueue() { instance = NULL; }
 
@@ -49,3 +55,96 @@ void MessageQueue::flushMessageQueue()
   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;
+    }
+  }
+}
index 837d2a97864c3b4490b512ed8fadfe6573b82597..426244b0e4aefd60cd14805a9ecbe107e143e0d5 100644 (file)
 #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
index f0cf33c94f8b6e60f2d033c711aaef57262c44e0..af92f726483a7bb864f9d5334d7dd83cfec27cad 100644 (file)
@@ -40,7 +40,7 @@ static const char* TAG = "PlayerRadioLive";
 
 // ----------------------------------- 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();
index 6d38e42eb2fd6a16d4adc32e6a2ed735ed51718d..b2fa6e5747b9963e7c2b7e06254603e668821d54 100644 (file)
@@ -34,6 +34,7 @@
 #include "vdr.h"
 
 class MessageQueue;
+class MessageReceiver;
 class Audio;
 class LogNT;
 class DemuxerTS;
@@ -41,7 +42,7 @@ 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();
@@ -76,7 +77,7 @@ class PlayerRadioLive : public PlayerLive, public Callback, public StreamReceive
 
   private:
     MessageQueue* messageQueue;
-    void* messageReceiver;
+    MessageReceiver* messageReceiver;
     LogNT* logger;
     Audio* audio;
     DemuxerTS* demuxer;
index 905f8aa038f40460b08f3148eb646302fd1d81e4..a4f881bfc16c97e0699bcc731f5b45edb91eb2cd 100644 (file)
@@ -40,7 +40,7 @@ static const char* TAG = "PlayerRadioRec";
 
 // ----------------------------------- 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();
index 460290f73b2197685799fafd0c922266ca728c1d..53d3fd7d76de2a3c5ae577f6ff7c36367d7c1b9f 100644 (file)
@@ -34,6 +34,7 @@ class Video;
 class Demuxer;
 class VDR;
 class MessageQueue;
+class MessageReceiver;
 
 /*
  * Frames...
@@ -45,7 +46,7 @@ class MessageQueue;
 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);
@@ -87,7 +88,7 @@ class PlayerRadioRec : public Callback
     bool setLengthSeconds();
 
     MessageQueue* messageQueue;
-    void* messageReceiver;
+    MessageReceiver* messageReceiver;
     LogNT* logger;
     Audio* audio;
     Demuxer* demuxer;
index 0667fee7aa2057a81a59f20603c0519d44d72d2e..3a2e10e537fd4c3885a2e505752ae1a8308259d5 100644 (file)
@@ -44,7 +44,7 @@ static const char* TAG = "PlayerVideoLive";
 
 // ----------------------------------- 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)
 {
index 5b91f482cf35b3d61879e824e525cec820ae9c39..e2ada193344a22a927ac2cde9a6cbb8bd23c98fe 100644 (file)
@@ -38,6 +38,7 @@
 #include "teletextdecodervbiebu.h"
 
 class MessageQueue;
+class MessageReceiver;
 class Audio;
 class Video;
 class LogNT;
@@ -48,7 +49,7 @@ class DVBSubtitles;
 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();
@@ -92,7 +93,7 @@ class PlayerVideoLive : public PlayerLive, public Callback, public StreamReceive
     AFeed afeed;
     TFeed tfeed;
     MessageQueue* messageQueue;
-    void* messageReceiver;
+    MessageReceiver* messageReceiver;
     OSDReceiver* osdReceiver;
     ChannelList* chanList;
     LogNT* logger;
index 12ace2284930d60cc66f686312ffe5c53ccf6c7b..afcdac00e6ef214bde5915c75845ed3304efd580 100644 (file)
@@ -40,7 +40,7 @@ static const char* TAG = "PlayerVideoRec";
 
 // ----------------------------------- 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)
 {
index 5687ab56dc782b72b3a02f0f7433143909e1e5c9..100da8cf5766741cc687fc2893879ab1483ca3ee 100644 (file)
@@ -40,6 +40,7 @@
 #include "teletextdecodervbiebu.h"
 
 class MessageQueue;
+class MessageReceiver;
 class Audio;
 class Video;
 class VDR;
@@ -52,7 +53,7 @@ class Channel;
 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);
@@ -137,7 +138,7 @@ class PlayerVideoRec : public Callback
     TFeed tfeed;
     OSDReceiver* osdReceiver;
     MessageQueue* messageQueue;
-    void* messageReceiver;
+    MessageReceiver* messageReceiver;
     LogNT* logger;
     Audio* audio;
     Video* video;
index 5a91d51a9e57c3a02cc95e522ec79b974c4d2a0a..7d35b1f6355969fe450a370d9a500a1ea57a5251 100644 (file)
@@ -821,14 +821,14 @@ void TeletextDecoderVBIEBU::RenderTeletextCode(bool renderfirstlineonly) {
         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);
index 81e86a750d172457589df58ef089fbce1f0d6660..f4bae22cfb98816effdd8d57bf5e94e2e48d510c 100644 (file)
@@ -35,7 +35,7 @@
 
 #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)
@@ -265,9 +265,11 @@ VAudioSelector::VAudioSelector(void* tparent, bool* availableMpegAudioChannels,
       }
     }
   }
+
+  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;
@@ -382,10 +384,14 @@ VAudioSelector::VAudioSelector(void* tparent, Channel* channel, int currentAudio
       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;
@@ -591,7 +597,7 @@ void VAudioSelector::processMessage(Message* m)
       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()))
     {
@@ -600,7 +606,7 @@ void VAudioSelector::processMessage(Message* m)
       asl.setDarkSelOption(true);
       asl.draw();
       ssl.draw();
-      BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+      Input::sendInputKey(Input::OK);
     }
     else
     {
@@ -610,7 +616,7 @@ void VAudioSelector::processMessage(Message* m)
 
       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);
       }
     }
   }
index 8131190c6d303ef8511267d9d855b7e22dc3e0fe..4c9e8c14963bfe7422182c2b6208fae553a52132 100644 (file)
@@ -24,6 +24,7 @@
 #include <vector>
 
 #include "tbboxx.h"
+#include "messagequeue.h"
 #include "wselectlist.h"
 
 class RecInfo;
@@ -47,17 +48,17 @@ class AudioSubtitleChannel
 
 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();
@@ -70,7 +71,7 @@ class VAudioSelector : public TBBoxx
     WSelectList asl;
     WSelectList ssl;
 
-    void* parent;
+    MessageReceiver* parent;
     bool liveMode;
     bool subtitles{};
     bool editsubtitles{};
index a47ba45ff155735c7631cb57a241bde29fbb7e2b..ff504f48f62ceba5ba3bb78efe62ea8466bf63cf 100644 (file)
@@ -32,6 +32,8 @@
 #include "vchannelselect.h"
 #include "staticartwork.h"
 
+static const char* TAG = "VChannelList";
+
 VChannelList::VChannelList(ULONG ttype)
 {
   boxstack = BoxStack::getInstance();
@@ -69,10 +71,12 @@ VChannelList::VChannelList(ULONG ttype)
   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)
   {
@@ -290,15 +294,16 @@ void VChannelList::processMessage(Message* m)
   {
     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++)
     {
index cb54db38d7f978d24b4a594eddfc84ba20b6ef8d..c3a82b2cfdb58f45a9f528f09a944cd16acec343 100644 (file)
 #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);
index 50bb59bbb5872cc0e92821e654f8c9ca9612c5c3..5a51ed170b21a63d7421a452d9fa623c3635d5f9 100644 (file)
@@ -29,7 +29,7 @@
 // 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;
index 00b84a6dd52bd1dcc22e7a7da3c134078a4d60df..b04237f3b4e26a40be30047b409ae155777cec8b 100644 (file)
 #include "boxx.h"
 #include "timers.h"
 
+class MessageReceiver;
+
 class VChannelSelect : public Boxx, public TimerReceiver
 {
   public:
-    VChannelSelect(Boxx* v);
+    VChannelSelect(MessageReceiver* v);
     ~VChannelSelect();
 
     void draw();
@@ -37,7 +39,7 @@ class VChannelSelect : public Boxx, public TimerReceiver
     void timercall(int clientReference);
 
   private:
-    Boxx* parent;
+    MessageReceiver* parent;
 
     int input[10];
     int numGot;
index 2f3b0b02e09b71001ed52f4cf529f16ded6141fb..2bfd378716e40a268359cee75a43d903e59b4667 100644 (file)
@@ -51,10 +51,12 @@ VColourTuner::VColourTuner()
   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);
 }
 
@@ -221,7 +223,7 @@ void VColourTuner::processMessage(Message* m)
   {
     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)
     {
index 4a8c2612917fea89f68b292e435eb83c940e69e3..939416abe5afeeba7cce4fb9b4d5150421daede0 100644 (file)
 #include <algorithm>
 
 #include "tbboxx.h"
+#include "messagequeue.h"
 #include "wjpeg.h"
 
 
-class VColourTuner : public TBBoxx
+class VColourTuner : public TBBoxx, public MessageReceiver
 {
   public:
     VColourTuner();
index 26217604c9d784520e546c8fe2889dcb6158c08c..fc5018f812896bb31b06dd77154ab783796ebc1c 100644 (file)
@@ -207,7 +207,7 @@ void VConnect::threadMethod()
 
     // 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);
index dfa6b8c9030464fb452825b07ed741998d1eb3d1..39cc41eed0f5821e90c211a8826efaea71442cd0 100644 (file)
 #include <condition_variable>
 
 #include "vinfo.h"
+#include "messagequeue.h"
 #include "vdpc.h"
 
 class LogNT;
 class BoxStack;
-class Message;
 class VDRServer;
 
 class VConnect : public VInfo
@@ -39,7 +39,7 @@ class VConnect : public VInfo
     ~VConnect();
 
     int handleCommand(int command);
-    void processMessage(Message* m);
+    void processMessage(Message* m); // override
     void draw();
 
     void run();
diff --git a/vepg.cc b/vepg.cc
index a72f071a407cadb68291ff5c76e3c142776a2cd4..149d8948d132910ed4ca6da86a9233b04387e826 100644 (file)
--- a/vepg.cc
+++ b/vepg.cc
@@ -50,7 +50,7 @@ static const char* TAG = "VEpg";
 
 VEpg* VEpg::instance = NULL;
 
-VEpg::VEpg(void* tparent, UINT tcurrentChannelIndex, ChannelList* tchanList)
+VEpg::VEpg(MessageReceiver* tparent, UINT tcurrentChannelIndex, ChannelList* tchanList)
 {
   instance = this;
   currentChannelIndex = tcurrentChannelIndex;
@@ -181,6 +181,8 @@ VEpg::VEpg(void* tparent, UINT tcurrentChannelIndex, ChannelList* tchanList)
   vdisplay.y=10;
   vdisplay.width=Video::getInstance()->getScreenWidth()/2;
   vdisplay.height=Video::getInstance()->getScreenHeight()/2;
+
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 void VEpg::preDelete()
@@ -190,6 +192,7 @@ void VEpg::preDelete()
 
 VEpg::~VEpg()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
 
   instance = NULL;
 
@@ -771,7 +774,7 @@ void VEpg::processMessage(Message* m)
   {
     if (chanListbox.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
     {
-      boxstack->handleCommand(Input::OK); //simulate OK press
+      Input::sendInputKey(Input::OK);
     }
     else
     {
@@ -783,7 +786,7 @@ void VEpg::processMessage(Message* m)
 
       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))
       {
@@ -803,7 +806,7 @@ void VEpg::processMessage(Message* m)
       }
       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))
       {
diff --git a/vepg.h b/vepg.h
index 098e5d517c6519729322644d001481f001569ebd..c11c7164c3ef0da9063dbf1368a5783532c0dfff 100644 (file)
--- a/vepg.h
+++ b/vepg.h
@@ -23,6 +23,7 @@
 #include <vector>
 
 #include "boxx.h"
+#include "messagequeue.h"
 #include "defines.h"
 #include "timers.h"
 #include "wtextbox.h"
@@ -30,7 +31,6 @@
 #include "wselectlist.h"
 #include "event.h"
 
-class Message;
 class VVideoLive;
 class BoxStack;
 
@@ -39,10 +39,10 @@ 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();
 
@@ -80,7 +80,7 @@ class VEpg : public Boxx, public TimerReceiver
     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;
index ab558d0f57124b268af2915043688525584c63f4..e09c7fb151535da8b784dc44de4e4a4dff965818 100644 (file)
@@ -42,7 +42,7 @@
 
 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;
@@ -122,10 +122,13 @@ VEpgListAdvanced::VEpgListAdvanced(VVideoLiveTV* tvideolive, ChannelList* tchanL
   setButtonText();
 
   updateEpgDataChannel();
+
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 VEpgListAdvanced::~VEpgListAdvanced()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
   clearEventList();
 }
 
@@ -934,7 +937,7 @@ void VEpgListAdvanced::processMessage(Message* m)
     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))
     {
@@ -942,7 +945,7 @@ void VEpgListAdvanced::processMessage(Message* m)
     }
     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))
     {
@@ -956,7 +959,7 @@ void VEpgListAdvanced::processMessage(Message* m)
     {
       if (coordsOutsideBox(m))
       {
-        boxstack->handleCommand(Input::BACK); //simulate cancel press
+        Input::sendInputKey(Input::BACK);
       }
     }
   }
index 9f9ed5d1f5f5ef7512001e8939138642e7355c92..534a1b035a618895fa3d1418201d3cfc050667ac 100644 (file)
 #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); }
@@ -92,7 +92,7 @@ class VEpgListAdvanced : public TBBoxx
 
     ChannelList* chanList;
     ULONG channelNumber;
-    VVideoLiveTV* videolive;
+    MessageReceiver* videolive;
 
     Boxx boxRed;
     Boxx boxGreen;
index edac8a833c35943b22f1cda544d044b1bddf5bd3..15ffa4f74b9182ead1c010ba3e151c1f20fd15bc 100644 (file)
@@ -76,10 +76,13 @@ VEpgSetTimer::VEpgSetTimer(Event* tevent, Channel* tchannel)
   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()
@@ -307,15 +310,15 @@ void VEpgSetTimer::processMessage(Message* m)
   {
     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);
     }
   }
 }
index 3cf7fff27e44e265f2cdc22de017e71fdb27f744..2079b449f5163081e81d3537c0c35b5d8b6d137e 100644 (file)
 #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);
index a78ce88457d9806e474c4e7f5d566ff2aa20f760..6d61eecb6a1cc6328dc6376270e226eb40fc50b0 100644 (file)
@@ -152,13 +152,14 @@ VEpgSummary::VEpgSummary(Event *tevent, Channel* tchannel)
          epgTVmedia.setVisible(false);
   }
 
-
-
   tabbar.activateFocus(true);
+
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 VEpgSummary::~VEpgSummary()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
 }
 
 
@@ -232,7 +233,7 @@ void VEpgSummary::processMessage(Message* m)
                {
           if (coordsOutsideBox(m))
           {
-            BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+            Input::sendInputKey(Input::BACK);
           }
                }
        }
index e7145b008e0a34259e813633befa50e77c3b045e..1484d1715e265e39208ee623efa9a57732319e50 100644 (file)
 #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);
 
index 791b8206ecbbdd605fb40c1dd7d0c5bfe408af64..262b02344f53dcae800036c71a84359e7d41a835 100644 (file)
--- a/vinfo.cc
+++ b/vinfo.cc
@@ -33,10 +33,13 @@ VInfo::VInfo()
 
   setTitleBarOn(1);
   setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);
+
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 VInfo::~VInfo()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
   if (mainText) delete[] mainText;
 }
 
@@ -115,6 +118,6 @@ void VInfo::processMessage(Message* m)
 {
   if (m->message == Message::MOUSE_LBDOWN)
   {
-    BoxStack::getInstance()->handleCommand(Input::OK); //simulate OK press
+    Input::sendInputKey(Input::OK);
   }
 }
diff --git a/vinfo.h b/vinfo.h
index efbf6211e5b05947e18a88aafbdd194e2771ba12..a13e7c7338c874bb5f5912203753b2fe4909468c 100644 (file)
--- a/vinfo.h
+++ b/vinfo.h
 #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();
@@ -41,7 +42,7 @@ class VInfo : public TBBoxx
     void okButton();
 
     virtual int handleCommand(int command);
-    void processMessage(Message* m);
+    virtual void processMessage(Message* m);
     void draw();
 
   protected:
index 360433d0975191cad7606ecd747a51a023a10da5..6f46ffb2b318432c0e7c8c04a68f97118201d9c2 100644 (file)
@@ -351,11 +351,13 @@ VMediaList::VMediaList()
 #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);
@@ -1077,11 +1079,11 @@ void VMediaList::processMessage(Message* m)
     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) {
index 070754726d9b5065c19bbdfd853d1e6252d28a31..9af61b1406b452813149462afed8b053c05f3558 100644 (file)
 #include <vector>
 
 #include "tbboxx.h"
+#include "messagequeue.h"
 #include "wselectlist.h"
 #include "timers.h"
 
 class DirList;
-class Message;
 class BoxStack;
 class Media;
 class MediaList;
@@ -38,7 +38,7 @@ class MediaURI;
 class VMediaView;
 class MediaListHolder;
 
-class VMediaList : public TBBoxx , public TimerReceiver
+class VMediaList : public TBBoxx , public TimerReceiver, public MessageReceiver
 {
   public:
     VMediaList();
index 79036a51181b2cdf62d3c02ca5e968ec1d2cfa8b..31c5301200154bdbd14215085abb9782192dbd37 100644 (file)
@@ -295,10 +295,12 @@ VMediaView::VMediaView(VMediaList *p)
   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;
@@ -704,7 +706,7 @@ void VMediaView::processMessage(Message* m)
   {
     if (coordsOutsideBox(m))
     {
-      BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+      Input::sendInputKey(Input::BACK);
     }
   }
   else if (m->message = Message::PLAYER_EVENT) {
index 7d0bf63b4b93e26ad6634d9bebd6c3f85f5ea61f..9009e36847dec6fb5e103d80ba2d02e05e2b2c73 100644 (file)
@@ -21,6 +21,7 @@
 #define VMEDIAVIEW_H
 
 #include "boxx.h"
+#include "messagequeue.h"
 #include "timers.h"
 #include "vmedialist.h"
 #include "colour.h"
@@ -29,7 +30,6 @@
 #include "imagereader.h"
 
 #define TESTCOLOURS
-class Message;
 class VInfo;
 class AudioPlayer;
 class DrawingThread;
@@ -43,7 +43,7 @@ class VPictureBanner;
 class MediaOptions;
 class VPreader;
 
-class VMediaView : public Boxx, public TimerReceiver
+class VMediaView : public Boxx, public TimerReceiver, public MessageReceiver
 {
   friend class VPReader;
   public:
index 9890ce112cd6a23b36c60a58f7005bf2ee91cdd2..f396694325db14a421cbe19c22a1f7a7bf765bad 100644 (file)
--- a/vopts.cc
+++ b/vopts.cc
@@ -268,11 +268,15 @@ VOpts::VOpts()
   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;
@@ -508,7 +512,7 @@ void VOpts::processMessage(Message* m)
     } 
     else if (coordsOutsideBox(m))
     {
-      BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+      Input::sendInputKey(Input::BACK);
     }
   }
 }
diff --git a/vopts.h b/vopts.h
index af1269cc2d0cb53ff9b0cec8309d3b642db14dff..e260055f72c998a636c65f0f5cd59eca3e204ce0 100644 (file)
--- a/vopts.h
+++ b/vopts.h
 #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();
index cf88c094a3a657e23a9ba60f90f05041b20b810e..e266ab3abf5c4dcb2696a16093bdb6ff73d5070b 100644 (file)
@@ -43,10 +43,13 @@ VPictureBanner::VPictureBanner(bool ld, bool sl)
   //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);
 }
 
@@ -109,7 +112,7 @@ void VPictureBanner::processMessage(Message* m)
 
     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)
     {
index 27709ff6d4c828457e1f804fd0793cf9a91d51ca..66fc98b07d315a40b8e997ce2a8494c1cea20291 100644 (file)
 #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);
index fb8a3d35aa1c60db549fa3a405a8e16ee2e5b8d5..f566aef9503d319063c7cb89f93d3147a2b8f29a 100644 (file)
 #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);
 
@@ -40,10 +37,13 @@ VQuestion::VQuestion(void* treplyTo)
   
   add(&buttonYes);
   add(&buttonNo);  
+
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 VQuestion::~VQuestion()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
   if (mainText) delete[] mainText;
 }
 
@@ -143,15 +143,15 @@ void VQuestion::processMessage(Message* m)
   {
     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);
     }
   }
 }
index d061a554f5833851de34f4bdec9f4fffe88cdd15..5f8916aa5cafc67b936f7423b067d9a74b18728d 100644 (file)
 #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);
@@ -42,12 +43,12 @@ class VQuestion : public TBBoxx
     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;
index 8a6ada017cd8ea649bd4b8638245df9c2dec5365..eae14e4dabadc5aed444c46c0c4856f1d44935f0 100644 (file)
@@ -93,6 +93,8 @@ VRadioRec::VRadioRec(Recording* rec)
   barBlue.set(0, 0, 0, 128);
 
   barShowing = false;
+
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 void VRadioRec::preDelete()
@@ -103,8 +105,9 @@ 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();
index 278da9303a4a8caaff095c31f6bb1a2efedd33f6..fac271aa7a9a594844aacb69750fb7c356f43795 100644 (file)
 #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);
index 66e7720175f1222ace98655ae088dcea6b6a18ae..85961436487d1acaa311e2de99e078868000da95 100644 (file)
@@ -61,13 +61,15 @@ VRecMove::VRecMove(RecMan* trecman)
   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;
 }
@@ -156,11 +158,11 @@ void VRecMove::processMessage(Message* m)
   {
     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);
     }
   }
 }
index 1c6fa936ba9c170c7dc9caf8edb9d2734d8a103e..e67ac0d1dd67e1c4110ed47a23f6db5684a62207 100644 (file)
 #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);
index 1fdca5848de668146e19d61a3d63e52b10e09be1..366fff8c75566a38a911f85759dd96389df20777 100644 (file)
@@ -144,13 +144,16 @@ VRecording::VRecording(RecMan* trecman, Recording* trec)
 
   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;
 }
@@ -409,7 +412,7 @@ void VRecording::processMessage(Message* m)
     {
       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;
@@ -427,7 +430,7 @@ void VRecording::processMessage(Message* m)
     {
       if (coordsOutsideBox(m))
       {
-        BoxStack::getInstance()->handleCommand(Input::BACK); //simulate cancel press
+        Input::sendInputKey(Input::BACK);
       }
     }
   }
index 9cab393e0e2ab407c25a4709d1c1a273b7ae356c..6bd46825294a09d5d1a2fcc33a062cc21347570e 100644 (file)
 #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();
 
@@ -48,7 +47,7 @@ class VRecording : public TBBoxx
 
   private:
     RecMan* recman;
-    VRecordingList* vRecList;
+    MessageReceiver* vRecList;
     Recording* rec;
     WTabBar tabbar;
     WTextbox* epgSummaryTextBox;
index 86a83bb7347721b7dd7cd0890b84b1581695d54d..39bb912550eeeb9e907df92634360bfee5be8241 100644 (file)
@@ -44,11 +44,12 @@ VRecordingList::VRecordingList()
   boxstack = BoxStack::getInstance();
   recman = NULL;
   loading = true;
-
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 VRecordingList::~VRecordingList()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
   delete recman;
 }
 
@@ -68,11 +69,11 @@ void VRecordingList::processMessage(Message* m)
   {
     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)
index 21411e9e89a471de33836f998f9c450890d79a37..c3dc7c55cb742489ba46d3f4462431266d7dcffd 100644 (file)
 #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();
index 73c78a92f47e2996c40f6040292b396d6d7b59e8..b5c8c8443e3ab1002eca0cc99edb92c2514be4d1 100644 (file)
@@ -31,7 +31,6 @@
 #include "vrecmove.h"
 #include "boxstack.h"
 #include "recman.h"
-#include "vrecordinglist.h"
 #include "recording.h"
 #include "message.h"
 
@@ -64,13 +63,16 @@ VRecordingMenu::VRecordingMenu(RecMan* trecman)
   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;
 }
@@ -208,11 +210,11 @@ void VRecordingMenu::processMessage(Message* m)
   {
     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)
index c67729b6cb749efa61e256293a6c4347c349ac12..2ac0b3a0197ca68605d6fd4f06e1190fbcbc639b 100644 (file)
 #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);
@@ -45,7 +44,7 @@ class VRecordingMenu : public TBBoxx
   private:
     RecMan* recman;
     WSelectList sl;
-    VRecordingList* vRecList;
+    MessageReceiver* vRecList;
     Recording* rec;
 };
 
index 26d22b42e0a02da407531dff49ac77c156e21348..38f5c4c33eb6e640eb64b303eae168a1df7c4f9f 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "vserverselect.h"
 
-VServerSelect::VServerSelect(const VDPC& servers, void* treplyTo)
+VServerSelect::VServerSelect(const VDPC& servers, MessageReceiver* treplyTo)
 {
   setSize(300, 200);
   createBuffer();
@@ -55,10 +55,12 @@ VServerSelect::VServerSelect(const VDPC& servers, void* treplyTo)
   }
 
   replyTo = treplyTo;
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 VServerSelect::~VServerSelect()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
 }
 
 void VServerSelect::draw()
@@ -112,7 +114,8 @@ void VServerSelect::processMessage(Message* m)
   {
     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);
     }
   }
 }
index 650a751e9b6b351d206b5e8ae980dff47916d101..c3834edca8f177bfb78aa0324213abc6eadf8297 100644 (file)
 #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);
@@ -38,7 +37,7 @@ class VServerSelect : public TBBoxx
 
   private:
     WSelectList sl;
-    void* replyTo;
+    MessageReceiver* replyTo;
 };
 
 #endif
index d969228b0050b71a5d9fe99ea99bbdde3c5ab23d..e8238d46cf9f6e411a79607f6eaba2e092eb5222 100644 (file)
@@ -49,10 +49,13 @@ VTeletextView::VTeletextView(TeletextDecoderVBIEBU* TTdecoder, Boxx* playerview,
   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);
index 819ebb0c5bde516ad0e852764510442cce49ef8b..da02a594f3656448ef284f6cf64790816c51c020 100644 (file)
 #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);
index 291d1b4106b0d1cb62817b9a98b2f47353411b63..c11c2824fe06b86ad54421e317e41c4497d1e96a 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
     Copyright 2004-2005 Chris Tallon
 
@@ -60,13 +59,15 @@ VTimerEdit::VTimerEdit(RecTimer* trt)
   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;
 }
@@ -253,7 +254,7 @@ void VTimerEdit::processMessage(Message* m)
 
   } 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)
   {
index 9f230aa9cb087c140e0ae968f0af6577a56f2f0c..f07ebefc88cd172f493c22fd24dbf57b4e921dde 100644 (file)
 #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);
@@ -39,12 +38,12 @@ class VTimerEdit : public TBBoxx
     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;
index 058835c1d0465f48f680c72145fd0d6c2362e744..f5886204d0aa9a139da19f7a0dfb31fef50885f6 100644 (file)
@@ -73,6 +73,8 @@ VTimerList::VTimerList()
   sl.setPosition(30, 30 + 5);
   sl.setSize(area.w - 40, area.h - 30 - 15 - 30);
   add(&sl);
+
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 void VTimerList::preDelete()
@@ -82,6 +84,8 @@ void VTimerList::preDelete()
 
 VTimerList::~VTimerList()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
+
   if (recTimerList)
   {
     for (UINT i = 0; i < recTimerList->size(); i++)
@@ -329,11 +333,11 @@ void VTimerList::processMessage(Message* m)
   {
     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)
index 966ac375e6f6bdd97b2b873359cac96ba1cb9a9f..0666d21ffebe7cd2ac32ed9f8cc6811f9b0a52c6 100644 (file)
 #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();
index 2c0b6224e6735ac450928e99068684e84e35f0b8..66dd4ba994b8f57e943d45895edb25cc85fd64db 100644 (file)
@@ -273,6 +273,8 @@ VVideoLiveTV::VVideoLiveTV(ChannelList* tchanList, ULONG initialChannelNumber, V
   vdisplay.y = 0;
   vdisplay.width = 0;
   vdisplay.height = 0;
+
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 void VVideoLiveTV::preDelete()
@@ -282,6 +284,7 @@ void VVideoLiveTV::preDelete()
 
 VVideoLiveTV::~VVideoLiveTV()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
   delete player;
   video->setDefaultAspect();
   delData();
index 7d083c2405085cc5dda84c12b47bf4152fabc0ac..baa4d76a9268c7f78624af0b1fb2acaf1c544bb4 100644 (file)
@@ -25,6 +25,7 @@
 #include <vector>
 #include <math.h>
 
+#include "messagequeue.h"
 #include "boxx.h"
 #include "region.h"
 #include "vdr.h"
@@ -45,7 +46,7 @@ class PlayerLive;
 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);
index c2aa62621ee41f8a986eaa149b4a14a7ae00fb1d..e56068e657b93a7b15baba7a850ea8716ea6f12d 100644 (file)
@@ -106,10 +106,12 @@ VVideoMedia::VVideoMedia(Media* media, VMediaList *p)
     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)
@@ -337,7 +339,7 @@ void VVideoMedia::processMessage(Message* m)
 
     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)
     {
@@ -358,7 +360,7 @@ void VVideoMedia::processMessage(Message* m)
     }
     else
     {
-      BoxStack::getInstance()->handleCommand(Input::OK); //simulate rok press
+      Input::sendInputKey(Input::OK);
     }
   }
   else if (m->message == Message::PLAYER_EVENT)
index dbf7a53eceb0f4514778c0cc91647ac442a730d0..8f0c738ce4384c627782f92689a6c525fdf0eb1c 100644 (file)
@@ -24,6 +24,7 @@
 #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
@@ -51,8 +50,6 @@ class VVideoMedia : public Boxx, public TimerReceiver
     void timercall(int clientReference);
     void processMessage(Message* m);
 
-
-
   private:
     BoxStack* boxstack;
     Video* video;
index b041e08d2254f8bf1ccdb822955ed5d6824ce4da..ef6ea2860f2841ccc2df186d8f117a4651c1a226 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdio.h>
 
 #include "boxx.h"
+#include "messagequeue.h"
 #include "timers.h"
 #include "region.h"
 #include "colour.h"
@@ -34,7 +35,6 @@ class VDR;
 class PlayerVideoRec;
 class Recording;
 class VAudioSelector;
-class Message;
 class BoxStack;
 class VInfo;
 class Bitmap;
@@ -42,7 +42,7 @@ 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);
index e80349b02836c917c64c1b72647cee83854b58b7..e9468c15e20d4cf0fcc72d60debe07455d949467 100644 (file)
@@ -132,7 +132,7 @@ VWelcome::VWelcome()
   sl.addOption(tr("7. Exit"), reinterpret_cast<void*>(7), 0,info);
 #endif
 
-
+  MessageQueue::getInstance()->addReceiver(this);
 }
 
 void VWelcome::preDelete()
@@ -142,6 +142,7 @@ void VWelcome::preDelete()
 
 VWelcome::~VWelcome()
 {
+  MessageQueue::getInstance()->removeReceiver(this);
 }
 
 void VWelcome::draw()
@@ -405,7 +406,7 @@ void VWelcome::processMessage(Message* m)
   {
     if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
     {
-      boxstack->handleCommand(Input::OK); //simulate OK press
+      Input::sendInputKey(Input::OK);
     }
   }
 }
index a0dfeccf17e5e39208772f222e11af0115f2ceb8..a68741fa1cf788357d259d601f20ec0cffdbde31 100644 (file)
@@ -25,6 +25,7 @@
 #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();