OBJ := main.o input.o video.o ipc.o image.o utf-8.o
OBJ += wm.o wm_input.o wm_render.o wm_render_text.o wm_hotkeys.o
OBJ += decorator.o
-OBJ += renderers/passthru.o
+OBJ += renderers/framebuffer.o
OBJ += renderers/background.o
OBJ += renderers/menu.o
OBJ += renderers/richtext.o
* \return Boolean failure (0: Handled, 1: Unhandled)
*/
int (*HandleMessage)(tWindow *Window, int MessageID, int Length, const void *Data);
+
+ int nIPCHandlers;
+
+ /**
+ * \brief IPC Message handler
+ */
+ int (*IPCHandlers[])(tWindow *Window, size_t Length, const void *Data);
};
extern void WM_RegisterRenderer(tWMRenderer *Renderer);
extern tWindow *WM_CreateWindowStruct(size_t ExtraBytes);
+extern int WM_SendIPCReply(tWindow *Window, int Message, size_t Length, const void *Data);
#endif
#include <stdio.h>
#include <wm.h>
#include <wm_internals.h>
-#include <wm_hotkeys.h>
+#include <wm_hotkeys.h> // Hotkey registration
+#include <wm_renderer.h> // Renderer IPC messages
#define AXWIN_PORT 4101
tIPC_Client *client;
int rv = 0;
- _SysDebug("IPC_Handle: (IPCType=%p, Ident=%p, MsgLen=%i, Msg=%p)",
- IPCType, Ident, MsgLen, Msg);
+// _SysDebug("IPC_Handle: (IPCType=%p, Ident=%p, MsgLen=%i, Msg=%p)",
+// IPCType, Ident, MsgLen, Msg);
if( MsgLen < sizeof(tAxWin_IPCMessage) )
return ;
return ;
client = IPC_int_GetClient(IPCType, Ident);
-
- if( Msg->ID >= giIPC_NumMessageHandlers ) {
- fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, IPCType);
- _SysDebug("WARNING: Unknown message %i (%p)", Msg->ID, IPCType);
- return ;
+ if( !client ) {
+ // Oops?
}
- if( !gIPC_MessageHandlers[ Msg->ID ] ) {
- fprintf(stderr, "WARNING: Message %i does not have a handler\n", Msg->ID);
- _SysDebug("WARNING: Message %i does not have a handler", Msg->ID);
- return ;
+ if( Msg->Flags & IPCMSG_FLAG_RENDERER )
+ {
+ tWindow *win = IPC_int_GetWindow(client, Msg->Window);
+ if( !win ) {
+ _SysDebug("WARNING: NULL window in message %i", Msg->ID);
+ return ;
+ }
+ tWMRenderer *renderer = win->Renderer;
+ if( Msg->ID >= renderer->nIPCHandlers ) {
+ _SysDebug("WARNING: Message %i out of range in %s", Msg->ID, renderer->Name);
+ return ;
+ }
+ if( !renderer->IPCHandlers[Msg->ID] ) {
+ _SysDebug("WARNING: Message %i has no handler in %s", Msg->ID, renderer->Name);
+ return ;
+ }
+ _SysDebug("IPC_Handle: Call %s-%i", renderer->Name, Msg->ID);
+ rv = renderer->IPCHandlers[Msg->ID](win, Msg->Size, Msg->Data);
+ _SysDebug("IPC_Handle: rv = %i", rv);
+ }
+ else
+ {
+ if( Msg->ID >= giIPC_NumMessageHandlers ) {
+ fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, IPCType);
+ _SysDebug("WARNING: Unknown message %i (%p)", Msg->ID, IPCType);
+ return ;
+ }
+
+ if( !gIPC_MessageHandlers[ Msg->ID ] ) {
+ fprintf(stderr, "WARNING: Message %i does not have a handler\n", Msg->ID);
+ _SysDebug("WARNING: Message %i does not have a handler", Msg->ID);
+ return ;
+ }
+
+ _SysDebug("IPC_Handle: Call WM-%i", Msg->ID);
+ rv = gIPC_MessageHandlers[Msg->ID](client, Msg);
+ _SysDebug("IPC_Handle: rv = %i", rv);
}
-
- _SysDebug("IPC_Handle: Msg->ID = %i", Msg->ID);
- rv = gIPC_MessageHandlers[Msg->ID](client, Msg);
- _SysDebug("IPC_Handle: rv = %i", rv);
}
// --- Server->Client replies
Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf);
}
+void IPC_SendReply(tIPC_Client *Client, uint32_t WinID, int MsgID, size_t Len, const void *Data)
+{
+ tAxWin_IPCMessage *hdr;
+ char buf[sizeof(*hdr)+Len];
+
+ hdr = (void*)buf;
+
+ hdr->ID = MsgID;
+ hdr->Flags = IPCMSG_FLAG_RENDERER;
+ hdr->Size = Len;
+ hdr->Window = WinID;
+
+ memcpy(hdr->Data, Data, Len);
+ Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf);
+}
+
--- /dev/null
+/*
+ * Acess2 Window Manager v3
+ * - By John Hodge (thePowersGang)
+ *
+ * renderer_passthru.c
+ * - Passthrough window render (framebuffer essentially)
+ */
+#include <common.h>
+#include <wm_renderer.h>
+#include <string.h>
+#include <framebuffer_messages.h>
+#include <wm_messages.h>
+
+// === TYPES ===
+typedef struct
+{
+ short W, H;
+ void *Data;
+ char _data[];
+} tFBBuffer;
+typedef struct
+{
+ tFBBuffer BackBuffer;
+ int MaxBufferCount;
+ tFBBuffer *Buffers[];
+} tFBWin;
+
+// === PROTOTYPES ===
+tWindow *Renderer_Framebuffer_Create(int Flags);
+void Renderer_Framebuffer_Redraw(tWindow *Window);
+ int _Handle_Commit(tWindow *Target, size_t Len, const void *Data);
+ int _Handle_CreateBuf(tWindow *Target, size_t Len, const void *Data);
+ int Renderer_Framebuffer_HandleMessage(tWindow *Target, int Msg, int Len, const void *Data);
+
+// === GLOBALS ===
+tWMRenderer gRenderer_Framebuffer = {
+ .Name = "FrameBuffer",
+ .CreateWindow = Renderer_Framebuffer_Create,
+ .Redraw = Renderer_Framebuffer_Redraw,
+ .HandleMessage = Renderer_Framebuffer_HandleMessage,
+ .nIPCHandlers = N_IPC_FB,
+ .IPCHandlers = {
+ [IPC_FB_COMMIT] = _Handle_Commit,
+ [IPC_FB_NEWBUF] = _Handle_CreateBuf,
+ }
+};
+
+// === CODE ===
+int Renderer_Framebuffer_Init(void)
+{
+ WM_RegisterRenderer(&gRenderer_Framebuffer);
+ return 0;
+}
+
+tWindow *Renderer_Framebuffer_Create(int Flags)
+{
+ tWindow *ret;
+ tFBWin *info;
+ const int max_buffers = 10; // TODO: Have this be configurable
+
+ ret = WM_CreateWindowStruct( sizeof(*info) + max_buffers*sizeof(tFBBuffer*) );
+ info = ret->RendererInfo;
+
+ info->BackBuffer.W = 0;
+ info->BackBuffer.H = 0;
+ info->BackBuffer.Data = NULL;
+ info->MaxBufferCount = max_buffers;
+ memset( info->Buffers, 0, sizeof(tFBBuffer*) * max_buffers );
+
+ return ret;
+}
+
+void Renderer_Framebuffer_Redraw(tWindow *Window)
+{
+
+}
+
+// --- ---
+tFBBuffer *_GetBuffer(tWindow *Win, uint16_t ID)
+{
+ tFBWin *info = Win->RendererInfo;
+ if( ID == 0xFFFF )
+ return &info->BackBuffer;
+ else if( ID >= info->MaxBufferCount )
+ return NULL;
+ else
+ return info->Buffers[ ID ];
+}
+
+void _Blit(
+ tFBBuffer *Dest, uint16_t DX, uint16_t DY,
+ const tFBBuffer *Src, uint16_t SX, uint16_t SY,
+ uint16_t W, uint16_t H
+ )
+{
+ uint32_t *dest_data = Dest->Data;
+ const uint32_t *src_data = Src->Data;
+ // First, some sanity
+ if( DX > Dest->W ) return ;
+ if( DY > Dest->H ) return ;
+ if( SX > Src->W ) return ;
+ if( SY > Src->H ) return ;
+
+ if( DX + W > Dest->W ) W = Dest->W - DX;
+ if( SX + W > Src->W ) W = Src->W - SX;
+ if( DY + H > Dest->H ) H = Dest->H - DY;
+ if( SY + H > Src->H ) H = Src->H - SY;
+
+ dest_data += (DY * Dest->W) + DX;
+ src_data += (SY * Src->W ) + SX;
+ for( int i = 0; i < H; i ++ )
+ {
+ memcpy( dest_data, src_data, W * 4 );
+ dest_data += Dest->W;
+ src_data += Src->W;
+ }
+}
+
+void _Fill(tFBBuffer *Buf, uint16_t X, uint16_t Y, uint16_t W, uint16_t H, uint32_t Colour)
+{
+ uint32_t *data = Buf->Data;
+
+ if( X > Buf->W ) return ;
+ if( Y > Buf->H ) return ;
+ if( X + W > Buf->W ) W = Buf->W - X;
+ if( Y + H > Buf->H ) H = Buf->H - Y;
+
+ data += (Y * Buf->W) + X;
+ for( int i = 0; i < H; i ++ )
+ {
+ for( int j = 0; j < W; j ++ )
+ *data++ = Colour;
+ data += Buf->W - W;
+ }
+}
+
+// --- ---
+int _Handle_Commit(tWindow *Target, size_t Len, const void *Data)
+{
+ // Do a window invalidate
+ return 0;
+}
+
+int _Handle_CreateBuf(tWindow *Target, size_t Len, const void *Data)
+{
+ const tFBIPC_NewBuf *msg = Data;
+ tFBBuffer *buf;
+ tFBWin *info = Target->RendererInfo;
+
+ if( Len < sizeof(*msg) ) return -1;
+
+ if( msg->Buffer == -1 || msg->Buffer >= info->MaxBufferCount ) {
+ // Can't reallocate -1
+ return 1;
+ }
+
+ if( info->Buffers[msg->Buffer] ) {
+ free(info->Buffers[msg->Buffer]);
+ info->Buffers[msg->Buffer] = NULL;
+ }
+
+ buf = malloc(sizeof(tFBBuffer) + msg->W * msg->H * 4);
+ buf->W = msg->W;
+ buf->H = msg->H;
+ buf->Data = buf->_data;
+
+ info->Buffers[msg->Buffer] = buf;
+
+ return 0;
+}
+
+int _Handle_Upload(tWindow *Target, size_t Len, const void *Data)
+{
+ const tFBIPC_Transfer *msg = Data;
+ tFBBuffer *dest, src;
+
+ if( Len < sizeof(*msg) ) return -1;
+ if( Len < sizeof(*msg) + msg->W * msg->H * 4 ) return -1;
+
+ dest = _GetBuffer(Target, msg->Buffer);
+
+ src.W = msg->W;
+ src.H = msg->H;
+ src.Data = (void*)msg->ImageData;
+
+ _Blit( dest, msg->X, msg->Y, &src, 0, 0, msg->W, msg->H );
+ return 0;
+}
+
+int _Handle_Download(tWindow *Target, size_t Len, const void *Data)
+{
+ const tFBIPC_Transfer *msg = Data;
+ tFBBuffer dest, *src;
+
+ if( Len < sizeof(*msg) ) return -1;
+
+ src = _GetBuffer(Target, msg->Buffer);
+
+ tFBIPC_Transfer *ret;
+ int retlen = sizeof(*ret) + msg->W*msg->H*4;
+ ret = malloc( retlen );
+
+ dest.W = ret->W = msg->W;
+ dest.H = ret->H = msg->H;
+ dest.Data = ret->ImageData;
+
+ _Blit( &dest, 0, 0, src, msg->X, msg->Y, msg->W, msg->H );
+
+ WM_SendIPCReply(Target, IPC_FB_DOWNLOAD, retlen, ret);
+
+ free(ret);
+
+ return 0;
+}
+
+int _Handle_LocalBlit(tWindow *Target, size_t Len, const void *Data)
+{
+ const tFBIPC_Blit *msg = Data;
+ tFBBuffer *dest, *src;
+
+ if( Len < sizeof(*msg) ) return -1;
+
+ src = _GetBuffer(Target, msg->Source);
+ dest = _GetBuffer(Target, msg->Dest);
+
+ _Blit( dest, msg->DstX, msg->DstY, src, msg->SrcX, msg->SrcY, msg->W, msg->H );
+ return 0;
+}
+
+int _Handle_FillRect(tWindow *Target, size_t Len, const void *Data)
+{
+ const tFBIPC_Fill *msg = Data;
+ tFBBuffer *dest;
+
+ if( Len < sizeof(*msg) ) return -1;
+
+ dest = _GetBuffer(Target, msg->Buffer);
+
+ _Fill( dest, msg->X, msg->Y, msg->W, msg->H, msg->Colour );
+ return 0;
+}
+
+int Renderer_Framebuffer_HandleMessage(tWindow *Target, int Msg, int Len, const void *Data)
+{
+ switch(Msg)
+ {
+ case WNDMSG_RESIZE:
+ // Resize the framebuffer
+ return 1; // Pass on
+
+ // Messages that get passed on
+ case WNDMSG_MOUSEBTN:
+ return 1;
+ }
+ return 1;
+}
+
+
void Renderer_Menu_Init(void);
tWindow *Renderer_Menu_Create(int Argument);
void Renderer_Menu_Redraw(tWindow *Window);
+ int Renderer_Menu_HandleIPC_AddItem(tWindow *Window, size_t Length, const void *Data);
+ int Renderer_Menu_HandleIPC_SetFlags(tWindow *Window, size_t Length, const void *Data);
int Renderer_Menu_HandleMessage(tWindow *Window, int Msg, int Length, const void *Data);
// === CONSTANTS ===
.Name = "Menu",
.CreateWindow = Renderer_Menu_Create,
.Redraw = Renderer_Menu_Redraw,
- .HandleMessage = Renderer_Menu_HandleMessage
+ .HandleMessage = Renderer_Menu_HandleMessage,
+ .nIPCHandlers = 2,
+ .IPCHandlers = {
+ Renderer_Menu_HandleIPC_AddItem,
+// Renderer_Menu_HandleIPC_SetFlags
+ }
};
tFont *gMenu_Font = NULL; // System monospace
}
}
-int Renderer_Menu_int_AddItem(tWindow *Window, int Length, const tMenuMsg_AddItem *Msg)
+int Renderer_Menu_HandleIPC_AddItem(tWindow *Window, size_t Length, const void *Data)
{
+ const tMenuIPC_AddItem *Msg = Data;
tMenuWindowInfo *info = Window->RendererInfo;
tMenuItem *item;
return 0; }
- // Manipulation messages
- case MSG_MENU_ADDITEM:
-// _SysDebug("MSG_MENU_ADDITEM");
- return Renderer_Menu_int_AddItem(Window, Length, Data);
-
// Only message to pass to client
case MSG_MENU_SELECT:
return 1;
+++ /dev/null
-/*
- * Acess2 Window Manager v3
- * - By John Hodge (thePowersGang)
- *
- * renderer_passthru.c
- * - Passthrough window render (framebuffer essentially)
- */
-#include <common.h>
-#include <wm_renderer.h>
-#include <string.h>
-#include <framebuffer_messages.h>
-#include <wm_messages.h>
-
-// === TYPES ===
-typedef struct
-{
- short W, H;
- void *Data;
- char _data[];
-} tFBBuffer;
-typedef struct
-{
- tFBBuffer BackBuffer;
- int MaxBufferCount;
- tFBBuffer *Buffers[];
-} tFBWin;
-
-// === PROTOTYPES ===
-tWindow *Renderer_Framebuffer_Create(int Flags);
-void Renderer_Framebuffer_Redraw(tWindow *Window);
- int Renderer_Framebuffer_HandleMessage(tWindow *Target, int Msg, int Len, const void *Data);
-
-// === GLOBALS ===
-tWMRenderer gRenderer_Framebuffer = {
- .Name = "FrameBuffer",
- .CreateWindow = Renderer_Framebuffer_Create,
- .Redraw = Renderer_Framebuffer_Redraw,
- .HandleMessage = Renderer_Framebuffer_HandleMessage
-};
-
-// === CODE ===
-int Renderer_Framebuffer_Init(void)
-{
- WM_RegisterRenderer(&gRenderer_Framebuffer);
- return 0;
-}
-
-tWindow *Renderer_Framebuffer_Create(int Flags)
-{
- tWindow *ret;
- tFBWin *info;
- const int max_buffers = 10; // TODO: Have this be configurable
-
- ret = WM_CreateWindowStruct( sizeof(*info) + max_buffers*sizeof(tFBBuffer*) );
- info = ret->RendererInfo;
-
- info->BackBuffer.W = 0;
- info->BackBuffer.H = 0;
- info->BackBuffer.Data = NULL;
- info->MaxBufferCount = max_buffers;
- memset( info->Buffers, 0, sizeof(tFBBuffer*) * max_buffers );
-
- return ret;
-}
-
-void Renderer_Framebuffer_Redraw(tWindow *Window)
-{
-
-}
-
-// --- ---
-tFBBuffer *_GetBuffer(tWindow *Win, uint16_t ID)
-{
- tFBWin *info = Win->RendererInfo;
- if( ID == 0xFFFF )
- return &info->BackBuffer;
- else if( ID >= info->MaxBufferCount )
- return NULL;
- else
- return info->Buffers[ ID ];
-}
-
-void _Blit(
- tFBBuffer *Dest, uint16_t DX, uint16_t DY,
- const tFBBuffer *Src, uint16_t SX, uint16_t SY,
- uint16_t W, uint16_t H
- )
-{
- uint32_t *dest_data = Dest->Data;
- const uint32_t *src_data = Src->Data;
- // First, some sanity
- if( DX > Dest->W ) return ;
- if( DY > Dest->H ) return ;
- if( SX > Src->W ) return ;
- if( SY > Src->H ) return ;
-
- if( DX + W > Dest->W ) W = Dest->W - DX;
- if( SX + W > Src->W ) W = Src->W - SX;
- if( DY + H > Dest->H ) H = Dest->H - DY;
- if( SY + H > Src->H ) H = Src->H - SY;
-
- dest_data += (DY * Dest->W) + DX;
- src_data += (SY * Src->W ) + SX;
- for( int i = 0; i < H; i ++ )
- {
- memcpy( dest_data, src_data, W * 4 );
- dest_data += Dest->W;
- src_data += Src->W;
- }
-}
-
-void _Fill(tFBBuffer *Buf, uint16_t X, uint16_t Y, uint16_t W, uint16_t H, uint32_t Colour)
-{
- uint32_t *data = Buf->Data;
-
- if( X > Buf->W ) return ;
- if( Y > Buf->H ) return ;
- if( X + W > Buf->W ) W = Buf->W - X;
- if( Y + H > Buf->H ) H = Buf->H - Y;
-
- data += (Y * Buf->W) + X;
- for( int i = 0; i < H; i ++ )
- {
- for( int j = 0; j < W; j ++ )
- *data++ = Colour;
- data += Buf->W - W;
- }
-}
-
-// --- ---
-void _Handle_Commit(tWindow *Target, size_t Len, const void *Data)
-{
- // Do a window invalidate
-}
-
-void _Handle_CreateBuf(tWindow *Target, size_t Len, const void *Data)
-{
- const tFBMsg_NewBuf *msg = Data;
- tFBBuffer *buf;
- tFBWin *info = Target->RendererInfo;
-
- if( Len < sizeof(*msg) ) return ;
-
- if( msg->Buffer == -1 || msg->Buffer >= info->MaxBufferCount ) {
- // Can't reallocate -1
- return ;
- }
-
- if( info->Buffers[msg->Buffer] ) {
- free(info->Buffers[msg->Buffer]);
- info->Buffers[msg->Buffer] = NULL;
- }
-
- buf = malloc(sizeof(tFBBuffer) + msg->W * msg->H * 4);
- buf->W = msg->W;
- buf->H = msg->H;
- buf->Data = buf->_data;
-
- info->Buffers[msg->Buffer] = buf;
-}
-
-void _Handle_Upload(tWindow *Target, size_t Len, const void *Data)
-{
- const tFBMsg_Transfer *msg = Data;
- tFBBuffer *dest, src;
-
- if( Len < sizeof(*msg) ) return ;
- if( Len < sizeof(*msg) + msg->W * msg->H * 4 ) return ;
-
- dest = _GetBuffer(Target, msg->Buffer);
-
- src.W = msg->W;
- src.H = msg->H;
- src.Data = (void*)msg->ImageData;
-
- _Blit( dest, msg->X, msg->Y, &src, 0, 0, msg->W, msg->H );
-}
-
-void _Handle_Download(tWindow *Target, size_t Len, const void *Data)
-{
- #if 0
- const tFBMsg_Transfer *msg = Data;
- tFBBuffer dest, *src;
-
- if( Len < sizeof(*msg) ) return ;
- if( Len < sizeof(*msg) + msg->W * msg->H * 4 ) return ;
-
- src = _GetBuffer(Target, msg->Buffer);
-
- dest.W = msg->W;
- dest.H = msg->H;
- dest.Data = msg->ImageData;
-
- _Blit( &dest, 0, 0, src, msg->X, msg->Y, msg->W, msg->H );
- #endif
-}
-
-void _Handle_LocalBlit(tWindow *Target, size_t Len, const void *Data)
-{
- const tFBMsg_Blit *msg = Data;
- tFBBuffer *dest, *src;
-
- if( Len < sizeof(*msg) ) return ;
-
- src = _GetBuffer(Target, msg->Source);
- dest = _GetBuffer(Target, msg->Dest);
-
- _Blit( dest, msg->DstX, msg->DstY, src, msg->SrcX, msg->SrcY, msg->W, msg->H );
-}
-
-void _Handle_FillRect(tWindow *Target, size_t Len, const void *Data)
-{
- const tFBMsg_Fill *msg = Data;
- tFBBuffer *dest;
-
- if( Len < sizeof(*msg) ) return ;
-
- dest = _GetBuffer(Target, msg->Buffer);
-
- _Fill( dest, msg->X, msg->Y, msg->W, msg->H, msg->Colour );
-}
-
-int Renderer_Framebuffer_HandleMessage(tWindow *Target, int Msg, int Len, const void *Data)
-{
- switch(Msg)
- {
- case WNDMSG_RESIZE:
- // Resize the framebuffer
- return 1; // Pass on
-
- // Messages that get passed on
- case WNDMSG_MOUSEBTN:
- return 1;
-
- // --- Local messages ---
- // - Drawing completed, do an update
- case MSG_FB_COMMIT:
- _Handle_Commit(Target, Len, Data);
- return 0;
- // - New Buffer (create a new server-side buffer)
- case MSG_FB_NEWBUF:
- _Handle_CreateBuf(Target, Len, Data);
- return 0;
- // - Upload (Transfer data from client to server)
- case MSG_FB_UPLOAD:
- _Handle_Upload(Target, Len, Data);
- return 0;
- // - Download (Transfer image data from server to client)
- case MSG_FB_DOWNLOAD:
- _Handle_Download(Target, Len, Data);
- return 0;
- // - Local Blit (Transfer from server to server)
- case MSG_FB_BLIT:
- _Handle_LocalBlit(Target, Len, Data);
- return 0;
- // - Fill a rectangle
- case MSG_FB_FILL:
- _Handle_FillRect(Target, Len, Data);
- return 0;
- }
- return 1;
-}
-
-
int Renderer_RichText_Init(void);
tWindow *Renderer_RichText_Create(int Flags);
void Renderer_RichText_Redraw(tWindow *Window);
+ int Renderer_RichText_HandleIPC_SetAttr(tWindow *Window, size_t Len, const void *Data);
+ int Renderer_RichText_HandleIPC_WriteLine(tWindow *Window, size_t Len, const void *Data);
int Renderer_RichText_HandleMessage(tWindow *Target, int Msg, int Len, const void *Data);
// === GLOBALS ===
.Name = "RichText",
.CreateWindow = Renderer_RichText_Create,
.Redraw = Renderer_RichText_Redraw,
- .HandleMessage = Renderer_RichText_HandleMessage
+ .HandleMessage = Renderer_RichText_HandleMessage,
+ .nIPCHandlers = N_IPC_RICHTEXT,
+ .IPCHandlers = {
+ [IPC_RICHTEXT_SETATTR] = Renderer_RichText_HandleIPC_SetAttr,
+ [IPC_RICHTEXT_WRITELINE] = Renderer_RichText_HandleIPC_WriteLine
+ }
};
// === CODE ===
);
}
+int Renderer_RichText_HandleIPC_SetAttr(tWindow *Window, size_t Len, const void *Data)
+{
+ tRichText_Window *info = Window->RendererInfo;
+ const struct sRichTextIPC_SetAttr *msg = Data;
+ if(Len < sizeof(*msg)) return -1;
+
+ _SysDebug("RichText Attr %i set to %x", msg->Attr, msg->Value);
+ switch(msg->Attr)
+ {
+ case _ATTR_DEFBG:
+ info->DefaultBG = msg->Value;
+ break;
+ case _ATTR_DEFFG:
+ info->DefaultFG = msg->Value;
+ break;
+ case _ATTR_SCROLL:
+ // TODO: Set scroll flag
+ break;
+ case _ATTR_LINECOUNT:
+ info->nLines = msg->Value;
+ break;
+ }
+
+ return 0;
+}
+
+int Renderer_RichText_HandleIPC_WriteLine(tWindow *Window, size_t Len, const void *Data)
+{
+ tRichText_Window *info = Window->RendererInfo;
+ const struct sRichTextIPC_WriteLine *msg = Data;
+ if( Len < sizeof(*msg) ) return -1;
+ if( msg->Line >= info->nLines ) return 1; // Bad count
+
+ tRichText_Line *line = info->FirstLine;
+ tRichText_Line *prev = NULL;
+ while(line && line->Num < msg->Line)
+ prev = line, line = line->Next;
+ if( !line || line->Num > msg->Line )
+ {
+ // New line!
+ // Round up to 32
+ int space = ((Len - sizeof(*msg)) + 32-1) & ~(32-1);
+ tRichText_Line *new = malloc(sizeof(*line) + space);
+ // TODO: Bookkeeping on how much memory each window uses
+ new->Next = line;
+ new->Prev = prev;
+ new->Num = msg->Line;
+ new->Space = space;
+ if(new->Prev) new->Prev->Next = new;
+ else info->FirstLine = new;
+ if(new->Next) new->Next->Prev = new;
+ line = new;
+ }
+ else if( line->Space < Len - sizeof(*msg) )
+ {
+ // Need to allocate more space
+ int space = ((Len - sizeof(*msg)) + 32-1) & ~(32-1);
+ tRichText_Line *new = realloc(line, space);
+ // TODO: Bookkeeping on how much memory each window uses
+ new->Space = space;
+
+ if(new->Prev) new->Prev->Next = new;
+ else info->FirstLine = new;
+ if(new->Next) new->Next->Prev = new;
+ line = new;
+ }
+ else
+ {
+ // It fits :)
+ }
+ line->ByteLength = Len - sizeof(*msg);
+ memcpy(line->Data, msg->LineData, Len - sizeof(*msg));
+
+ return 0;
+}
+
int Renderer_RichText_HandleMessage(tWindow *Target, int Msg, int Len, const void *Data)
{
tRichText_Window *info = Target->RendererInfo;
if(Len < sizeof(*msg)) return -1;
info->DispLines = msg->H / info->LineHeight;
return 1; }
- case MSG_RICHTEXT_SETATTR: {
- const struct sRichTextMsg_SetAttr *msg = Data;
- if(Len < sizeof(*msg)) return -1;
- _SysDebug("RichText Attr %i set to %x", msg->Attr, msg->Value);
- switch(msg->Attr)
- {
- case _ATTR_DEFBG:
- info->DefaultBG = msg->Value;
- break;
- case _ATTR_DEFFG:
- info->DefaultFG = msg->Value;
- break;
- case _ATTR_SCROLL:
- // TODO: Set scroll flag
- break;
- case _ATTR_LINECOUNT:
- info->nLines = msg->Value;
- break;
- }
- return 1; }
- // Update a line
- case MSG_RICHTEXT_SENDLINE: {
- const struct sRichTextMsg_SendLine *msg = Data;
- if(Len < sizeof(*msg)) return -1;
- _SysDebug("RichText Line %i = '%.*s'", msg->Line, Len - sizeof(*msg), msg->LineData);
- if( msg->Line >= info->nLines ) return 1; // Bad count
-
- tRichText_Line *line = info->FirstLine;
- tRichText_Line *prev = NULL;
- while(line && line->Num < msg->Line)
- prev = line, line = line->Next;
- if( !line || line->Num > msg->Line )
- {
- // New line!
- // Round up to 32
- int space = ((Len - sizeof(*msg)) + 32-1) & ~(32-1);
- tRichText_Line *new = malloc(sizeof(*line) + space);
- // TODO: Bookkeeping on how much memory each window uses
- new->Next = line;
- new->Prev = prev;
- new->Num = msg->Line;
- new->Space = space;
- if(new->Prev) new->Prev->Next = new;
- else info->FirstLine = new;
- if(new->Next) new->Next->Prev = new;
- line = new;
- }
- else if( line->Space < Len - sizeof(*msg) )
- {
- // Need to allocate more space
- int space = ((Len - sizeof(*msg)) + 32-1) & ~(32-1);
- tRichText_Line *new = realloc(line, space);
- // TODO: Bookkeeping on how much memory each window uses
- new->Space = space;
-
- if(new->Prev) new->Prev->Next = new;
- else info->FirstLine = new;
- if(new->Next) new->Next->Prev = new;
- line = new;
- }
- else
- {
- // It fits :)
- }
- line->ByteLength = Len - sizeof(*msg);
- memcpy(line->Data, msg->LineData, Len - sizeof(*msg));
- return 1; }
}
return 0;
}
void Widget_UpdatePosition(tElement *Element);
// --- Messages
tElement *Widget_GetElementById(tWidgetWin *Info, uint32_t ID);
-void Widget_NewWidget(tWidgetWin *Info, size_t Len, const tWidgetMsg_Create *Msg);
-void Widget_SetFlags(tWidgetWin *Info, int Len, const tWidgetMsg_SetFlags *Msg);
-void Widget_SetSize(tWidgetWin *Info, int Len, const tWidgetMsg_SetSize *Msg);
-void Widget_SetText(tWidgetWin *Info, int Len, const tWidgetMsg_SetText *Msg);
+ int Widget_IPC_Create(tWindow *Win, size_t Len, const void *Data);
+ int Widget_IPC_NewWidgetSubwin(tWindow *Win, size_t Len, const void *Data);
+// int Widget_IPC_Delete(tWindow *Win, size_t Len, const void *Data);
+ int Widget_IPC_SetFocus(tWindow *Win, size_t Len, const void *Data);
+ int Widget_IPC_SetFlags(tWindow *Win, size_t Len, const void *Data);
+ int Widget_IPC_SetSize(tWindow *Win, size_t Len, const void *Data);
+ int Widget_IPC_SetText(tWindow *Win, size_t Len, const void *Data);
+ int Widget_IPC_GetText(tWindow *Win, size_t Len, const void *Data);
+// int Widget_IPC_SetColour(tWindow *Win, size_t Len, const void *Data);
int Renderer_Widget_HandleMessage(tWindow *Target, int Msg, int Len, const void *Data);
// === GLOBALS ===
.Name = "Widget",
.CreateWindow = Renderer_Widget_Create,
.Redraw = Renderer_Widget_Redraw,
- .HandleMessage = Renderer_Widget_HandleMessage
+ .HandleMessage = Renderer_Widget_HandleMessage,
+ .nIPCHandlers = N_IPC_WIDGET,
+ .IPCHandlers = {
+ [IPC_WIDGET_CREATE] = Widget_IPC_Create,
+ [IPC_WIDGET_CREATESUBWIN] = Widget_IPC_NewWidgetSubwin,
+ [IPC_WIDGET_SETFOCUS] = Widget_IPC_SetFocus,
+ [IPC_WIDGET_SETFLAGS] = Widget_IPC_SetFlags,
+ [IPC_WIDGET_SETSIZE] = Widget_IPC_SetSize,
+ [IPC_WIDGET_SETTEXT] = Widget_IPC_SetText,
+ [IPC_WIDGET_GETTEXT] = Widget_IPC_GetText,
+ }
};
// --- Element callbacks
return new;
}
+void Widget_SetFocus(tWidgetWin *Info, tElement *Ele)
+{
+ // TODO: Callbacks
+
+ Info->FocusedElement = Ele;
+}
+
+
// --- Message Handlers ---
-void Widget_NewWidget(tWidgetWin *Info, size_t Len, const tWidgetMsg_Create *Msg)
+int Widget_IPC_Create(tWindow *Win, size_t Len, const void *Data)
{
- const int max_debugname_len = Len - sizeof(tWidgetMsg_Create);
+ tWidgetWin *Info = Win->RendererInfo;
+ const tWidgetIPC_Create *Msg = Data;
+ const int max_debugname_len = Len - sizeof(*Msg);
tElement *parent;
// Sanity check
if( Len < sizeof(*Msg) )
- return ;
+ return -1;
if( strnlen(Msg->DebugName, max_debugname_len) == max_debugname_len )
- return ;
+ return -1;
_SysDebug("Widget_NewWidget (%i %i Type %i Flags 0x%x)",
Msg->Parent, Msg->NewID, Msg->Type, Msg->Flags);
if(Msg->Type >= ciWM_NumWidgetTypes)
{
_SysDebug("Widget_NewWidget - Bad widget type %i", Msg->Type);
- return ;
+ return 1;
}
// Create
if(!parent)
{
_SysDebug("Widget_NewWidget - Bad parent ID %i", Msg->Parent);
- return ;
+ return 1;
}
Widget_int_Create(Info, parent, Msg->NewID, Msg->Type, Msg->Flags);
Widget_UpdateMinDims(parent);
+ return 0;
}
-void Widget_NewWidgetSubwin(tWidgetWin *Info, size_t Len, const tWidgetMsg_CreateSubWin *Msg)
+int Widget_IPC_NewWidgetSubwin(tWindow *Win, size_t Len, const void *Data)
{
- const int max_debugname_len = Len - sizeof(tWidgetMsg_CreateSubWin);
+ tWidgetWin *Info = Win->RendererInfo;
+ const tWidgetIPC_CreateSubWin *Msg = Data;
+ const int max_debugname_len = Len - sizeof(*Msg);
tElement *parent, *new;
// Sanity check
if( Len < sizeof(*Msg) )
- return ;
+ return -1;
if( strnlen(Msg->DebugName, max_debugname_len) == max_debugname_len )
- return ;
+ return -1;
parent = Widget_GetElementById(Info, Msg->Parent);
- if(!parent) return;
- if( Widget_GetElementById(Info, Msg->NewID) ) return ;
+ if(!parent) return 1;
+ if( Widget_GetElementById(Info, Msg->NewID) ) return 1;
new = Widget_int_Create(Info, parent, Msg->NewID, Msg->Type, Msg->Flags);
new->Data = WM_GetWindowByID(parent->Window, Msg->WindowHandle);
Widget_UpdateMinDims(parent);
+ return 0;
}
-void Widget_SetFocus(tWidgetWin *Info, tElement *Ele)
-{
- // TODO: Callbacks
+// TODO: Widget_IPC_Delete
- Info->FocusedElement = Ele;
+int Widget_IPC_SetFocus(tWindow *Win, size_t Len, const void *Data)
+{
+ tWidgetWin *info = Win->RendererInfo;
+ tElement *ele;
+ const tWidgetIPC_SetFocus *msg = Data;
+ if(Len < sizeof(*msg)) return -1;
+
+ ele = Widget_GetElementById(info, msg->WidgetID);
+ Widget_SetFocus(info, ele);
+ return 0;
}
-void Widget_SetFlags(tWidgetWin *Info, int Len, const tWidgetMsg_SetFlags *Msg)
+int Widget_IPC_SetFlags(tWindow *Win, size_t Len, const void *Data)
{
+ tWidgetWin *Info = Win->RendererInfo;
+ const tWidgetIPC_SetFlags *Msg = Data;
tElement *ele;
if( Len < sizeof(*Msg) )
- return ;
+ return -1;
_SysDebug("Widget_SetFlags: (%i 0x%x 0x%x)", Msg->WidgetID, Msg->Value, Msg->Mask);
ele = Widget_GetElementById(Info, Msg->WidgetID);
- if(!ele) return;
+ if(!ele) return 1;
ele->Flags &= ~Msg->Mask;
ele->Flags |= Msg->Value & Msg->Mask;
+
+ return 0;
}
-void Widget_SetSize(tWidgetWin *Info, int Len, const tWidgetMsg_SetSize *Msg)
+int Widget_IPC_SetSize(tWindow *Win, size_t Len, const void *Data)
{
+ tWidgetWin *Info = Win->RendererInfo;
+ const tWidgetIPC_SetSize *Msg = Data;
tElement *ele;
if( Len < sizeof(*Msg) )
- return ;
+ return -1;
ele = Widget_GetElementById(Info, Msg->WidgetID);
- if(!ele) return ;
+ if(!ele) return 1;
ele->FixedWith = Msg->Value;
+ return 0;
}
-void Widget_SetText(tWidgetWin *Info, int Len, const tWidgetMsg_SetText *Msg)
+int Widget_IPC_SetText(tWindow *Win, size_t Len, const void *Data)
{
+ tWidgetWin *Info = Win->RendererInfo;
+ const tWidgetIPC_SetText *Msg = Data;
tElement *ele;
if( Len < sizeof(*Msg) + 1 )
- return ;
+ return -1;
if( Msg->Text[Len - sizeof(*Msg) - 1] != '\0' )
- return ;
+ return -1;
ele = Widget_GetElementById(Info, Msg->WidgetID);
- if(!ele) return ;
-
+ if(!ele) return 1;
if( gaWM_WidgetTypes[ele->Type]->UpdateText )
{
// if(ele->Text) free(ele->Text);
// ele->Text = strdup(Msg->Text);
// }
+ return 0;
}
-int Widget_GetText(tWidgetWin *Info, int Len, const tWidgetMsg_SetText *Msg)
+int Widget_IPC_GetText(tWindow *Win, size_t Len, const void *Data)
{
+ tWidgetWin *Info = Win->RendererInfo;
+ const tWidgetIPC_SetText *Msg = Data;
if( Len < sizeof(*Msg) )
- return 0;
- if( Len > sizeof(*Msg) )
- return 1; // Pass to user
+ return -1;
const char *text = NULL;
tElement *ele = Widget_GetElementById(Info, Msg->WidgetID);
if(ele)
text = ele->Text;
- char buf[sizeof(tWidgetMsg_SetText) + strlen(text?text:"") + 1];
- tWidgetMsg_SetText *omsg = (void*)buf;
+ char buf[sizeof(tWidgetIPC_SetText) + strlen(text?text:"") + 1];
+ tWidgetIPC_SetText *omsg = (void*)buf;
if( text ) {
omsg->WidgetID = Msg->WidgetID;
omsg->Text[0] = 0;
}
- WM_SendMessage(Info->RootElement.Window, Info->RootElement.Window, MSG_WIDGET_GETTEXT, sizeof(buf), buf);
+ WM_SendIPCReply(Win, IPC_WIDGET_GETTEXT, sizeof(buf), buf);
return 0;
}
}
return 0; }
- // New Widget
- case MSG_WIDGET_CREATE:
- Widget_NewWidget(info, Len, Data);
- return 0;
- case MSG_WIDGET_CREATESUBWIN:
- Widget_NewWidgetSubwin(info, Len, Data);
- return 0;
-
- // Delete a widget
- case MSG_WIDGET_DELETE:
- _SysDebug("TODO: Implement MSG_WIDGET_DELETE");
- return 0;
-
- // Set focused widget
- case MSG_WIDGET_SETFOCUS: {
- tElement *ele;
- const tWidgetMsg_SetFocus *msg = Data;
- if(Len < sizeof(*msg)) return -1;
-
- ele = Widget_GetElementById(info, msg->WidgetID);
- Widget_SetFocus(info, ele);
- return 0; }
-
- // Set Flags
- case MSG_WIDGET_SETFLAGS:
- Widget_SetFlags(info, Len, Data);
- return 0;
-
- // Set length
- case MSG_WIDGET_SETSIZE:
- Widget_SetSize(info, Len, Data);
- return 0;
-
- // Set text
- case MSG_WIDGET_SETTEXT:
- Widget_SetText(info, Len, Data);
- return 0;
- case MSG_WIDGET_GETTEXT:
- return Widget_GetText(info, Len, Data);
-
//
default:
return 1; // Unhandled, pass to user
// === IMPORTS ===
extern void IPC_SendWMMessage(tIPC_Client *Client, uint32_t Src, uint32_t Dst, int Msg, int Len, const void *Data);
+extern void IPC_SendReply(tIPC_Client *Client, uint32_t WinID, int MsgID, size_t Len, const void *Data);
extern tWindow *IPC_int_GetWindow(tIPC_Client *Client, uint32_t ID);
// === GLOBALS ===
return 1;
}
+int WM_SendIPCReply(tWindow *Window, int Message, size_t Length, const void *Data)
+{
+ IPC_SendReply(Window->Client, Window->ID, Message, Length, Data);
+ return 0;
+}
+
void WM_Invalidate(tWindow *Window)
{
if(!Window) return ;
#ifndef _AXWIN3__FRAMEBUFFER_MESSAGES_H_
#define _AXWIN3__FRAMEBUFFER_MESSAGES_H_
-enum
+enum eFrameBuffer_IPCCalls
{
- MSG_FB_COMMIT = 0x1000,
- MSG_FB_NEWBUF,
- MSG_FB_UPLOAD,
- MSG_FB_DOWNLOAD,
- MSG_FB_BLIT,
- MSG_FB_FILL
+ IPC_FB_COMMIT,
+ IPC_FB_NEWBUF,
+ IPC_FB_UPLOAD,
+ IPC_FB_DOWNLOAD, // Replies with requested data
+ IPC_FB_BLIT,
+ IPC_FB_FILL,
+ N_IPC_FB
};
typedef struct
{
uint16_t Buffer;
uint16_t W, H;
-} tFBMsg_NewBuf;
+} tFBIPC_NewBuf;
typedef struct
{
uint16_t W, H;
uint16_t X, Y;
uint32_t ImageData[];
-} tFBMsg_Transfer;
+} tFBIPC_Transfer;
typedef struct
{
uint16_t SrcX, SrcY;
uint16_t DstX, DstY;
uint16_t W, H;
-} tFBMsg_Blit;
+} tFBIPC_Blit;
typedef struct
{
uint16_t X, Y;
uint16_t W, H;
uint32_t Colour;
-} tFBMsg_Fill;
+} tFBIPC_Fill;
#endif
*/
//! Request a return value
#define IPCMSG_FLAG_RETURN 0x01
+//! IPC Message for renderer
+#define IPCMSG_FLAG_RENDERER 0x80
/**
* \}
*/
#include "ipcmessages.h"
-enum eMenuMessages
+// Client->Server IPC methods
+enum eMenuIPCCalls
{
- MSG_MENU_ADDITEM = 0x1000,
- MSG_MENU_SETFLAGS,
-
- MSG_MENU_SELECT
+ IPC_MENU_ADDITEM,
+ IPC_MENU_SETFLAGS
};
typedef struct
uint16_t Flags;
uint32_t SubMenuID;
char Label[];
-} tMenuMsg_AddItem;
+} tMenuIPC_AddItem;
typedef struct
{
uint16_t ID;
uint16_t Value;
uint16_t Mask;
-} tMenuMsg_SetFlags;
+} tMenuIPC_SetFlags;
+
+// Server->Client messages
+enum eMenuMessages
+{
+ MSG_MENU_SELECT = 0x1000
+};
typedef struct
{
_ATTR_CURSORPOS,
};
-enum
+enum eRichText_IPCCalls
{
- // Calls
- MSG_RICHTEXT_SETATTR,
- MSG_RICHTEXT_SETFONT,
- MSG_RICHTEXT_DELLINE,
- MSG_RICHTEXT_ADDLINE,
-
- // Events
- MSG_RICHTEXT_KEYPRESS,
- MSG_RICHTEXT_MOUSEBTN,
-
- // Bi-directional messages
- // - Sent by server to get a line that is not cached
- // - Sent by client to read line contents
- MSG_RICHTEXT_REQLINE,
- // - Response to _REQLINE
- MSG_RICHTEXT_SENDLINE,
+ IPC_RICHTEXT_SETATTR,
+ IPC_RICHTEXT_SETFONT,
+ IPC_RICHTEXT_DELLINE,
+ IPC_RICHTEXT_ADDLINE,
+ IPC_RICHTEXT_WRITELINE, // Set line contents
+ IPC_RICHTEXT_READLINE, // Request line contents
+ N_IPC_RICHTEXT
};
-struct sRichTextMsg_SetAttr
+struct sRichTextIPC_SetAttr
{
uint32_t Attr;
uint32_t Value;
};
-struct sRichTextMsg_SetFont
+struct sRichTextIPC_SetFont
{
uint16_t Size;
char Name[];
};
-struct sRichTextMsg_AddDelLine
+struct sRichTextIPC_AddDelLine
+{
+ uint32_t Line;
+};
+
+struct sRichTextIPC_ReadLine
+{
+ uint32_t Line;
+};
+
+struct sRichTextIPC_WriteLine
{
uint32_t Line;
+ char LineData[];
+};
+
+enum
+{
+ // Events
+ MSG_RICHTEXT_KEYPRESS = 0x1000,
+ MSG_RICHTEXT_MOUSEBTN,
+
+ // Sent by server to get a line that is not cached (expects IPC WRITELINE)
+ MSG_RICHTEXT_REQLINE,
+ // Response to IPC READLINE
+ MSG_RICHTEXT_LINEDATA,
};
struct sRichTextMsg_ReqLine
uint32_t Line;
};
-struct sRichTextMsg_SendLine
+struct sRichTextMsg_LineData
{
uint32_t Line;
char LineData[];
#ifndef _WIDGET_MESSAGES_H_
#define _WIDGET_MESSAGES_H_
-enum
+enum eWidgetIPCCalls
{
// Control (Client->Server) messages
- MSG_WIDGET_CREATE = 0x1000,
- MSG_WIDGET_CREATESUBWIN,
- MSG_WIDGET_DELETE,
- MSG_WIDGET_SETFOCUS,
- MSG_WIDGET_SETFLAGS,
- MSG_WIDGET_SETSIZE,
- MSG_WIDGET_SETTEXT,
- MSG_WIDGET_SETCOLOUR,
+ IPC_WIDGET_CREATE,
+ IPC_WIDGET_CREATESUBWIN,
+ IPC_WIDGET_DELETE,
+ IPC_WIDGET_SETFOCUS,
+ IPC_WIDGET_SETFLAGS,
+ IPC_WIDGET_SETSIZE,
+ IPC_WIDGET_SETTEXT,
+ IPC_WIDGET_SETCOLOUR,
-
- // Request (Client->Server->Client) messages
- MSG_WIDGET_GETTEXT,
-
- // Event (Server->Client) messages
- MSG_WIDGET_FIRE,
- MSG_WIDGET_KEYPRESS,
- MSG_WIDGET_MOUSEBTN,
+ IPC_WIDGET_GETTEXT,
+
+ N_IPC_WIDGET
};
-
typedef struct
{
uint32_t Parent;
uint32_t Type;
uint32_t Flags;
char DebugName[];
-} tWidgetMsg_Create;
+} tWidgetIPC_Create;
typedef struct
{
uint32_t Flags;
uint32_t WindowHandle;
char DebugName[];
-} tWidgetMsg_CreateSubWin;
+} tWidgetIPC_CreateSubWin;
typedef struct
{
uint32_t WidgetID;
-} tWidgetMsg_Delete;
+} tWidgetIPC_Delete;
typedef struct
{
uint32_t WidgetID;
-} tWidgetMsg_SetFocus;
+} tWidgetIPC_SetFocus;
typedef struct
{
uint32_t WidgetID;
uint32_t Value;
uint32_t Mask;
-} tWidgetMsg_SetFlags;
+} tWidgetIPC_SetFlags;
typedef struct
{
uint32_t WidgetID;
uint32_t Value;
-} tWidgetMsg_SetSize;
+} tWidgetIPC_SetSize;
typedef struct
{
uint32_t WidgetID;
char Text[];
-} tWidgetMsg_SetText;
+} tWidgetIPC_SetText;
typedef struct
{
uint32_t WidgetID;
uint32_t Index;
uint32_t Colour;
-} tWidgetMsg_SetColour;
+} tWidgetIPC_SetColour;
+
+enum eWidgetMessages
+{
+ // Event (Server->Client) messages
+ MSG_WIDGET_FIRE = 0x1000,
+ MSG_WIDGET_KEYPRESS,
+ MSG_WIDGET_MOUSEBTN,
+};
+
+
typedef struct
{
extern void *AxWin3_int_GetDataPtr(tHWND Window);
extern uint32_t AxWin3_int_GetWindowID(tHWND Window);
+extern void AxWin3_SendIPC(tHWND Window, int Message, size_t Length, const void *Data);
+extern void *AxWin3_WaitIPCMessage(tHWND Window, int Message, size_t *Length);
#endif
ret->SubMenu = SubMenu;
{
- tMenuMsg_AddItem *req;
+ tMenuIPC_AddItem *req;
int data_size;
if(!Label) Label = "";
data_size = sizeof(*req)+strlen(Label)+1;
req->Flags = Flags;
req->SubMenuID = AxWin3_int_GetWindowID(SubMenu);
strcpy(req->Label, Label);
- AxWin3_SendMessage(Menu, Menu, MSG_MENU_ADDITEM, data_size, req);
+ AxWin3_SendIPC(Menu, IPC_MENU_ADDITEM, data_size, req);
free(req);
}
static void _SendAttrib(tHWND Window, int Attr, uint32_t Value)
{
- struct sRichTextMsg_SetAttr msg;
+ struct sRichTextIPC_SetAttr msg;
msg.Attr = Attr;
msg.Value = Value;
- AxWin3_SendMessage(Window, Window, MSG_RICHTEXT_SETATTR, sizeof(msg), &msg);
+ AxWin3_SendIPC(Window, IPC_RICHTEXT_SETATTR, sizeof(msg), &msg);
}
tHWND AxWin3_RichText_CreateWindow(tHWND Parent, int Flags)
void AxWin3_RichText_SendLine(tHWND Window, int Line, const char *Text)
{
// TODO: Local sanity check on `Line`?
- struct sRichTextMsg_SendLine *msg;
+ struct sRichTextIPC_WriteLine *msg;
size_t len = sizeof(*msg) + strlen(Text) + 1;
char buffer[len];
msg = (void*)buffer;
msg->Line = Line;
strcpy(msg->LineData, Text);
- AxWin3_SendMessage(Window, Window, MSG_RICHTEXT_SENDLINE, len, msg);
+ AxWin3_SendIPC(Window, IPC_RICHTEXT_WRITELINE, len, msg);
}
Info->Elements = realloc(Info->Elements, sizeof(*Info->Elements)*Info->nElements);
newID = Info->nElements - 4;
memset( &Info->Elements[newID+1], 0, (size_step-1)*sizeof(Info->Elements));
- _SysDebug("Expanded to %i and allocated %i", Info->nElements, newID);
+ _SysDebug("Widget: Expanded to %i and allocated %i", Info->nElements, newID);
}
else
- _SysDebug("Allocated %i", newID);
+ _SysDebug("Widget: Allocated %i", newID);
Info->Elements[newID] = (void*)-1;
return newID;
widget = AxWin3_Widget_int_GetElementByID(Window, msg->WidgetID);
if(widget->Fire) widget->Fire(widget);
- return 0; }
+ return 1; }
default:
return 0;
}
// Send create widget message
{
- char tmp[sizeof(tWidgetMsg_Create)+1];
- tWidgetMsg_Create *msg = (void*)tmp;
+ char tmp[sizeof(tWidgetIPC_Create)+1];
+ tWidgetIPC_Create *msg = (void*)tmp;
msg->Parent = Parent->ID;
msg->NewID = newID;
msg->Type = Type;
msg->Flags = Flags;
msg->DebugName[0] = '\0';
- AxWin3_SendMessage(ret->Window, ret->Window, MSG_WIDGET_CREATE, sizeof(tmp), tmp);
+ AxWin3_SendIPC(ret->Window, IPC_WIDGET_CREATE, sizeof(tmp), tmp);
}
return ret;
// Send message
{
- char tmp[sizeof(tWidgetMsg_CreateSubWin)+1];
- tWidgetMsg_CreateSubWin *msg = (void*)tmp;
+ char tmp[sizeof(tWidgetIPC_CreateSubWin)+1];
+ tWidgetIPC_CreateSubWin *msg = (void*)tmp;
msg->Parent = Parent->ID;
msg->NewID = newID;
msg->Type = ELETYPE_SUBWIN;
msg->Flags = Flags; // TODO: Flags
msg->WindowHandle = AxWin3_int_GetWindowID(Window);
msg->DebugName[0] = '\0';
- AxWin3_SendMessage(ret->Window, ret->Window, MSG_WIDGET_CREATESUBWIN, sizeof(tmp), tmp);
+ AxWin3_SendIPC(ret->Window, IPC_WIDGET_CREATESUBWIN, sizeof(tmp), tmp);
}
return ret;
void AxWin3_Widget_DelWidget(tAxWin3_Widget *Widget)
{
- tWidgetMsg_Delete msg;
+ tWidgetIPC_Delete msg;
tWidgetWindowInfo *info = AxWin3_int_GetDataPtr(Widget->Window);
msg.WidgetID = Widget->ID;
- AxWin3_SendMessage(Widget->Window, Widget->Window, MSG_WIDGET_DELETE, sizeof(msg), &msg);
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_DELETE, sizeof(msg), &msg);
info->Elements[Widget->ID] = NULL;
if(Widget->ID < info->FirstFreeID)
// --- Manipulation
void AxWin3_Widget_SetFlags(tAxWin3_Widget *Widget, int FlagSet, int FlagMask)
{
- tWidgetMsg_SetFlags msg;
+ tWidgetIPC_SetFlags msg;
msg.WidgetID = Widget->ID;
msg.Value = FlagSet;
msg.Mask = FlagMask;
- AxWin3_SendMessage(Widget->Window, Widget->Window, MSG_WIDGET_SETFLAGS, sizeof(msg), &msg);
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_SETFLAGS, sizeof(msg), &msg);
}
void AxWin3_Widget_SetSize(tAxWin3_Widget *Widget, int Size)
{
- tWidgetMsg_SetSize msg;
+ tWidgetIPC_SetSize msg;
msg.WidgetID = Widget->ID;
msg.Value = Size;
- AxWin3_SendMessage(Widget->Window, Widget->Window, MSG_WIDGET_SETSIZE, sizeof(msg), &msg);
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_SETSIZE, sizeof(msg), &msg);
}
void AxWin3_Widget_SetText(tAxWin3_Widget *Widget, const char *Text)
{
- char buf[sizeof(tWidgetMsg_SetText) + strlen(Text) + 1];
- tWidgetMsg_SetText *msg = (void*)buf;
+ char buf[sizeof(tWidgetIPC_SetText) + strlen(Text) + 1];
+ tWidgetIPC_SetText *msg = (void*)buf;
msg->WidgetID = Widget->ID;
strcpy(msg->Text, Text);
- AxWin3_SendMessage(Widget->Window, Widget->Window, MSG_WIDGET_SETTEXT, sizeof(buf), buf);
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_SETTEXT, sizeof(buf), buf);
}
char *AxWin3_Widget_GetText(tAxWin3_Widget *Widget)
{
- char buf[sizeof(tWidgetMsg_SetText)];
- tWidgetMsg_SetText *msg = (void*)buf;
+ char buf[sizeof(tWidgetIPC_SetText)];
+ tWidgetIPC_SetText *msg = (void*)buf;
size_t retmsg_size;
msg->WidgetID = Widget->ID;
- AxWin3_SendMessage(Widget->Window, Widget->Window, MSG_WIDGET_GETTEXT, sizeof(buf), buf);
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_GETTEXT, sizeof(buf), buf);
- msg = AxWin3_WaitMessage(Widget->Window, MSG_WIDGET_GETTEXT, &retmsg_size);
+ msg = AxWin3_WaitIPCMessage(Widget->Window, IPC_WIDGET_GETTEXT, &retmsg_size);
if( retmsg_size < sizeof(*msg) ) {
free(msg);
return NULL;
void AxWin3_Widget_SetColour(tAxWin3_Widget *Widget, int Index, tAxWin3_Colour Colour)
{
- tWidgetMsg_SetColour msg;
+ tWidgetIPC_SetColour msg;
msg.WidgetID = Widget->ID;
msg.Index = Index;
msg.Colour = Colour;
- AxWin3_SendMessage(Widget->Window, Widget->Window, MSG_WIDGET_SETCOLOUR, sizeof(msg), &msg);
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_SETCOLOUR, sizeof(msg), &msg);
}
ret = (void*)msg->Data;
if(X) *X = ret->X;
- if(X) *X = ret->Y;
+ if(Y) *Y = ret->Y;
if(Width) *Width = ret->W;
if(Height) *Height = ret->H;
AxWin3_int_SendIPCMessage(msg);
free(msg);
+ _SysDebug("AxWin3_CreateWindow: %i :: '%s'", newWinID, Renderer);
+
// TODO: Detect and handle possible errors
// Return success
gAxWin3_Hotkeys[mi->ID]();
}break;
default:
- _SysDebug("--- Unhandled SENDMSG %i", info->ID);
+ _SysDebug("--- Unhandled SENDMSG 0x%x win %i", info->ID, Msg->Window);
break;
}
}
}
}
+void AxWin3_SendIPC(tHWND Window, int Message, size_t Length, const void *Data)
+{
+ tAxWin_IPCMessage *msg;
+
+ msg = AxWin3_int_AllocateIPCMessage(Window, Message, IPCMSG_FLAG_RENDERER, Length);
+ memcpy(msg->Data, Data, Length);
+ AxWin3_int_SendIPCMessage(msg);
+ free(msg);
+}
+
+void *AxWin3_WaitIPCMessage(tHWND Window, int MessageID, size_t *Length)
+{
+ tAxWin_IPCMessage *msg;
+ for( ;; )
+ {
+ msg = AxWin3_int_WaitIPCMessage(MessageID);
+ if( !(msg->Flags & IPCMSG_FLAG_RENDERER) || msg->Window != AxWin3_int_GetWindowID(Window) ) {
+ AxWin3_int_HandleMessage(msg);
+ continue ;
+ }
+
+ *Length = msg->Size;
+ void *ret = malloc(msg->Size);
+ memcpy(ret, msg->Data, msg->Size);
+ free(msg);
+
+ return ret;
+ }
+}
+
void AxWin3_FocusWindow(tHWND Window)
{
tAxWin_IPCMessage *msg;