From f42e912b8bc615c2009b795ce12d4c54cef4ee8b Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 5 Nov 2011 16:18:43 +0800 Subject: [PATCH] Usermode/AxWin3 - Implementing SendMessage for client --- .../axwin3_src/WM/include/renderer_widget.h | 15 +------ .../axwin3_src/WM/renderer_widget.c | 3 -- .../axwin3_src/include/ipcmessages.h | 9 ++++ .../axwin3_src/include/widget_messages.h | 27 ++++++++++++ .../libaxwin3.so_src/include/internal.h | 1 + .../axwin3_src/libaxwin3.so_src/msg.c | 13 ++++-- .../axwin3_src/libaxwin3.so_src/r_widget.c | 44 ++++++++++++++++++- .../axwin3_src/libaxwin3.so_src/wm.c | 10 +++++ Usermode/include/axwin3/axwin.h | 2 +- 9 files changed, 101 insertions(+), 23 deletions(-) create mode 100644 Usermode/Applications/axwin3_src/include/widget_messages.h diff --git a/Usermode/Applications/axwin3_src/WM/include/renderer_widget.h b/Usermode/Applications/axwin3_src/WM/include/renderer_widget.h index fd79acf5..35b767d2 100644 --- a/Usermode/Applications/axwin3_src/WM/include/renderer_widget.h +++ b/Usermode/Applications/axwin3_src/WM/include/renderer_widget.h @@ -11,20 +11,7 @@ #include #include -enum -{ - MSG_WIDGET_CREATE, - MSG_WIDGET_DELETE, - MSG_WIDGET_SETTEXT -}; - - -typedef struct -{ - uint32_t Parent; - uint32_t NewID; - char DebugName[]; -} tWidgetMsg_Create; +#include #endif diff --git a/Usermode/Applications/axwin3_src/WM/renderer_widget.c b/Usermode/Applications/axwin3_src/WM/renderer_widget.c index 53788da0..3fbe3cb7 100644 --- a/Usermode/Applications/axwin3_src/WM/renderer_widget.c +++ b/Usermode/Applications/axwin3_src/WM/renderer_widget.c @@ -307,6 +307,3 @@ int Renderer_Widget_HandleMessage(tWindow *Target, int Msg, int Len, void *Data) } } - - - diff --git a/Usermode/Applications/axwin3_src/include/ipcmessages.h b/Usermode/Applications/axwin3_src/include/ipcmessages.h index e03c41c4..b7e78e53 100644 --- a/Usermode/Applications/axwin3_src/include/ipcmessages.h +++ b/Usermode/Applications/axwin3_src/include/ipcmessages.h @@ -16,6 +16,7 @@ typedef struct sIPCMsg_Return tIPCMsg_Return; typedef struct sIPCMsg_CreateWin tIPCMsg_CreateWin; typedef struct sIPCMsg_ShowWindow tIPCMsg_ShowWindow; typedef struct sIPCMsg_SetWindowPos tIPCMsg_SetWindowPos; +typedef struct sIPCMsg_SendMsg tIPCMsg_SendMsg; /** * \name Flags for IPC Messages @@ -48,6 +49,14 @@ struct sIPCMsg_CreateWin char Renderer[]; }; +struct sIPCMsg_SendMsg +{ + uint32_t Dest; + int ID; + uint16_t Length; + char Data[]; +}; + struct sIPCMsg_ShowWindow { uint32_t bShow; diff --git a/Usermode/Applications/axwin3_src/include/widget_messages.h b/Usermode/Applications/axwin3_src/include/widget_messages.h new file mode 100644 index 00000000..e4f09ed6 --- /dev/null +++ b/Usermode/Applications/axwin3_src/include/widget_messages.h @@ -0,0 +1,27 @@ +/* + * Acess2 Window Manager v3 + * - By John Hodge (thePowersGang) + * + * widget_messages.h + * - AxWin2 Widget port + */ +#ifndef _WIDGET_MESSAGES_H_ +#define _WIDGET_MESSAGES_H_ + +enum +{ + MSG_WIDGET_CREATE, + MSG_WIDGET_DELETE, + MSG_WIDGET_SETTEXT +}; + + +typedef struct +{ + uint32_t Parent; + uint32_t NewID; + char DebugName[]; +} tWidgetMsg_Create; + +#endif + diff --git a/Usermode/Applications/axwin3_src/libaxwin3.so_src/include/internal.h b/Usermode/Applications/axwin3_src/libaxwin3.so_src/include/internal.h index 4275356c..f7fd2576 100644 --- a/Usermode/Applications/axwin3_src/libaxwin3.so_src/include/internal.h +++ b/Usermode/Applications/axwin3_src/libaxwin3.so_src/include/internal.h @@ -19,6 +19,7 @@ struct sAxWin3_Window }; extern void *AxWin3_int_GetDataPtr(tHWND Window); +extern uint32_t AxWin3_int_GetWindowID(tHWND Window); #endif diff --git a/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c b/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c index 1059a0a2..c3c6be75 100644 --- a/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c +++ b/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c @@ -69,6 +69,14 @@ tAxWin3_MessageCallback AxWin3_SetMessageCallback(tAxWin3_MessageCallback Callba 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; @@ -76,10 +84,7 @@ tAxWin_IPCMessage *AxWin3_int_AllocateIPCMessage(tHWND Window, int Message, int 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; } diff --git a/Usermode/Applications/axwin3_src/libaxwin3.so_src/r_widget.c b/Usermode/Applications/axwin3_src/libaxwin3.so_src/r_widget.c index 0c945d30..9eb55bbd 100644 --- a/Usermode/Applications/axwin3_src/libaxwin3.so_src/r_widget.c +++ b/Usermode/Applications/axwin3_src/libaxwin3.so_src/r_widget.c @@ -9,6 +9,7 @@ #include #include "include/internal.h" #include +#include // === STRUCTURES === struct sAxWin3_Widget @@ -22,6 +23,7 @@ typedef struct { int nElements; tAxWin3_Widget **Elements; + int FirstFreeID; // Callbacks for each element } tWidgetWindowInfo; @@ -45,6 +47,7 @@ tHWND AxWin3_Widget_CreateWindow(tHWND Parent, int W, int H, int RootEleFlags) info->nElements = 1; info->Elements = malloc(sizeof(tAxWin3_Widget*)); info->Elements[0] = (void*)(info + 1); // Get end of *info + info->FirstFreeID = 1; AxWin3_ResizeWindow(ret, W, H); @@ -68,7 +71,46 @@ tAxWin3_Widget *AxWin3_Widget_GetRoot(tHWND Window) tAxWin3_Widget *AxWin3_Widget_AddWidget(tAxWin3_Widget *Parent, int Type, int Flags, const char *DebugName) { + int newID; + tWidgetWindowInfo *info; + tAxWin3_Widget *ret; + + if(!Parent) return NULL; + + info = AxWin3_int_GetDataPtr(Parent->Window); + // Assign ID + // TODO: Atomicity + for( newID = info->FirstFreeID; newID < info->nElements; newID ++ ) + { + if( info->Elements[newID] == NULL ) + break; + } + if( info->Elements[newID] ) + { + info->nElements ++; + info->Elements = realloc(info->Elements, sizeof(*info->Elements)*info->nElements); + newID = info->nElements - 1; + } + info->Elements[newID] = (void*)-1; - return NULL; + // Create new widget structure + ret = malloc(sizeof(tAxWin3_Widget)); + ret->Window = Parent->Window; + ret->ID = newID; + ret->Callback = NULL; + + info->Elements[newID] = ret; + + // Send create widget message + { + char tmp[sizeof(tWidgetMsg_Create)+1]; + tWidgetMsg_Create *msg = (void*)tmp; + msg->Parent = Parent->ID; + msg->NewID = newID; + msg->DebugName[0] = '\0'; + AxWin3_SendMessage(ret->Window, ret->Window, MSG_WIDGET_CREATE, sizeof(tmp), tmp); + } + + return ret; } diff --git a/Usermode/Applications/axwin3_src/libaxwin3.so_src/wm.c b/Usermode/Applications/axwin3_src/libaxwin3.so_src/wm.c index 29038ae3..fc5ed649 100644 --- a/Usermode/Applications/axwin3_src/libaxwin3.so_src/wm.c +++ b/Usermode/Applications/axwin3_src/libaxwin3.so_src/wm.c @@ -125,6 +125,16 @@ void *AxWin3_int_GetDataPtr(tHWND Window) return &Window->Data; } +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->Dest = AxWin3_int_GetWindowID(Destination); +} + void AxWin3_ShowWindow(tHWND Window, int bShow) { tAxWin_IPCMessage *msg; diff --git a/Usermode/include/axwin3/axwin.h b/Usermode/include/axwin3/axwin.h index b4ad45a4..9066cde5 100644 --- a/Usermode/include/axwin3/axwin.h +++ b/Usermode/include/axwin3/axwin.h @@ -44,7 +44,7 @@ extern tHWND AxWin3_CreateWindow( extern void AxWin3_DestroyWindow(tHWND Window); // --- Core window management functions -extern void AxWin3_SendMessage(tHWND Window, int Length, void *Data); +extern void AxWin3_SendMessage(tHWND Window, tHWND Dest, int Message, int Length, void *Data); extern void AxWin3_ShowWindow(tHWND Window, int bShow); extern void AxWin3_SetWindowPos(tHWND Window, short X, short Y, short W, short H); extern void AxWin3_MoveWindow(tHWND Window, short X, short Y); -- 2.20.1