Usermode/AxWin4 - Screen dimensions acquisition, speedup, window render
[tpg/acess2.git] / Usermode / Applications / axwin4_src / Server / ipc.cpp
index f830820..732ddfd 100644 (file)
@@ -39,10 +39,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 +49,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,6 +69,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)
 {
@@ -118,6 +121,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 +162,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 +178,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)
@@ -183,14 +191,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:
+               _SysDebug("TODO: IPC_WINATTR_FLAGS");
+               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 +214,55 @@ 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<uint8_t> 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");
+       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);
@@ -258,9 +294,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):

UCC git Repository :: git.ucc.asn.au