// MsgQueue.cpp: implementation of the CMsgQueue class. // ////////////////////////////////////////////////////////////////////// #include <os/os.h> #include <gui/messages.h> #include <stdio.h> #include <conio.h> #include "MsgQueue.h" #include <kernel/proc.h> #include <kernel/thread.h> ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMsgQueue::CMsgQueue() { _cputws(L"CMsgQueue::CMsgQueue\n"); m_refs = 0; m_head = m_tail = NULL; } CMsgQueue::~CMsgQueue() { _cputws(L"CMsgQueue::~CMsgQueue\n"); } HRESULT CMsgQueue::QueryInterface(REFIID iid, void ** ppvObject) { if (InlineIsEqualGUID(iid, IID_IUnknown) || InlineIsEqualGUID(iid, IID_IMsgQueue)) { AddRef(); *ppvObject = (IMsgQueue*) this; return S_OK; } else return E_FAIL; } HRESULT CMsgQueue::PeekMessage(msg_t* msg, bool remove) { mqent_t* next; if (m_head) { *msg = m_head->msg; if (remove) { next = m_head->next; free(m_head); m_head = next; if (m_head == NULL) m_tail = NULL; } return msg->message == WM_QUIT ? S_FALSE : S_OK; } else return E_FAIL; } HRESULT CMsgQueue::GetMessage(msg_t* msg) { HRESULT hr; //_cputws(L"GetMessage..."); while ((hr = PeekMessage(msg, true)) == E_FAIL) ; //_cputws(L"done\n"); return hr; } HRESULT CMsgQueue::DispatchMessage(const msg_t* msg) { void *wndproc; dword params[3]; if (msg->wnd) { if (msg->wnd->GetAttrib(ATTR_PROCESS) == (dword) procCurrent()) { wndproc = (void*) msg->wnd->GetAttrib(ATTR_WNDPROC); if (wndproc) { //wprintf(L"wndproc = %p\n", wndproc); params[0] = (dword) msg->wnd; params[1] = msg->message; params[2] = msg->params; thrCall(thrCurrent(), wndproc, params, sizeof(params)); } else msg->wnd->DefWndProc(msg->message, msg->params); return S_OK; } } return E_FAIL; } HRESULT CMsgQueue::PostMessage(IWindow* wnd, dword message, dword params) { mqent_t* ent = (mqent_t*) malloc(sizeof(mqent_t)); ent->msg.wnd = wnd; ent->msg.message = message; ent->msg.params = params; ent->next = NULL; if (m_tail) m_tail->next = ent; m_tail = ent; if (m_head == NULL) m_head = ent; return S_OK; }