#include <acess/sys.h>
#include <string.h>
#include <stdlib.h>
-#include "include/ipc.h"
+#include <ipcmessages.h> // AxWin3 common
#include "include/internal.h"
+#include "include/ipc.h"
// === CONSTANTS ===
enum eConnectionType
return old;
}
+uint32_t AxWin3_int_GetWindowID(tHWND Window)
+{
+ if(Window)
+ return Window->ServerID;
+ else
+ return -1;
+}
+
tAxWin_IPCMessage *AxWin3_int_AllocateIPCMessage(tHWND Window, int Message, int Flags, int ExtraBytes)
{
tAxWin_IPCMessage *ret;
ret = malloc( sizeof(tAxWin_IPCMessage) + ExtraBytes );
ret->Flags = Flags;
ret->ID = Message;
- if(Window)
- ret->Window = Window->ServerID;
- else
- ret->Window = -1;
+ ret->Window = AxWin3_int_GetWindowID(Window);
ret->Size = ExtraBytes;
return ret;
}
switch(giConnectionType)
{
case CONNTYPE_SENDMESSAGE:
- // TODO: Less hack, I need a version of select for GetMessage etc
- if(SysGetMessage(NULL, NULL) == 0) sleep();
+ _SysWaitEvent(THREAD_EVENT_IPCMSG);
while(SysGetMessage(NULL, NULL))
{
pid_t tid;
// Check if the message came from the server
if(tid != giConnectionNum)
{
+ _SysDebug("%i byte message from %i", len, tid);
// If not, pass the buck (or ignore)
if( gAxWin3_MessageCallback )
gAxWin3_MessageCallback(tid, len);
// If it's from the server, allocate a buffer and return it
ret = malloc(len);
- if(ret == NULL) return NULL;
+ if(ret == NULL) {
+ _SysDebug("malloc() failed, ignoring message");
+ SysGetMessage(NULL, GETMSG_IGNORE);
+ return NULL;
+ }
SysGetMessage(NULL, ret);
break;
}
return ret;
}
+tAxWin_IPCMessage *AxWin3_int_WaitIPCMessage(int WantedID)
+{
+ tAxWin_IPCMessage *msg;
+ for(;;)
+ {
+ msg = AxWin3_int_GetIPCMessage();
+ if(msg->ID == WantedID) return msg;
+ AxWin3_int_HandleMessage( msg );
+ free(msg);
+ }
+}
+