#include <stdio.h>
#include <wm.h>
#include <wm_internals.h>
-#include <wm_hotkeys.h>
+#include <wm_hotkeys.h> // Hotkey registration
+#include <wm_renderer.h> // Renderer IPC messages
#define AXWIN_PORT 4101
}
}
- 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");
return NULL;
if( WindowID >= Client->nWindows ) {
-// _SysDebug("Window %i out of range for %p (%i)", WindowID, Client, Client->nWindows);
return NULL;
}
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 ;
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;
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);
+}
+