X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin4_src%2FServer%2Fipc.cpp;h=d41d2ce49cd1929560637f1ce2aa8b7b729e15f5;hb=32637a3bcd6e38425272f901745a76efa301afd5;hp=f830820b3767aac575a47ad9da80ca0c29519e9f;hpb=0868c6e02b76236ea70a6daa232b3c373f61e131;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin4_src/Server/ipc.cpp b/Usermode/Applications/axwin4_src/Server/ipc.cpp index f830820b..d41d2ce4 100644 --- a/Usermode/Applications/axwin4_src/Server/ipc.cpp +++ b/Usermode/Applications/axwin4_src/Server/ipc.cpp @@ -1,4 +1,9 @@ /* + * Acess2 GUI v4 + * - By John Hodge (thePowersGang) + * + * ipc.cpp + * - Client-Server communication (dispatch) */ #define __STDC_LIMIT_MACROS #include @@ -13,6 +18,7 @@ extern "C" { #include }; #include +#include namespace AxWin { namespace IPC { @@ -39,10 +45,9 @@ void Initialise(const CConfigIPC& config, CCompositor& compositor) int FillSelect(fd_set& rfds) { int ret = 0; - _SysDebug("IPC::FillSelect"); - 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; @@ -50,10 +55,9 @@ int FillSelect(fd_set& rfds) void HandleSelect(const fd_set& rfds) { - _SysDebug("IPC::HandleSelect"); - for( auto channel : glChannels ) + for( const auto channel : glChannels ) { - _SysDebug("IPC::HandleSelect - channel=%p", channel); + assert(channel); channel->HandleSelect(rfds); } } @@ -71,9 +75,15 @@ void DeregisterClient(CClient& client) } +void SendMessage_NotifyDims(CClient& client, unsigned int NewW, unsigned int NewH) +{ + _SysDebug("TODO: CClient::SendNotify_Dims"); +} + void HandleMessage_Nop(CClient& client, CDeserialiser& message) { + // Do nothing } void HandleMessage_Reply(CClient& client, CDeserialiser& message) { @@ -118,6 +128,9 @@ void HandleMessage_GetGlobalAttr(CClient& client, CDeserialiser& message) reply.WriteU16( (w <= UINT16_MAX ? w : UINT16_MAX) ); reply.WriteU16( (h <= UINT16_MAX ? h : UINT16_MAX) ); break; } + case IPC_GLOBATTR_MAXAREA: + assert(!"TODO: IPC_GLOBATTR_MAXAREA"); + break; default: throw IPC::CClientFailure("Bad global attribute ID"); } @@ -156,10 +169,11 @@ void HandleMessage_CreateWindow(CClient& client, CDeserialiser& message) 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); @@ -171,10 +185,11 @@ void HandleMessage_SetWindowAttr(CClient& client, CDeserialiser& message) { uint16_t win_id = message.ReadU16(); uint16_t attr_id = message.ReadU16(); - + _SysDebug("_SetWindowAttr: (Win=%i, ID=%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) @@ -183,14 +198,21 @@ 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; } + case IPC_WINATTR_SHOW: + win->Show( message.ReadU8() != 0 ); + break; + case IPC_WINATTR_FLAGS: + win->SetFlags( message.ReadU8() ); // TODO: U8? why so small? + break; + case IPC_WINATTR_TITLE: + assert(!"TODO: IPC_WINATTR_TITLE"); + break; default: _SysDebug("HandleMessage_SetWindowAttr - Bad attr %u", attr_id); throw IPC::CClientFailure("Bad window attr"); @@ -199,34 +221,117 @@ 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"); + uint16_t win_id = message.ReadU16(); + _SysDebug("_GetWindowBuffer: (%i)", win_id); + + CWindow* win = client.GetWindow(win_id); + if(!win) { + throw IPC::CClientFailure("_PushData: Bad window"); + } + + uint64_t handle = win->m_surface.GetSHMHandle(); + + CSerialiser reply; + reply.WriteU8(IPCMSG_REPLY); + reply.WriteU8(IPCMSG_GETWINBUF); + reply.WriteU16(win_id); + reply.WriteU64(handle); + client.SendMessage(reply); +} + +void HandleMessage_DamageRect(CClient& client, CDeserialiser& message) +{ + uint16_t winid = message.ReadU16(); + uint16_t x = message.ReadU16(); + uint16_t y = message.ReadU16(); + uint16_t w = message.ReadU16(); + uint16_t h = message.ReadU16(); + + _SysDebug("_DamageRect: (%i %i,%i %ix%i)", winid, x, y, w, h); + + CWindow* win = client.GetWindow(winid); + if(!win) { + throw IPC::CClientFailure("_PushData: Bad window"); + } + + CRect area(x,y,w,h); + + win->Repaint(area); } 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(); + if( scanline_data.size() != w * 4 ) { + _SysDebug("ERROR _PushData: Scanline buffer size mismatch (%i,%i)", + scanline_data.size(), w*4); + continue ; + } + win->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"); + 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(); + uint16_t ctrl_id = message.ReadU16(); + uint16_t frame = message.ReadU16(); + _SysDebug("_DrawCtl: (%i, (%i,%i) %ix%i Ctl%i frame?=0x%04x)", win_id, x, y, w, h, ctrl_id, frame); + + CWindow* win = client.GetWindow(win_id); + if(!win) { + throw IPC::CClientFailure("_DrawCtl: Bad window"); + } + + const CControl* ctrl = CControl::GetByID(ctrl_id); + if(!ctrl) { + throw IPC::CClientFailure("_DrawCtl: Invalid control ID"); + } + + CRect area(x,y,w,h); + ctrl->Render(win->m_surface, area); } void HandleMessage_DrawText(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(); + ::std::string str = message.ReadString(); + + assert(!"TODO HandleMessage_DrawText"); } typedef void MessageHandler_op_t(CClient& client, CDeserialiser& message); @@ -244,6 +349,7 @@ MessageHandler_op_t *message_handlers[] = { [IPCMSG_GETWINATTR] = &HandleMessage_GetWindowAttr, [IPCMSG_SENDIPC] = &HandleMessage_SendIPC, // Use the GUI server for low-bandwith IPC [IPCMSG_GETWINBUF] = &HandleMessage_GetWindowBuffer, + [IPCMSG_DAMAGERECT] = &HandleMessage_DamageRect, [IPCMSG_PUSHDATA] = &HandleMessage_PushData, // to a window's buffer [IPCMSG_BLIT] = &HandleMessage_Blit, // Copy data from one part of the window to another [IPCMSG_DRAWCTL] = &HandleMessage_DrawCtl, // Draw a control @@ -258,9 +364,7 @@ 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):