extern void AxWin4_MoveWindow(tAxWin4_Window *Window, int X, int Y);
extern void AxWin4_ResizeWindow(tAxWin4_Window *Window, unsigned int W, unsigned int H);
+extern void AxWin4_DamageRect(tAxWin4_Window *Window, unsigned int X, unsigned int Y, unsigned int W, unsigned int H);
+extern void* AxWin4_GetWindowBuffer(tAxWin4_Window *Window);
+
extern void AxWin4_DrawBitmap(tAxWin4_Window *Window, int X, int Y, unsigned int W, unsigned int H, void *Data);
#include "definitions.h"
IIPCChannel* gIPCChannel;
::std::mutex glSyncReply;
+bool gSyncReplyActive;
bool gSyncReplyValid;
CDeserialiser gSyncReplyBuf;
void RecvMessage(CDeserialiser& message)
{
uint8_t id = message.ReadU8();
+ _SysDebug("RecvMessage: id=%i", id);
switch(id)
{
case IPCMSG_REPLY:
// Flag reply and take a copy of this message
- if( gSyncReplyValid )
+ if( !gSyncReplyActive )
+ {
+ _SysDebug("Unexpected reply message %i", message.ReadU8());
+ }
+ else if( gSyncReplyValid )
{
// Oh... that was unexpected
_SysDebug("Unexpected second reply message %i", message.ReadU8());
CDeserialiser GetSyncReply(CSerialiser& request, unsigned int Message)
{
::std::lock_guard<std::mutex> lock(glSyncReply);
+ gSyncReplyActive = true;
gSyncReplyValid = false;
// Send once lock is acquired
SendMessage(request);
if( !AxWin4_WaitEventQueue(0) )
throw ::std::runtime_error("Connection dropped while waiting for reply");
}
+ gSyncReplyActive = false;
uint8_t id = gSyncReplyBuf.ReadU8();
if( id != Message )
{
- _SysDebug("Unexpected reply message '%i', message.ReadU8()");
+ _SysDebug("Unexpected reply message id=%i, expected %i",
+ id, Message);
+ throw ::std::runtime_error("Sequencing error, unexpected reply");
}
- return gSyncReplyBuf;
+ // Use move to avoid copying
+ return ::std::move(gSyncReplyBuf);
}
extern "C" void AxWin4_GetScreenDimensions(unsigned int ScreenIndex, unsigned int *Width, unsigned int *Height)
}
}
+extern "C" void AxWin4_DrawControl(tAxWin4_Window *Window, int X, int Y, unsigned int W, unsigned int H, uint16_t ID)
+{
+ CSerialiser message;
+ message.WriteU8(IPCMSG_DRAWCTL);
+ message.WriteU16(Window->m_id);
+ message.WriteU16(X);
+ message.WriteU16(Y);
+ message.WriteU16(W);
+ message.WriteU16(H);
+ message.WriteU16(ID);
+ ::AxWin::SendMessage(message);
+}
+
}; // namespace AxWin
::AxWin::SendMessage(message);
}
+extern "C" void AxWin4_DamageRect(tAxWin4_Window *Window, unsigned int X, unsigned int Y, unsigned int W, unsigned int H)
+{
+ CSerialiser message;
+ message.WriteU8(IPCMSG_DAMAGERECT);
+ message.WriteU16(Window->m_id);
+ message.WriteU16(X);
+ message.WriteU16(Y);
+ message.WriteU16(W);
+ message.WriteU16(H);
+ ::AxWin::SendMessage(message);
+}
+
extern "C" void *AxWin4_GetWindowBuffer(tAxWin4_Window *Window)
{
if( Window->m_fd == -1 )
req.WriteU16(Window->m_id);
CDeserialiser response = GetSyncReply(req, IPCMSG_GETWINBUF);
- if( response.ReadU16() != Window->m_id ) {
+ if( response.ReadU16() != Window->m_id )
+ {
}