Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / Usermode / Applications / axwin3_src / WM / ipc.c
index aa02016..46aff21 100644 (file)
@@ -12,6 +12,7 @@
 #include <ipcmessages.h>
 #include <stdio.h>
 #include <wm.h>
+#include <wm_internals.h>
 
 #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);
@@ -277,6 +280,22 @@ int IPC_Msg_SendMsg(tIPC_Client *Client, tAxWin_IPCMessage *Msg)
        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;
@@ -284,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);
@@ -303,9 +331,24 @@ int IPC_Msg_CreateWin(tIPC_Client *Client, tAxWin_IPCMessage *Msg)
        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;
@@ -313,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;
 }
 
@@ -446,11 +503,28 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW
                _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");

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