+
+int IPC_Msg_DecorateWindow(tIPC_Client *Client, tAxWin_IPCMessage *Msg)
+{
+ tIPCMsg_Boolean *info = (void*)Msg->Data;
+ tWindow *win;
+
+ if( Msg->Size < sizeof(*info) ) return -1;
+
+ win = IPC_int_GetWindow(Client, Msg->Window);
+ if(!win) return 1;
+
+ WM_DecorateWindow(win, !!info->Value);
+ return 0;
+}
+
+int IPC_Msg_FocusWindow(tIPC_Client *Client, tAxWin_IPCMessage *Msg)
+{
+ tWindow *win;
+
+ ASSERT(Msg->ID == IPCMSG_FOCUSWINDOW);
+
+ // Don't allow the focus to be changed unless the client has the focus
+ if(!gpWM_FocusedWindow) return 1;
+ if(gpWM_FocusedWindow->Client != Client) return 1;
+
+ win = IPC_int_GetWindow(Client, Msg->Window);
+ if(!win) return 1;
+
+ WM_FocusWindow(win);
+
+ return 0;
+}
+
+int IPC_Msg_SetWinPos(tIPC_Client *Client, tAxWin_IPCMessage *Msg)
+{
+ tIPCMsg_SetWindowPos *info = (void*)Msg->Data;
+ tWindow *win;
+
+ ASSERT(Msg->ID == IPCMSG_SETWINPOS);
+
+ if(Msg->Size < sizeof(*info)) return -1;
+
+ win = IPC_int_GetWindow(Client, Msg->Window);
+ if(!win) return 1;
+
+ _SysDebug("info = {..., bSetPos=%i,bSetDims=%i}", info->bSetPos, info->bSetDims);
+
+ if(info->bSetPos)
+ WM_MoveWindow(win, info->X, info->Y);
+ if(info->bSetDims)
+ WM_ResizeWindow(win, info->W, info->H);
+
+ return 0;
+}
+
+int IPC_Msg_RegisterAction(tIPC_Client *Client, tAxWin_IPCMessage *Msg)
+{
+ ASSERT(Msg->ID == IPCMSG_REGACTION);
+ return 0;
+}
+
+int (*gIPC_MessageHandlers[])(tIPC_Client *Client, tAxWin_IPCMessage *Msg) = {
+ IPC_Msg_Ping,
+ IPC_Msg_GetDisplayCount,
+ IPC_Msg_GetDisplayDims,
+ IPC_Msg_SendMsg,
+ IPC_Msg_CreateWin,
+ NULL, // Destroy window
+ IPC_Msg_SetWindowTitle,
+ IPC_Msg_ShowWindow,
+ IPC_Msg_DecorateWindow,
+ IPC_Msg_FocusWindow,
+ IPC_Msg_SetWinPos,
+ IPC_Msg_RegisterAction
+};
+const int giIPC_NumMessageHandlers = sizeof(gIPC_MessageHandlers)/sizeof(gIPC_MessageHandlers[0]);
+
+void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxWin_IPCMessage *Msg)
+{
+ tIPC_Client *client;
+ int rv = 0;
+
+ _SysDebug("IPC_Handle: (IPCType=%p, Ident=%p, MsgLen=%i, Msg=%p)",
+ IPCType, Ident, MsgLen, Msg);
+
+ if( MsgLen < sizeof(tAxWin_IPCMessage) )
+ return ;
+ if( MsgLen < sizeof(tAxWin_IPCMessage) + Msg->Size )
+ 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( !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: Msg->ID = %i", Msg->ID);
+ rv = gIPC_MessageHandlers[Msg->ID](client, Msg);
+ _SysDebug("IPC_Handle: rv = %i", rv);
+}
+
+// --- Server->Client replies
+void IPC_SendWMMessage(tIPC_Client *Client, uint32_t Src, uint32_t Dst, int MsgID, int Len, void *Data)
+{
+ tAxWin_IPCMessage *hdr;
+ tIPCMsg_SendMsg *msg;
+ char buf[sizeof(*hdr)+sizeof(*msg)+Len];
+
+ hdr = (void*)buf;
+ msg = (void*)hdr->Data;
+
+ hdr->ID = IPCMSG_SENDMSG;
+ hdr->Flags = 0;
+ hdr->Size = sizeof(*msg) + Len;
+ hdr->Window = Dst;
+
+ msg->Remote = Src;
+ msg->ID = MsgID;
+ msg->Length = Len;
+ memcpy(msg->Data, Data, Len);
+
+ Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf);
+}
+