X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin4_src%2FServer%2Fipc.cpp;h=70605fc0bad9b52413d434b9505ac3bae272228f;hb=1aed2067a0f084e9c5fa1af48e177e28a81466bc;hp=f842578b20192e7a7ec3399dd0212360014bdfa7;hpb=47296e890b2b09cbc46db30d7fe2aeeae11a6d4a;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin4_src/Server/ipc.cpp b/Usermode/Applications/axwin4_src/Server/ipc.cpp index f842578b..70605fc0 100644 --- a/Usermode/Applications/axwin4_src/Server/ipc.cpp +++ b/Usermode/Applications/axwin4_src/Server/ipc.cpp @@ -39,17 +39,20 @@ void Initialise(const CConfigIPC& config, CCompositor& compositor) int FillSelect(fd_set& rfds) { int ret = 0; - for( auto channel : glChannels ) + for( const auto channel : glChannels ) { + _SysDebug("IPC::FillSelect - channel=%p", channel); + assert(channel); ret = ::std::max(ret, channel->FillSelect(rfds)); } return ret; } -void HandleSelect(fd_set& rfds) +void HandleSelect(const fd_set& rfds) { - for( auto channel : glChannels ) + for( const auto channel : glChannels ) { + assert(channel); channel->HandleSelect(rfds); } } @@ -67,6 +70,11 @@ void DeregisterClient(CClient& client) } +void SendNotify_Dims(CClient& client, unsigned int NewW, unsigned int NewH) +{ + _SysDebug("TODO: CClient::SendNotify_Dims"); +} + void HandleMessage_Nop(CClient& client, CDeserialiser& message) { @@ -145,16 +153,18 @@ void HandleMessage_CreateWindow(CClient& client, CDeserialiser& message) //CWindow* parent = client.GetWindow( parent_id ); ::std::string name = message.ReadString(); + ::_SysDebug("_CreateWindow: (%i, '%s')", new_id, name.c_str()); client.SetWindow( new_id, gpCompositor->CreateWindow(client, name) ); } void HandleMessage_DestroyWindow(CClient& client, CDeserialiser& message) { uint16_t win_id = message.ReadU16(); + _SysDebug("_DestroyWindow: (%i)", win_id); CWindow* win = client.GetWindow(win_id); if(!win) { - throw IPC::CClientFailure("Bad window"); + throw IPC::CClientFailure("_DestroyWindow: Bad window"); } client.SetWindow(win_id, 0); @@ -166,10 +176,11 @@ void HandleMessage_SetWindowAttr(CClient& client, CDeserialiser& message) { uint16_t win_id = message.ReadU16(); uint16_t attr_id = message.ReadU16(); - + _SysDebug("_SetWindowAttr: (%i, %i)", win_id, attr_id); + CWindow* win = client.GetWindow(win_id); if(!win) { - throw IPC::CClientFailure("Bad window"); + throw IPC::CClientFailure("_SetWindowAttr - Bad window"); } switch(attr_id) @@ -178,13 +189,11 @@ void HandleMessage_SetWindowAttr(CClient& client, CDeserialiser& message) uint16_t new_w = message.ReadU16(); uint16_t new_h = message.ReadU16(); win->Resize(new_w, new_h); - assert(!"TODO: IPC_WINATTR_DIMENSIONS"); break; } case IPC_WINATTR_POSITION: { int16_t new_x = message.ReadS16(); int16_t new_y = message.ReadS16(); win->Move(new_x, new_y); - assert(!"TODO: IPC_WINATTR_POSITION"); break; } default: _SysDebug("HandleMessage_SetWindowAttr - Bad attr %u", attr_id); @@ -194,34 +203,56 @@ void HandleMessage_SetWindowAttr(CClient& client, CDeserialiser& message) void HandleMessage_GetWindowAttr(CClient& client, CDeserialiser& message) { - assert(!"TODO"); + assert(!"TODO HandleMessage_GetWindowAttr"); } void HandleMessage_SendIPC(CClient& client, CDeserialiser& message) { - assert(!"TODO"); + assert(!"TODO HandleMessage_SendIPC"); } void HandleMessage_GetWindowBuffer(CClient& client, CDeserialiser& message) { - assert(!"TODO"); + assert(!"TODO HandleMessage_GetWindowBuffer"); } void HandleMessage_PushData(CClient& client, CDeserialiser& message) { - assert(!"TODO"); + uint16_t win_id = message.ReadU16(); + uint16_t x = message.ReadU16(); + uint16_t y = message.ReadU16(); + uint16_t w = message.ReadU16(); + uint16_t h = message.ReadU16(); + _SysDebug("_PushData: (%i, (%i,%i) %ix%i)", win_id, x, y, w, h); + + CWindow* win = client.GetWindow(win_id); + if(!win) { + throw IPC::CClientFailure("_PushData: Bad window"); + } + + for( unsigned int row = 0; row < h; row ++ ) + { + const ::std::vector scanline_data = message.ReadBuffer(); + _SysDebug("_PushData: Scanline %i: %i bytes", row, scanline_data.size()); + if( scanline_data.size() != w * 4 ) { + _SysDebug("ERROR _PushData: Scanline buffer size mismatch (%i,%i)", + scanline_data.size(), w*4); + continue ; + } + win->m_surface.DrawScanline(y+row, x, w, scanline_data.data()); + } } void HandleMessage_Blit(CClient& client, CDeserialiser& message) { - assert(!"TODO"); + assert(!"TODO HandleMessage_Blit"); } void HandleMessage_DrawCtl(CClient& client, CDeserialiser& message) { - assert(!"TODO"); + assert(!"TODO HandleMessage_DrawCtl"); } void HandleMessage_DrawText(CClient& client, CDeserialiser& message) { - assert(!"TODO"); + assert(!"TODO HandleMessage_DrawText"); } typedef void MessageHandler_op_t(CClient& client, CDeserialiser& message); @@ -253,7 +284,9 @@ void HandleMessage(CClient& client, CDeserialiser& message) return ; } + _SysDebug("IPC::HandleMessage - command=%i", command); (message_handlers[command])(client, message); + _SysDebug("IPC::HandleMessage - Completed"); } CClientFailure::CClientFailure(std::string&& what):