X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fipc.c;h=2917bc9870467918290c7b24f082ec712e910798;hb=6312f7425503f27821671cb0aef9403f27ce7aca;hp=b3648bb7de5acdbb3ce5ce2c625b29705a0e26a3;hpb=11dbd684e9a3d907d43d71a3145205f1a86992fb;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/ipc.c b/Usermode/Applications/axwin3_src/WM/ipc.c index b3648bb7..2917bc98 100644 --- a/Usermode/Applications/axwin3_src/WM/ipc.c +++ b/Usermode/Applications/axwin3_src/WM/ipc.c @@ -13,6 +13,8 @@ #include #include #include +#include // Hotkey registration +#include // Renderer IPC messages #define AXWIN_PORT 4101 @@ -111,12 +113,12 @@ void IPC_HandleSelect(fd_set *set) } } - while(SysGetMessage(NULL, NULL)) + size_t len; + pid_t tid; + while( (len = SysGetMessage(&tid, 0, NULL)) ) { - pid_t tid; - int len = SysGetMessage(&tid, NULL); char data[len]; - SysGetMessage(NULL, data); + SysGetMessage(NULL, len, data); IPC_Handle(&gIPC_Type_SysMessage, &tid, len, (void*)data); // _SysDebug("IPC_HandleSelect: Message handled"); @@ -243,7 +245,6 @@ tWindow *IPC_int_GetWindow(tIPC_Client *Client, uint32_t WindowID) return NULL; if( WindowID >= Client->nWindows ) { -// _SysDebug("Window %i out of range for %p (%i)", WindowID, Client, Client->nWindows); return NULL; } @@ -495,7 +496,26 @@ int IPC_Msg_SetWinPos(tIPC_Client *Client, tAxWin_IPCMessage *Msg) int IPC_Msg_RegisterAction(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { + tIPCMsg_RegAction *info = (void*)Msg->Data; + tWindow *win; + ASSERT(Msg->ID == IPCMSG_REGACTION); + + if( Msg->Size < sizeof(*info) + 1 ) + return -1; + + win = IPC_int_GetWindow(Client, Msg->Window); + if(!win) return 1; + + if( strnlen(info->Action, Msg->Size - sizeof(*info)) == Msg->Size - sizeof(*info) ) + return 1; + + _SysDebug("RegisterAction %p:%i [%i]\"%s\"", + Client, Msg->Window, info->Index, info->Action + ); + + WM_Hotkey_RegisterAction(info->Action, win, info->Index); + return 0; } @@ -520,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 ; @@ -529,25 +549,53 @@ 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); + if( rv ) + _SysDebug("IPC_Handle: rv != 0 (%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); + if( rv ) + _SysDebug("IPC_Handle: rv != 0 (%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 +// Dispatch a message to the client void IPC_SendWMMessage(tIPC_Client *Client, uint32_t Src, uint32_t Dst, int MsgID, int Len, void *Data) { tAxWin_IPCMessage *hdr; @@ -570,3 +618,20 @@ void IPC_SendWMMessage(tIPC_Client *Client, uint32_t Src, uint32_t Dst, int MsgI Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf); } +// --- Server->Client replies +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); +} +