Generalization of message queue stuff so it can be used in non-UI

contexts:

- IWindowMessage -> IMessage
- New IMessageTarget implemented by IWindow
- WindowMessageQueue -> MessageQueue
This commit is contained in:
casey 2016-05-22 10:14:01 -07:00
parent 4f7a6ea7e2
commit 26311255b5
25 changed files with 169 additions and 153 deletions

View File

@ -36,7 +36,7 @@
#include <cursespp/Colors.h>
#include <cursespp/IInput.h>
#include <cursespp/IKeyHandler.h>
#include <cursespp/WindowMessageQueue.h>
#include <cursespp/MessageQueue.h>
#include <cursespp/LayoutStack.h>
#include <cursespp/WindowLayout.h>
@ -228,7 +228,7 @@ int main(int argc, char* argv[])
ensureFocusIsValid(state);
Window::WriteToScreen();
WindowMessageQueue::Instance().Dispatch();
MessageQueue::Instance().Dispatch();
}
}

View File

@ -3,7 +3,7 @@
#include "stdafx.h"
#include "MainLayout.h"
#include <cursespp/Screen.h>
#include <cursespp/IWindowMessage.h>
#include <cursespp/IMessage.h>
#define MESSAGE_TYPE_UPDATE 1001
#define UPDATE_INTERVAL_MS 1000
@ -58,7 +58,7 @@ void MainLayout::Show() {
this->UpdateWindows();
}
void MainLayout::ProcessMessage(IWindowMessage &message) {
void MainLayout::ProcessMessage(IMessage &message) {
if (message.MessageType() == MESSAGE_TYPE_UPDATE) {
this->UpdateWindows();
this->PostMessage(MESSAGE_TYPE_UPDATE, 0, 0, UPDATE_INTERVAL_MS);

View File

@ -22,7 +22,7 @@ class MainLayout : public LayoutBase {
virtual void Layout();
virtual void Show();
virtual void ProcessMessage(IWindowMessage &message);
virtual void ProcessMessage(IMessage &message);
private:
void UpdateWindows();

View File

@ -1,6 +1,8 @@
#pragma once
class PlaybackService {
#include <cursespp/IMessageTarget.h>
class PlaybackService : public IMessageTarget {
public:
};

View File

@ -5,7 +5,7 @@
#include <cursespp/SingleLineEntry.h>
#include <cursespp/MultiLineEntry.h>
#include <cursespp/IWindowMessage.h>
#include <cursespp/IMessage.h>
#include <core/library/LocalLibraryConstants.h>
@ -70,7 +70,7 @@ void CategoryListView::OnQueryCompleted(QueryPtr query) {
}
}
void CategoryListView::ProcessMessage(IWindowMessage &message) {
void CategoryListView::ProcessMessage(IMessage &message) {
if (message.MessageType() == WINDOW_MESSAGE_QUERY_COMPLETED) {
this->metadata = activeQuery->GetResult();
activeQuery.reset();

View File

@ -20,7 +20,7 @@ class CategoryListView : public ListWindow, public sigslot::has_slots<> {
void Requery();
virtual void ProcessMessage(IWindowMessage &message);
virtual void ProcessMessage(IMessage &message);
DBID GetSelectedId();
std::string GetFieldName();

View File

@ -4,8 +4,8 @@
#include <cursespp/Screen.h>
#include <cursespp/Colors.h>
#include <cursespp/WindowMessageQueue.h>
#include <cursespp/WindowMessage.h>
#include <cursespp/MessageQueue.h>
#include <cursespp/Message.h>
#include "CommandWindow.h"

View File

@ -4,7 +4,7 @@
#include <cursespp/Colors.h>
#include <cursespp/SingleLineEntry.h>
#include <cursespp/IWindowMessage.h>
#include <cursespp/IMessage.h>
#include "TrackListView.h"
@ -69,7 +69,7 @@ bool TrackListView::KeyPress(int64 ch) {
return ListWindow::KeyPress(ch);
}
void TrackListView::ProcessMessage(IWindowMessage &message) {
void TrackListView::ProcessMessage(IMessage &message) {
if (message.MessageType() == WINDOW_MESSAGE_QUERY_COMPLETED) {
if (this->query && this->query->GetStatus() == IQuery::Finished) {
this->metadata = this->query->GetResult();

View File

@ -20,7 +20,7 @@ class TrackListView : public ListWindow, public sigslot::has_slots<> {
TrackListView(Transport& transport, LibraryPtr library, IWindow *parent = NULL);
~TrackListView();
virtual void ProcessMessage(IWindowMessage &message);
virtual void ProcessMessage(IMessage &message);
virtual bool KeyPress(int64 ch);
void Requery(const std::string& column, DBID id);

View File

@ -5,7 +5,7 @@
#include <cursespp/Screen.h>
#include <cursespp/Colors.h>
#include <cursespp/WindowMessage.h>
#include <cursespp/Message.h>
#include <app/util/Text.h>
@ -56,7 +56,7 @@ void TransportWindow::Show() {
this->Update();
}
void TransportWindow::ProcessMessage(IWindowMessage &message) {
void TransportWindow::ProcessMessage(IMessage &message) {
int type = message.MessageType();
if (type == REFRESH_TRANSPORT_READOUT) {

View File

@ -18,7 +18,7 @@ class TransportWindow : public Window, public sigslot::has_slots<> {
TransportWindow(LibraryPtr library, Transport& transport);
~TransportWindow();
virtual void ProcessMessage(IWindowMessage &message);
virtual void ProcessMessage(IMessage &message);
virtual void Show();
void Update();

View File

@ -0,0 +1,17 @@
#pragma once
#include <stdafx.h>
#include <memory>
class IMessageTarget;
class IMessage {
public:
virtual ~IMessage() = 0 { }
virtual IMessageTarget* Target() = 0;
virtual int MessageType() = 0;
virtual int64 UserData1() = 0;
virtual int64 UserData2() = 0;
};
typedef std::shared_ptr<IMessage> IMessagePtr;

View File

@ -0,0 +1,9 @@
#pragma once
#include "IMessage.h"
class IMessageTarget {
public:
virtual bool IsAcceptingMessages() = 0;
virtual void ProcessMessage(IMessage &message) = 0;
};

View File

@ -3,10 +3,11 @@
#include "curses_config.h"
#include "IDisplayable.h"
#include "IOrderable.h"
#include "IMessageTarget.h"
class IWindowMessage;
class IMessage;
class IWindow : public IOrderable, public IDisplayable {
class IWindow : public IOrderable, public IDisplayable, public IMessageTarget {
public:
virtual ~IWindow() = 0 { }
virtual void Repaint() = 0;
@ -28,8 +29,6 @@ class IWindow : public IOrderable, public IDisplayable {
virtual int GetId() const = 0;
virtual int GetFocusOrder() = 0;
virtual void SetFocusOrder(int order = -1) = 0;
virtual bool IsAcceptingMessages() = 0;
virtual void ProcessMessage(IWindowMessage &message) = 0;
virtual WINDOW* GetFrame() const = 0;
virtual WINDOW* GetContent() const = 0;
};

View File

@ -1,16 +0,0 @@
#pragma once
#include <stdafx.h>
#include "IWindow.h"
#include <memory>
class IWindowMessage {
public:
virtual ~IWindowMessage() = 0 { }
virtual IWindow* Target() = 0;
virtual int MessageType() = 0;
virtual int64 UserData1() = 0;
virtual int64 UserData2() = 0;
};
typedef std::shared_ptr<IWindowMessage> IWindowMessagePtr;

View File

@ -0,0 +1,39 @@
#include <stdafx.h>
#include "Message.h"
IMessagePtr Message::Create(
IMessageTarget* target,
int messageType,
int64 data1,
int64 data2)
{
return IMessagePtr(new Message(target, messageType, data1, data2));
}
Message::Message(
IMessageTarget* target,
int messageType,
int64 data1,
int64 data2)
{
this->target = target;
this->messageType = messageType;
this->data1 = data1;
this->data2 = data2;
}
IMessageTarget* Message::Target() {
return this->target;
}
int Message::MessageType() {
return this->messageType;
}
int64 Message::UserData1() {
return this->data1;
}
int64 Message::UserData2() {
return this->data2;
}

View File

@ -1,29 +1,29 @@
#pragma once
#include "IWindowMessage.h"
#include "IMessage.h"
class WindowMessage : public IWindowMessage {
class Message : public IMessage {
private:
WindowMessage(
IWindow* target,
Message(
IMessageTarget* target,
int messageType,
int64 data1,
int64 data2);
public:
static IWindowMessagePtr Create(
IWindow* target,
static IMessagePtr Create(
IMessageTarget* target,
int messageType,
int64 data1,
int64 data2);
virtual IWindow* Target();
virtual IMessageTarget* Target();
virtual int MessageType();
virtual int64 UserData1();
virtual int64 UserData2();
private:
IWindow* target;
IMessageTarget* target;
int messageType;
int64 data1, data2;
};

View File

@ -1,19 +1,19 @@
#include <stdafx.h>
#include "WindowMessageQueue.h"
#include "MessageQueue.h"
using namespace boost::chrono;
WindowMessageQueue WindowMessageQueue::instance;
MessageQueue MessageQueue::instance;
WindowMessageQueue::WindowMessageQueue() {
MessageQueue::MessageQueue() {
}
WindowMessageQueue& WindowMessageQueue::Instance() {
return WindowMessageQueue::instance;
MessageQueue& MessageQueue::Instance() {
return MessageQueue::instance;
}
void WindowMessageQueue::Dispatch() {
void MessageQueue::Dispatch() {
milliseconds now = duration_cast<milliseconds>(
system_clock::now().time_since_epoch());
@ -58,12 +58,12 @@ void WindowMessageQueue::Dispatch() {
}
}
void WindowMessageQueue::Remove(IWindow *target, int type) {
void MessageQueue::Remove(IMessageTarget *target, int type) {
boost::recursive_mutex::scoped_lock lock(this->queueMutex);
std::list<EnqueuedMessage*>::iterator it = this->queue.begin();
while (it != this->queue.end()) {
IWindowMessagePtr current = (*it)->message;
IMessagePtr current = (*it)->message;
if (current->Target() == target) {
if (type == -1 || type == current->MessageType()) {
@ -77,7 +77,7 @@ void WindowMessageQueue::Remove(IWindow *target, int type) {
}
}
void WindowMessageQueue::Post(IWindowMessagePtr message, int64 delayMs) {
void MessageQueue::Post(IMessagePtr message, int64 delayMs) {
boost::recursive_mutex::scoped_lock lock(this->queueMutex);
delayMs = max(0, delayMs);
@ -107,6 +107,6 @@ void WindowMessageQueue::Post(IWindowMessagePtr message, int64 delayMs) {
this->queue.insert(curr, m);
}
void WindowMessageQueue::Dispatch(IWindowMessagePtr message) {
void MessageQueue::Dispatch(IMessagePtr message) {
message->Target()->ProcessMessage(*message);
}

View File

@ -0,0 +1,32 @@
#pragma once
#include "IMessage.h"
#include "IMessageTarget.h"
#include <boost/thread/recursive_mutex.hpp>
#include <boost/chrono.hpp>
class MessageQueue {
public:
static MessageQueue& Instance();
void Post(IMessagePtr message, int64 delayMs = 0);
void Remove(IMessageTarget *target, int type = -1);
void Dispatch();
private:
static MessageQueue instance;
struct EnqueuedMessage {
IMessagePtr message;
boost::chrono::milliseconds time;
};
boost::recursive_mutex queueMutex;
std::list<EnqueuedMessage*> queue;
MessageQueue();
void Dispatch(IMessagePtr message);
};

View File

@ -3,8 +3,8 @@
#include <stdafx.h>
#include "Window.h"
#include "IWindowGroup.h"
#include "WindowMessage.h"
#include "WindowMessageQueue.h"
#include "Message.h"
#include "MessageQueue.h"
static int NEXT_ID = 0;
static bool drawPending = false;
@ -34,7 +34,7 @@ Window::Window(IWindow *parent) {
}
Window::~Window() {
WindowMessageQueue::Instance().Remove(this);
MessageQueue::Instance().Remove(this);
this->Destroy();
}
@ -42,7 +42,7 @@ int Window::GetId() const {
return this->id;
}
void Window::ProcessMessage(IWindowMessage &message) {
void Window::ProcessMessage(IMessage &message) {
}
@ -75,8 +75,8 @@ void Window::SendToBottom() {
}
void Window::PostMessage(int messageType, int64 user1, int64 user2, int64 delay) {
WindowMessageQueue::Instance().Post(
WindowMessage::Create(
MessageQueue::Instance().Post(
Message::Create(
this,
messageType,
user1,
@ -85,7 +85,7 @@ void Window::PostMessage(int messageType, int64 user1, int64 user2, int64 delay)
}
void Window::RemoveMessage(int messageType) {
WindowMessageQueue::Instance().Remove(this, messageType);
MessageQueue::Instance().Remove(this, messageType);
}
void Window::SetParent(IWindow* parent) {

View File

@ -37,7 +37,7 @@ class Window : public IWindow, public std::enable_shared_from_this<IWindow> {
virtual void BringToTop();
virtual void SendToBottom();
virtual void ProcessMessage(IWindowMessage &message);
virtual void ProcessMessage(IMessage &message);
virtual bool IsAcceptingMessages();
virtual WINDOW* GetFrame() const;

View File

@ -1,39 +0,0 @@
#include <stdafx.h>
#include "WindowMessage.h"
IWindowMessagePtr WindowMessage::Create(
IWindow* target,
int messageType,
int64 data1,
int64 data2)
{
return IWindowMessagePtr(new WindowMessage(target, messageType, data1, data2));
}
WindowMessage::WindowMessage(
IWindow* target,
int messageType,
int64 data1,
int64 data2)
{
this->target = target;
this->messageType = messageType;
this->data1 = data1;
this->data2 = data2;
}
IWindow* WindowMessage::Target() {
return this->target;
}
int WindowMessage::MessageType() {
return this->messageType;
}
int64 WindowMessage::UserData1() {
return this->data1;
}
int64 WindowMessage::UserData2() {
return this->data2;
}

View File

@ -1,31 +0,0 @@
#pragma once
#include "IWindowMessage.h"
#include <boost/thread/recursive_mutex.hpp>
#include <boost/chrono.hpp>
class WindowMessageQueue {
public:
static WindowMessageQueue& Instance();
void Post(IWindowMessagePtr message, int64 delayMs = 0);
void Remove(IWindow *target, int type = -1);
void Dispatch();
private:
static WindowMessageQueue instance;
struct EnqueuedMessage {
IWindowMessagePtr message;
boost::chrono::milliseconds time;
};
boost::recursive_mutex queueMutex;
std::list<EnqueuedMessage*> queue;
WindowMessageQueue();
void Dispatch(IWindowMessagePtr message);
};

View File

@ -143,8 +143,8 @@
<ClCompile Include="cursespp\SingleLineEntry.cpp" />
<ClCompile Include="cursespp\Window.cpp" />
<ClCompile Include="cursespp\WindowLayout.cpp" />
<ClCompile Include="cursespp\WindowMessage.cpp" />
<ClCompile Include="cursespp\WindowMessageQueue.cpp" />
<ClCompile Include="cursespp\Message.cpp" />
<ClCompile Include="cursespp\MessageQueue.cpp" />
<ClCompile Include="Main.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
@ -175,13 +175,14 @@
<ClInclude Include="cursespp\IKeyHandler.h" />
<ClInclude Include="cursespp\ILayout.h" />
<ClInclude Include="cursespp\ILayoutStack.h" />
<ClInclude Include="cursespp\IMessageTarget.h" />
<ClInclude Include="cursespp\IOrderable.h" />
<ClInclude Include="cursespp\LayoutStack.h" />
<ClInclude Include="cursespp\IScrollable.h" />
<ClInclude Include="cursespp\IScrollAdapter.h" />
<ClInclude Include="cursespp\IWindow.h" />
<ClInclude Include="cursespp\IWindowGroup.h" />
<ClInclude Include="cursespp\IWindowMessage.h" />
<ClInclude Include="cursespp\IMessage.h" />
<ClInclude Include="cursespp\LayoutBase.h" />
<ClInclude Include="cursespp\ListWindow.h" />
<ClInclude Include="cursespp\MultiLineEntry.h" />
@ -192,8 +193,8 @@
<ClInclude Include="cursespp\SingleLineEntry.h" />
<ClInclude Include="cursespp\Window.h" />
<ClInclude Include="cursespp\WindowLayout.h" />
<ClInclude Include="cursespp\WindowMessage.h" />
<ClInclude Include="cursespp\WindowMessageQueue.h" />
<ClInclude Include="cursespp\Message.h" />
<ClInclude Include="cursespp\MessageQueue.h" />
<ClInclude Include="stdafx.h" />
</ItemGroup>
<ItemGroup>

View File

@ -27,12 +27,6 @@
<ClCompile Include="cursespp\Window.cpp">
<Filter>cursespp</Filter>
</ClCompile>
<ClCompile Include="cursespp\WindowMessage.cpp">
<Filter>cursespp</Filter>
</ClCompile>
<ClCompile Include="cursespp\WindowMessageQueue.cpp">
<Filter>cursespp</Filter>
</ClCompile>
<ClCompile Include="cursespp\Colors.cpp">
<Filter>cursespp</Filter>
</ClCompile>
@ -93,6 +87,12 @@
<ClCompile Include="app\service\PlaybackService.cpp">
<Filter>app\service</Filter>
</ClCompile>
<ClCompile Include="cursespp\Message.cpp">
<Filter>cursespp</Filter>
</ClCompile>
<ClCompile Include="cursespp\MessageQueue.cpp">
<Filter>cursespp</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h" />
@ -120,12 +120,6 @@
<ClInclude Include="cursespp\Window.h">
<Filter>cursespp</Filter>
</ClInclude>
<ClInclude Include="cursespp\WindowMessage.h">
<Filter>cursespp</Filter>
</ClInclude>
<ClInclude Include="cursespp\WindowMessageQueue.h">
<Filter>cursespp</Filter>
</ClInclude>
<ClInclude Include="cursespp\Colors.h">
<Filter>cursespp</Filter>
</ClInclude>
@ -156,9 +150,6 @@
<ClInclude Include="cursespp\IWindowGroup.h">
<Filter>cursespp</Filter>
</ClInclude>
<ClInclude Include="cursespp\IWindowMessage.h">
<Filter>cursespp</Filter>
</ClInclude>
<ClInclude Include="cursespp\LayoutBase.h">
<Filter>cursespp</Filter>
</ClInclude>
@ -222,6 +213,18 @@
<ClInclude Include="app\service\PlaybackService.h">
<Filter>app\service</Filter>
</ClInclude>
<ClInclude Include="cursespp\IMessage.h">
<Filter>cursespp</Filter>
</ClInclude>
<ClInclude Include="cursespp\Message.h">
<Filter>cursespp</Filter>
</ClInclude>
<ClInclude Include="cursespp\MessageQueue.h">
<Filter>cursespp</Filter>
</ClInclude>
<ClInclude Include="cursespp\IMessageTarget.h">
<Filter>cursespp</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="cursespp">