X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fipc.c;h=46aff215dd9287e7995fd75dff7bbe16cef66d94;hb=b1488ae9beae34068d38d00e191b90ef0bf812f3;hp=3f55930b709b7d2e5ebf101b5a313d849846f00e;hpb=e33b0db4c03c7664cc34a45e1da2981287e0cd0c;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/ipc.c b/Usermode/Applications/axwin3_src/WM/ipc.c index 3f55930b..46aff215 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 @@ -20,7 +21,6 @@ // === TYPES === typedef struct sIPC_Type tIPC_Type; -typedef struct sIPC_Client tIPC_Client; struct sIPC_Type { @@ -38,6 +38,8 @@ struct sIPC_Client tWindow **Windows; }; +// === IMPORTS === +extern tWindow *gpWM_FocusedWindow; // Needed for _FocusWindow // === PROTOTYPES === void IPC_Init(void); @@ -96,7 +98,7 @@ void IPC_HandleSelect(fd_set *set) msg = staticBuf + identlen; IPC_Handle(&gIPC_Type_Datagram, staticBuf, readlen - identlen, (void*)msg); - _SysDebug("IPC_HandleSelect: UDP handled"); +// _SysDebug("IPC_HandleSelect: UDP handled"); } while(SysGetMessage(NULL, NULL)) @@ -107,7 +109,7 @@ void IPC_HandleSelect(fd_set *set) SysGetMessage(NULL, data); IPC_Handle(&gIPC_Type_SysMessage, &tid, len, (void*)data); - _SysDebug("IPC_HandleSelect: Message handled"); +// _SysDebug("IPC_HandleSelect: Message handled"); } } @@ -257,6 +259,43 @@ void IPC_int_SetWindow(tIPC_Client *Client, uint32_t WindowID, tWindow *WindowPt } // --- IPC Message Handlers --- +int IPC_Msg_SendMsg(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tIPCMsg_SendMsg *info = (void*)Msg->Data; + tWindow *src, *dest; + + // - Sanity checks + if( Msg->Size < sizeof(tIPCMsg_SendMsg) ) + return -1; + if( Msg->Size < sizeof(tIPCMsg_SendMsg) + info->Length ) + return -1; + + src = IPC_int_GetWindow(Client, Msg->Window); + if(!src) return 1; + dest = IPC_int_GetWindow(Client, info->Remote); + if(!dest) return 1; + + WM_SendMessage(src, dest, info->ID, info->Length, info->Data); + + return 0; +} + +int IPC_Msg_FocusWindow(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tWindow *win; + + // 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_CreateWin(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { tIPCMsg_CreateWin *info = (void*)Msg->Data; @@ -264,10 +303,19 @@ int IPC_Msg_CreateWin(tIPC_Client *Client, tAxWin_IPCMessage *Msg) // - 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); @@ -277,15 +325,30 @@ int IPC_Msg_CreateWin(tIPC_Client *Client, tAxWin_IPCMessage *Msg) return 1; // - Create the new window, and save its pointer - newwin = WM_CreateWindow(parent, info->RendererArg, info->Renderer); + newwin = WM_CreateWindow(parent, Client, info->NewWinID, info->RendererArg, info->Renderer); IPC_int_SetWindow(Client, info->NewWinID, newwin); return 0; } +int IPC_Msg_SetWindowTitle(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tWindow *win; + + 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; if( Msg->Size < sizeof(*info) ) return -1; @@ -293,8 +356,22 @@ int IPC_Msg_ShowWindow(tIPC_Client *Client, tAxWin_IPCMessage *Msg) 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; } @@ -318,6 +395,62 @@ int IPC_Msg_SetWinPos(tIPC_Client *Client, tAxWin_IPCMessage *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)]; + + 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)]; + + 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; +} + void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxWin_IPCMessage *Msg) { tIPC_Client *client; @@ -341,23 +474,57 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW if( Msg->Size < 4 ) return; if( Msg->Flags & IPCMSG_FLAG_RETURN ) { + tIPCMsg_ReturnInt *ret = (void*)Msg->Data; Msg->ID = IPCMSG_PING; - Msg->Size = sizeof(tIPCMsg_Return); - ((tIPCMsg_Return*)Msg->Data)->Value = AXWIN_VERSION; - IPCType->SendMessage(Ident, sizeof(tIPCMsg_Return), Msg); + Msg->Size = sizeof(*ret); + ret->Value = AXWIN_VERSION; + IPCType->SendMessage(Ident, sizeof(*Msg)+sizeof(*ret), Msg); } break; + // -- Get display count + case IPCMSG_GETDISPLAYCOUNT: + rv = IPC_Msg_GetDisplayCount(client, Msg); + break; + + // --- Get display dimensions + case IPCMSG_GETDISPLAYDIMS: + rv = IPC_Msg_GetDisplayDims(client, 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; + // TODO: Destroy window + + // --- Set window title + case IPCMSG_SETWINTITLE: + _SysDebug(" IPC_Handle: IPCMSG_SETWINTITLE"); + rv = IPC_Msg_SetWindowTitle(client, Msg); + break; + + // --- Give a window focus + case IPCMSG_FOCUSWINDOW: + _SysDebug(" IPC_Handle: IPCMSG_FOCUSWINDOW"); + rv = IPC_Msg_FocusWindow(client, Msg); + break; // --- Show/Hide a window case IPCMSG_SHOWWINDOW: _SysDebug(" IPC_Handle: IPCMSG_SHOWWINDOW"); rv = IPC_Msg_ShowWindow(client, Msg); break; + case IPCMSG_DECORATEWINDOW: + _SysDebug(" IPC_Handle: IPCMSG_DECORATEWINDOW"); + rv = IPC_Msg_DecorateWindow(client, Msg); + break; // --- Move/Resize a window case IPCMSG_SETWINPOS: _SysDebug(" IPC_Handle: IPCMSG_SETWINPOS"); @@ -374,3 +541,26 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW _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); +} +