Usermode/AxWin3 - Cleaning up, graphics fixes and working on text cursor
[tpg/acess2.git] / Usermode / Applications / axwin3_src / WM / ipc.c
index 3f55930..46aff21 100644 (file)
@@ -12,6 +12,7 @@
 #include <ipcmessages.h>
 #include <stdio.h>
 #include <wm.h>
+#include <wm_internals.h>
 
 #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);
+}
+

UCC git Repository :: git.ucc.asn.au