X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fipc.c;h=38cd1335fa7f9837128132504b6a2a9fc96eae73;hb=ed78a9ac44c440180c37c1cbbbd7ecbc4d9076d7;hp=bc38fb558b12b322986e0ac401144e7922b3f1c1;hpb=21192b41da0f87dba07dac08b2d814b0976d929c;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/ipc.c b/Usermode/Applications/axwin3_src/WM/ipc.c index bc38fb55..38cd1335 100644 --- a/Usermode/Applications/axwin3_src/WM/ipc.c +++ b/Usermode/Applications/axwin3_src/WM/ipc.c @@ -13,7 +13,8 @@ #include #include #include -#include +#include // Hotkey registration +#include // Renderer IPC messages #define AXWIN_PORT 4101 @@ -539,8 +540,8 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW tIPC_Client *client; int rv = 0; - _SysDebug("IPC_Handle: (IPCType=%p, Ident=%p, MsgLen=%i, Msg=%p)", - IPCType, Ident, MsgLen, Msg); +// _SysDebug("IPC_Handle: (IPCType=%p, Ident=%p, MsgLen=%i, Msg=%p)", +// IPCType, Ident, MsgLen, Msg); if( MsgLen < sizeof(tAxWin_IPCMessage) ) return ; @@ -548,22 +549,48 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW return ; client = IPC_int_GetClient(IPCType, Ident); - - if( Msg->ID >= giIPC_NumMessageHandlers ) { - fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, IPCType); - _SysDebug("WARNING: Unknown message %i (%p)", Msg->ID, IPCType); - return ; + if( !client ) { + // Oops? } - if( !gIPC_MessageHandlers[ Msg->ID ] ) { - fprintf(stderr, "WARNING: Message %i does not have a handler\n", Msg->ID); - _SysDebug("WARNING: Message %i does not have a handler", Msg->ID); - return ; + if( Msg->Flags & IPCMSG_FLAG_RENDERER ) + { + tWindow *win = IPC_int_GetWindow(client, Msg->Window); + if( !win ) { + _SysDebug("WARNING: NULL window in message %i", Msg->ID); + return ; + } + tWMRenderer *renderer = win->Renderer; + if( Msg->ID >= renderer->nIPCHandlers ) { + _SysDebug("WARNING: Message %i out of range in %s", Msg->ID, renderer->Name); + return ; + } + if( !renderer->IPCHandlers[Msg->ID] ) { + _SysDebug("WARNING: Message %i has no handler in %s", Msg->ID, renderer->Name); + return ; + } + _SysDebug("IPC_Handle: Call %s-%i", renderer->Name, Msg->ID); + rv = renderer->IPCHandlers[Msg->ID](win, Msg->Size, Msg->Data); + _SysDebug("IPC_Handle: rv = %i", rv); + } + else + { + if( Msg->ID >= giIPC_NumMessageHandlers ) { + fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, IPCType); + _SysDebug("WARNING: Unknown message %i (%p)", Msg->ID, IPCType); + return ; + } + + if( !gIPC_MessageHandlers[ Msg->ID ] ) { + fprintf(stderr, "WARNING: Message %i does not have a handler\n", Msg->ID); + _SysDebug("WARNING: Message %i does not have a handler", Msg->ID); + return ; + } + + _SysDebug("IPC_Handle: Call WM-%i", Msg->ID); + rv = gIPC_MessageHandlers[Msg->ID](client, Msg); + _SysDebug("IPC_Handle: rv = %i", rv); } - - _SysDebug("IPC_Handle: Msg->ID = %i", Msg->ID); - rv = gIPC_MessageHandlers[Msg->ID](client, Msg); - _SysDebug("IPC_Handle: rv = %i", rv); } // --- Server->Client replies @@ -589,3 +616,19 @@ void IPC_SendWMMessage(tIPC_Client *Client, uint32_t Src, uint32_t Dst, int MsgI Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf); } +void IPC_SendReply(tIPC_Client *Client, uint32_t WinID, int MsgID, size_t Len, const void *Data) +{ + tAxWin_IPCMessage *hdr; + char buf[sizeof(*hdr)+Len]; + + hdr = (void*)buf; + + hdr->ID = MsgID; + hdr->Flags = IPCMSG_FLAG_RENDERER; + hdr->Size = Len; + hdr->Window = WinID; + + memcpy(hdr->Data, Data, Len); + Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf); +} +