X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fipc.c;h=92f898465615a8518b74891e340e286ae7696f98;hb=54ee7218058b4285be6b02195cba4e90c4e12a2d;hp=a21c7835711a9d6c88c2f094af0bb26320115c7b;hpb=2f786d7164faa96acf47281debc2b458318701d0;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/ipc.c b/Usermode/Applications/axwin3_src/WM/ipc.c index a21c7835..92f89846 100644 --- a/Usermode/Applications/axwin3_src/WM/ipc.c +++ b/Usermode/Applications/axwin3_src/WM/ipc.c @@ -12,6 +12,7 @@ #include #include #include +#include #define AXWIN_PORT 4101 @@ -37,6 +38,8 @@ struct sIPC_Client tWindow **Windows; }; +// === IMPORTS === +extern tWindow *gpWM_FocusedWindow; // Needed for _FocusWindow // === PROTOTYPES === void IPC_Init(void); @@ -256,10 +259,88 @@ void IPC_int_SetWindow(tIPC_Client *Client, uint32_t WindowID, tWindow *WindowPt } // --- IPC Message Handlers --- +int IPC_Msg_Ping(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + ASSERT(Msg->ID == IPCMSG_PING); + + if( !(Msg->Flags & IPCMSG_FLAG_RETURN) ) return 0; + + if( Msg->Size < 4 ) return -1; + + tIPCMsg_ReturnInt *ret = (void*)Msg->Data; + Msg->ID = IPCMSG_PING; + Msg->Size = sizeof(*ret); + ret->Value = AXWIN_VERSION; + Client->IPCType->SendMessage(Client->Ident, sizeof(*Msg)+sizeof(*ret), Msg); + return 0; +} + +int IPC_Msg_GetDisplayCount(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tAxWin_IPCMessage *ret_hdr; + tIPCMsg_ReturnInt *ret; + char buf[sizeof(*ret_hdr)+sizeof(*ret)]; + + ASSERT(Msg->ID == IPCMSG_GETDISPLAYCOUNT); + + if( !(Msg->Flags & IPCMSG_FLAG_RETURN) ) return 0; + + ret_hdr = (void*)buf; + ret_hdr->ID = IPCMSG_GETDISPLAYCOUNT; + ret_hdr->Flags = 0; + ret_hdr->Window = -1; + ret_hdr->Size = sizeof(*ret); + ret = (void*)ret_hdr->Data; + ret->Value = 1; // HARD CODE - Current version only supports one display + + Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf); + return 0; +} + +int IPC_Msg_GetDisplayDims(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tIPCMsg_GetDisplayDims *info; + tAxWin_IPCMessage *ret_hdr; + tIPCMsg_RetDisplayDims *ret; + char buf[sizeof(*ret_hdr)+sizeof(*ret)]; + + ASSERT(Msg->ID == IPCMSG_GETDISPLAYDIMS); + + if( !(Msg->Flags & IPCMSG_FLAG_RETURN) ) return 0; + + info = (void*)Msg->Data; + + ret_hdr = (void*)buf; + ret_hdr->ID = IPCMSG_GETDISPLAYDIMS; + ret_hdr->Flags = 0; + ret_hdr->Window = -1; + ret_hdr->Size = sizeof(*ret); + ret = (void*)ret_hdr->Data; + + // HARD CODE! Only one display supported + if( info->DisplayID == 0 ) + { + ret->X = 0; + ret->Y = 0; + ret->W = giScreenWidth; + ret->H = giScreenHeight; + } + else + { + ret->X = 0; ret->Y = 0; + ret->W = 0; ret->H = 0; + } + + Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf); + return 0; +} + int IPC_Msg_SendMsg(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { tIPCMsg_SendMsg *info = (void*)Msg->Data; tWindow *src, *dest; + + ASSERT(Msg->ID == IPCMSG_SENDMSG); // - Sanity checks if( Msg->Size < sizeof(tIPCMsg_SendMsg) ) @@ -282,12 +363,23 @@ int IPC_Msg_CreateWin(tIPC_Client *Client, tAxWin_IPCMessage *Msg) tIPCMsg_CreateWin *info = (void*)Msg->Data; tWindow *newwin, *parent; + ASSERT(Msg->ID == IPCMSG_CREATEWIN); + // - Sanity checks // > +1 is for NULL byte on string - if( Msg->Size < sizeof(tIPCMsg_CreateWin) + 1 ) + if( Msg->Size < sizeof(*info) + 1 ) { + _SysDebug("IPC_Msg_CreateWin: Size check 1 failed"); return -1; - if( info->Renderer[Msg->Size - sizeof(tIPCMsg_CreateWin)] != '\0' ) + } + if( info->Renderer[Msg->Size - sizeof(*info) - 1] != '\0' ) { + _SysDebug("IPC_Msg_CreateWin: Size check 2 failed"); + _SysDebug("info = {"); + _SysDebug(" .NewWinID = %i", info->NewWinID); + _SysDebug(" .RendererArg = %i", info->RendererArg); + _SysDebug(" .Renderer = '%.*s'", Msg->Size - sizeof(*info), info->Renderer); + _SysDebug("}"); return -1; + } // - Get the parent window ID parent = IPC_int_GetWindow(Client, Msg->Window); @@ -303,18 +395,69 @@ int IPC_Msg_CreateWin(tIPC_Client *Client, tAxWin_IPCMessage *Msg) return 0; } +int IPC_Msg_SetWindowTitle(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tWindow *win; + + ASSERT(Msg->ID == IPCMSG_SETWINTITLE); + + if( Msg->Size < 1 ) return -1; + if( Msg->Data[ Msg->Size-1 ] != '\0' ) return -1; + + win = IPC_int_GetWindow(Client, Msg->Window); + if(!win) return 1; + + WM_SetWindowTitle(win, Msg->Data); + + return 0; +} + int IPC_Msg_ShowWindow(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { - tIPCMsg_ShowWindow *info = (void*)Msg->Data; + tIPCMsg_Boolean *info = (void*)Msg->Data; tWindow *win; + ASSERT(Msg->ID == IPCMSG_SHOWWINDOW); + if( Msg->Size < sizeof(*info) ) return -1; win = IPC_int_GetWindow(Client, Msg->Window); if(!win) return 1; - WM_ShowWindow(win, !!info->bShow); + WM_ShowWindow(win, !!info->Value); + + return 0; +} + +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; } @@ -323,6 +466,8 @@ 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); @@ -338,6 +483,28 @@ int IPC_Msg_SetWinPos(tIPC_Client *Client, tAxWin_IPCMessage *Msg) 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; @@ -353,51 +520,21 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW client = IPC_int_GetClient(IPCType, Ident); - switch((enum eAxWin_IPCMessageTypes) Msg->ID) - { - // --- Ping message (reset timeout and get server version) - case IPCMSG_PING: - _SysDebug(" IPC_Handle: IPCMSG_PING"); - if( Msg->Size < 4 ) return; - if( Msg->Flags & IPCMSG_FLAG_RETURN ) - { - Msg->ID = IPCMSG_PING; - Msg->Size = sizeof(tIPCMsg_Return); - ((tIPCMsg_Return*)Msg->Data)->Value = AXWIN_VERSION; - IPCType->SendMessage(Ident, sizeof(tIPCMsg_Return), Msg); - } - break; - - // --- Send a message - case IPCMSG_SENDMSG: - _SysDebug(" IPC_Handle: IPCMSG_SENDMSG %i", ((tIPCMsg_SendMsg*)Msg->Data)->ID); - rv = IPC_Msg_SendMsg(client, Msg); - break; - - // --- Create window - case IPCMSG_CREATEWIN: - _SysDebug(" IPC_Handle: IPCMSG_CREATEWIN"); - rv = IPC_Msg_CreateWin(client, Msg); - break; - // --- Show/Hide a window - case IPCMSG_SHOWWINDOW: - _SysDebug(" IPC_Handle: IPCMSG_SHOWWINDOW"); - rv = IPC_Msg_ShowWindow(client, Msg); - break; - // --- Move/Resize a window - case IPCMSG_SETWINPOS: - _SysDebug(" IPC_Handle: IPCMSG_SETWINPOS"); - rv = IPC_Msg_SetWinPos(client, Msg); - break; - - // --- Unknown message - default: + 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); - break; + return ; } - if(rv) - _SysDebug("IPC_Handle: rv = %i", rv); + + 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