#include <axwin3/axwin.h>
#include <stdlib.h>
#include <string.h>
-#include "include/ipc.h"
#include "include/internal.h"
+#include "include/ipc.h"
#define WINDOWS_PER_ALLOC (63)
return ret;
}
+tWindow *AxWin3_int_GetWindowFromID(uint32_t ServerID)
+{
+ tWindowBlock *block = &gAxWin3_WindowList;
+ while(block && ServerID > WINDOWS_PER_ALLOC) {
+ block = block->Next;
+ ServerID -= WINDOWS_PER_ALLOC;
+ }
+ if(!block) return NULL;
+ return block->Windows[ServerID];
+}
+
tWindow *AxWin3_int_AllocateWindowInfo(int DataBytes, int *WinID)
{
int idx, newWinID;
- tWindowBlock *block, *prev;
+ tWindowBlock *block, *prev = NULL;
tWindow *ret;
block = &gAxWin3_WindowList;
return ret;
}
+int AxWin3_GetDisplayCount(void)
+{
+ tAxWin_IPCMessage *msg;
+ tIPCMsg_ReturnInt *ret;
+ int rv;
+
+ msg = AxWin3_int_AllocateIPCMessage(NULL, IPCMSG_GETDISPLAYCOUNT, IPCMSG_FLAG_RETURN, 0);
+ AxWin3_int_SendIPCMessage(msg);
+ free(msg);
+
+ msg = AxWin3_int_WaitIPCMessage(IPCMSG_GETDISPLAYCOUNT);
+ if(msg->Size < sizeof(*ret)) return -1;
+ ret = (void*)msg->Data;
+ rv = ret->Value;
+ free(msg);
+ return rv;
+}
+
+int AxWin3_GetDisplayDims(int Display, int *X, int *Y, int *Width, int *Height)
+{
+ tAxWin_IPCMessage *msg;
+ tIPCMsg_GetDisplayDims *req;
+ tIPCMsg_RetDisplayDims *ret;
+
+ msg = AxWin3_int_AllocateIPCMessage(NULL, IPCMSG_GETDISPLAYDIMS, IPCMSG_FLAG_RETURN, sizeof(*req));
+ req = (void*)msg->Data;
+ req->DisplayID = Display;
+ AxWin3_int_SendIPCMessage(msg);
+ free(msg);
+
+ msg = AxWin3_int_WaitIPCMessage(IPCMSG_GETDISPLAYDIMS);
+ if(msg->Size < sizeof(*ret)) return -1;
+ ret = (void*)msg->Data;
+
+ if(X) *X = ret->X;
+ if(X) *X = ret->Y;
+ if(Width) *Width = ret->W;
+ if(Height) *Height = ret->H;
+
+ return 0;
+}
+
tHWND AxWin3_CreateWindow(
- tHWND Parent, const char *Renderer, int Flags,
- int DataBytes, void **DataPtr,
- tAxWin3_WindowMessageHandler MessageHandler
+ tHWND Parent, const char *Renderer, int RendererArg,
+ int DataBytes, tAxWin3_WindowMessageHandler MessageHandler
)
{
tWindow *ret;
msg = AxWin3_int_AllocateIPCMessage(Parent, IPCMSG_CREATEWIN, 0, dataSize);
create_win = (void*)msg->Data;
create_win->NewWinID = newWinID;
- create_win->Flags = Flags;
+ create_win->RendererArg = RendererArg;
strcpy(create_win->Renderer, Renderer);
// Send and clean up
// TODO: Detect and handle possible errors
// Return success
- if(DataPtr) *DataPtr = ret->Data;
return ret;
}
free(msg);
}
+void *AxWin3_int_GetDataPtr(tHWND Window)
+{
+ return Window->Data;
+}
+
+void AxWin3_int_HandleMessage(tAxWin_IPCMessage *Msg)
+{
+ tWindow *dest;
+
+ dest = AxWin3_int_GetWindowFromID(Msg->Window);
+
+ switch(Msg->ID)
+ {
+ case IPCMSG_SENDMSG: {
+ tIPCMsg_SendMsg *info = (void*)Msg->Data;
+ if(Msg->Size < sizeof(*info) || Msg->Size < sizeof(*info) + info->Length) {
+ _SysDebug("Message is undersized (%i < %i + %i)",
+ Msg->Size < sizeof(*info), info->Length);
+ return ;
+ }
+ if(!dest || !dest->Handler) {
+ _SysDebug("No handler for destination %p", dest);
+ return ;
+ }
+ _SysDebug("IPC Message 0x%x - %i bytes", info->ID, info->Length);
+ dest->Handler(dest, info->ID, info->Length, info->Data);
+ break; }
+ default:
+ _SysDebug("Unknow message ID %i", Msg->ID);
+ break;
+ }
+}
+
+void AxWin3_SetWindowTitle(tHWND Window, const char *Title)
+{
+ tAxWin_IPCMessage *msg;
+ int len = strlen(Title);
+
+ msg = AxWin3_int_AllocateIPCMessage(Window, IPCMSG_SETWINTITLE, 0, len+1);
+ strcpy(msg->Data, Title);
+
+ AxWin3_int_SendIPCMessage(msg);
+
+ free(msg);
+}
+
+void AxWin3_SendMessage(tHWND Window, tHWND Destination, int Message, int Length, void *Data)
+{
+ tAxWin_IPCMessage *msg;
+ tIPCMsg_SendMsg *info;
+
+ msg = AxWin3_int_AllocateIPCMessage(Window, IPCMSG_SENDMSG, 0, sizeof(*info)+Length);
+ info = (void*)msg->Data;
+ info->Remote = AxWin3_int_GetWindowID(Destination);
+ info->ID = Message;
+ info->Length = Length;
+ memcpy(info->Data, Data, Length);
+
+ AxWin3_int_SendIPCMessage(msg);
+ free(msg);
+}
+
+void AxWin3_FocusWindow(tHWND Window)
+{
+ tAxWin_IPCMessage *msg;
+
+ msg = AxWin3_int_AllocateIPCMessage(Window, IPCMSG_FOCUSWINDOW, 0, 0);
+
+ AxWin3_int_SendIPCMessage(msg);
+ free(msg);
+}
+
void AxWin3_ShowWindow(tHWND Window, int bShow)
{
tAxWin_IPCMessage *msg;
- tIPCMsg_ShowWindow *info;
+ tIPCMsg_Boolean *info;
msg = AxWin3_int_AllocateIPCMessage(Window, IPCMSG_SHOWWINDOW, 0, sizeof(*info));
info = (void*)msg->Data;
- info->bShow = !!bShow;
+ info->Value = !!bShow;
+
+ AxWin3_int_SendIPCMessage(msg);
+
+ free(msg);
+}
+
+void AxWin3_DecorateWindow(tHWND Window, int bDecorate)
+{
+ tAxWin_IPCMessage *msg;
+ tIPCMsg_Boolean *info;
+
+ msg = AxWin3_int_AllocateIPCMessage(Window, IPCMSG_DECORATEWINDOW, 0, sizeof(*info));
+ info = (void*)msg->Data;
+ info->Value = !!bDecorate;
AxWin3_int_SendIPCMessage(msg);
msg = AxWin3_int_AllocateIPCMessage(Window, IPCMSG_SETWINPOS, 0, sizeof(*info));
info = (void*)msg->Data;
- info->Fields = 0xF;
+ info->bSetPos = 1;
+ info->bSetDims = 1;
info->X = X; info->Y = Y;
info->W = W; info->H = H;
msg = AxWin3_int_AllocateIPCMessage(Window, IPCMSG_SETWINPOS, 0, sizeof(*info));
info = (void*)msg->Data;
- info->Fields = 0x3;
+ info->bSetPos = 1;
+ info->bSetDims = 0;
info->X = X;
info->Y = Y;
msg = AxWin3_int_AllocateIPCMessage(Window, IPCMSG_SETWINPOS, 0, sizeof(*info));
info = (void*)msg->Data;
- info->Fields = 0xC;
+ info->bSetPos = 0;
+ info->bSetDims = 1;
info->W = W;
info->H = H;