From 6df6a4c5493bd641a028c435be54c4d087f12000 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Wed, 3 Jul 2013 16:48:09 +0800 Subject: [PATCH] Usermode/AxWin3 - Cleaning up and separating code --- Usermode/Applications/axwin3_src/WM/Makefile | 2 +- Usermode/Applications/axwin3_src/WM/common.mk | 3 +- .../axwin3_src/WM/include/ipc_int.h | 40 ++++ Usermode/Applications/axwin3_src/WM/ipc.c | 201 +----------------- .../Applications/axwin3_src/WM/ipc_acess.c | 197 +++++++++++++++++ Usermode/Applications/axwin3_src/WM/main.c | 21 -- Usermode/Applications/axwin3_src/WM/wm.c | 23 ++ 7 files changed, 264 insertions(+), 223 deletions(-) create mode 100644 Usermode/Applications/axwin3_src/WM/include/ipc_int.h create mode 100644 Usermode/Applications/axwin3_src/WM/ipc_acess.c diff --git a/Usermode/Applications/axwin3_src/WM/Makefile b/Usermode/Applications/axwin3_src/WM/Makefile index b2019be7..5854a395 100644 --- a/Usermode/Applications/axwin3_src/WM/Makefile +++ b/Usermode/Applications/axwin3_src/WM/Makefile @@ -5,7 +5,7 @@ DIR := Apps/AxWin/3.0 BIN := AxWinWM -OBJ := main.o input.o video.o ipc.o +OBJ := main.o input.o video.o ipc_acess.o include common.mk LDFLAGS += -lnet diff --git a/Usermode/Applications/axwin3_src/WM/common.mk b/Usermode/Applications/axwin3_src/WM/common.mk index 3cf2b028..e354e0cf 100644 --- a/Usermode/Applications/axwin3_src/WM/common.mk +++ b/Usermode/Applications/axwin3_src/WM/common.mk @@ -2,7 +2,8 @@ CPPFLAGS += -I include/ -I ../include/ CFLAGS += -std=gnu99 -OBJ += image.o wm.o wm_input.o wm_render.o wm_render_text.o wm_hotkeys.o +OBJ += wm.o ipc.o +OBJ += image.o wm_input.o wm_render.o wm_render_text.o wm_hotkeys.o OBJ += decorator.o OBJ += renderers/framebuffer.o OBJ += renderers/background.o diff --git a/Usermode/Applications/axwin3_src/WM/include/ipc_int.h b/Usermode/Applications/axwin3_src/WM/include/ipc_int.h new file mode 100644 index 00000000..30dd2519 --- /dev/null +++ b/Usermode/Applications/axwin3_src/WM/include/ipc_int.h @@ -0,0 +1,40 @@ +/* + * Acess2 GUI (AxWin) Version 3 + * - By John Hodge (thePowersGang) + * + * ipc.h + * - Interprocess communication + */ +#ifndef _IPC_INT_H_ +#define _IPC_INT_H_ + +#include +#include +#include + +typedef struct sIPC_Type tIPC_Type; + +struct sIPC_Type +{ + int (*GetIdentSize)(const void *Ident); + int (*CompareIdent)(const void *Ident1, const void *Ident2); + void (*SendMessage)(const void *Ident, size_t Length, const void *Data); +}; + +struct sIPC_Client +{ + const tIPC_Type *IPCType; + const void *Ident; // Stored after structure + + int nWindows; + tWindow **Windows; +}; + +extern int giIPC_ClientCount; +extern tIPC_Client **gIPC_Clients; + +extern tIPC_Client *IPC_int_GetClient(const tIPC_Type *IPCType, const void *Ident); +extern void IPC_int_DropClient(tIPC_Client *Client); +extern void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg); + +#endif diff --git a/Usermode/Applications/axwin3_src/WM/ipc.c b/Usermode/Applications/axwin3_src/WM/ipc.c index dcb43a96..41949a80 100644 --- a/Usermode/Applications/axwin3_src/WM/ipc.c +++ b/Usermode/Applications/axwin3_src/WM/ipc.c @@ -6,8 +6,6 @@ * - Interprocess communication */ #include -#include -#include #include #include #include @@ -15,220 +13,23 @@ #include #include // Hotkey registration #include // Renderer IPC messages +#include -#define AXWIN_PORT 4101 - -#define STATICBUF_SIZE 64 #define MAX_WINDOWS_PER_APP 128 -// === TYPES === -typedef struct sIPC_Type tIPC_Type; - -struct sIPC_Type -{ - int (*GetIdentSize)(const void *Ident); - int (*CompareIdent)(const void *Ident1, const void *Ident2); - void (*SendMessage)(const void *Ident, size_t Length, const void *Data); -}; - -struct sIPC_Client -{ - const tIPC_Type *IPCType; - const void *Ident; // Stored after structure - - int nWindows; - tWindow **Windows; -}; - // === IMPORTS === extern tWindow *gpWM_FocusedWindow; // Needed for _FocusWindow // === PROTOTYPES === -void IPC_Init(void); -void IPC_FillSelect(int *nfds, fd_set *set); -void IPC_HandleSelect(fd_set *set); - int IPC_Type_Datagram_GetSize(const void *Ident); - int IPC_Type_Datagram_Compare(const void *Ident1, const void *Ident2); -void IPC_Type_Datagram_Send(const void *Ident, size_t Length, const void *Data); - int IPC_Type_Sys_GetSize(const void *Ident); - int IPC_Type_Sys_Compare(const void *Ident1, const void *Ident2); -void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data); - int IPC_Type_IPCPipe_GetSize(const void *Ident); - int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2); -void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data); tIPC_Client *IPC_int_GetClient(const tIPC_Type *IPCType, const void *Ident); void IPC_int_DropClient(tIPC_Client *Client); void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg); // === GLOBALS === -const tIPC_Type gIPC_Type_Datagram = { - IPC_Type_Datagram_GetSize, - IPC_Type_Datagram_Compare, - IPC_Type_Datagram_Send -}; -const tIPC_Type gIPC_Type_SysMessage = { - IPC_Type_Sys_GetSize, - IPC_Type_Sys_Compare, - IPC_Type_Sys_Send -}; -const tIPC_Type gIPC_Type_IPCPipe = { - IPC_Type_IPCPipe_GetSize, - IPC_Type_IPCPipe_Compare, - IPC_Type_IPCPipe_Send -}; - int giNetworkFileHandle = -1; - int giIPCPipeHandle = -1; int giIPC_ClientCount; tIPC_Client **gIPC_Clients; // === CODE === -void IPC_Init(void) -{ - int tmp; - // TODO: Check this - giNetworkFileHandle = _SysOpen("/Devices/ip/loop/udp", OPENFLAG_READ); - if( giNetworkFileHandle != -1 ) - { - tmp = AXWIN_PORT; - _SysIOCtl(giNetworkFileHandle, 4, &tmp); // TODO: Don't hard-code IOCtl number - } - - giIPCPipeHandle = _SysOpen("/Devices/ipcpipe/axwin"/*-$USER*/, OPENFLAG_CREATE); - _SysDebug("giIPCPipeHandle = %i", giIPCPipeHandle); - if( giIPCPipeHandle == -1 ) - _SysDebug("ERROR: Can't create IPCPipe handle"); -} - -void _setfd(int fd, int *nfds, fd_set *set) -{ - if( fd >= 0 ) - { - if( fd >= *nfds ) *nfds = fd+1; - FD_SET(fd, set); - } -} - -void IPC_FillSelect(int *nfds, fd_set *set) -{ - _setfd(giNetworkFileHandle, nfds, set); - _setfd(giIPCPipeHandle, nfds, set); - for( int i = 0; i < giIPC_ClientCount; i ++ ) - { - if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) - _setfd( *(int*)(gIPC_Clients[i]->Ident), nfds, set ); - } -} - -void IPC_HandleSelect(fd_set *set) -{ - if( giNetworkFileHandle != -1 && FD_ISSET(giNetworkFileHandle, set) ) - { - char staticBuf[STATICBUF_SIZE]; - int readlen, identlen; - char *msg; - - readlen = _SysRead(giNetworkFileHandle, staticBuf, sizeof(staticBuf)); - - identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); - msg = staticBuf + identlen; - - IPC_Handle( IPC_int_GetClient(&gIPC_Type_Datagram, staticBuf), readlen - identlen, (void*)msg); - //_SysDebug("IPC_HandleSelect: UDP handled"); - } - - if( giIPCPipeHandle != -1 && FD_ISSET(giIPCPipeHandle, set) ) - { - int newfd = _SysOpenChild(giIPCPipeHandle, "newclient", OPENFLAG_READ|OPENFLAG_WRITE); - _SysDebug("newfd = %i", newfd); - IPC_int_GetClient(&gIPC_Type_IPCPipe, &newfd); - } - - for( int i = 0; i < giIPC_ClientCount; i ++ ) - { - if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) - { - int fd = *(const int*)gIPC_Clients[i]->Ident; - if( FD_ISSET(fd, set) ) - { - char staticBuf[STATICBUF_SIZE]; - size_t len; - len = _SysRead(fd, staticBuf, sizeof(staticBuf)); - if( len == (size_t)-1 ) { - // TODO: Check errno for EINTR - IPC_int_DropClient(gIPC_Clients[i]); - break; - } - IPC_Handle( gIPC_Clients[i], len, (void*)staticBuf ); - } - } - } - - size_t len; - int tid; - while( (len = _SysGetMessage(&tid, 0, NULL)) ) - { - char data[len]; - _SysGetMessage(NULL, len, data); - - IPC_Handle( IPC_int_GetClient(&gIPC_Type_SysMessage, &tid), len, (void*)data ); -// _SysDebug("IPC_HandleSelect: Message handled"); - } -} - -int IPC_Type_Datagram_GetSize(const void *Ident) -{ - return 4 + Net_GetAddressSize( ((const uint16_t*)Ident)[1] ); -} - -int IPC_Type_Datagram_Compare(const void *Ident1, const void *Ident2) -{ - // Pass the buck :) - // - No need to worry about mis-matching sizes, as the size is computed - // from the 3rd/4th bytes, hence it will differ before the size is hit. - return memcmp(Ident1, Ident2, IPC_Type_Datagram_GetSize(Ident1)); -} - -void IPC_Type_Datagram_Send(const void *Ident, size_t Length, const void *Data) -{ - int identlen = IPC_Type_Datagram_GetSize(Ident); - char tmpbuf[ identlen + Length ]; - memcpy(tmpbuf, Ident, identlen); // Header - memcpy(tmpbuf + identlen, Data, Length); // Data - // TODO: Handle fragmented packets - _SysWrite(giNetworkFileHandle, tmpbuf, sizeof(tmpbuf)); -} - -int IPC_Type_Sys_GetSize(const void *Ident) -{ - return sizeof(pid_t); -} - -int IPC_Type_Sys_Compare(const void *Ident1, const void *Ident2) -{ - return *(const tid_t*)Ident1 - *(const tid_t*)Ident2; -} - -void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data) -{ - _SysSendMessage( *(const tid_t*)Ident, Length, Data ); -} - -int IPC_Type_IPCPipe_GetSize(const void *Ident) -{ - return sizeof(int); -} -int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2) -{ - return *(const int*)Ident1 - *(const int*)Ident2; -} -void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data) -{ - size_t rv = _SysWrite( *(const int*)Ident, Data, Length ); - if(rv != Length) { - _SysDebug("Sent message oversize %x", Length); - } -} - // --- Client -> Window Mappings int _CompareClientPtrs(const void *_a, const void *_b) { diff --git a/Usermode/Applications/axwin3_src/WM/ipc_acess.c b/Usermode/Applications/axwin3_src/WM/ipc_acess.c new file mode 100644 index 00000000..1d6e3446 --- /dev/null +++ b/Usermode/Applications/axwin3_src/WM/ipc_acess.c @@ -0,0 +1,197 @@ +/* + * Acess2 GUI (AxWin) Version 3 + * - By John Hodge (thePowersGang) + * + * ipc_acess.c + * - Interprocess communication (acess handlers) + */ +#include +#include +#include +#include +#include + +// === CONSTANTS === +#define STATICBUF_SIZE 64 +#define AXWIN_PORT 4101 + +// === PROTOTYPES === +void IPC_Init(void); +void IPC_FillSelect(int *nfds, fd_set *set); +void IPC_HandleSelect(fd_set *set); + int IPC_Type_Datagram_GetSize(const void *Ident); + int IPC_Type_Datagram_Compare(const void *Ident1, const void *Ident2); +void IPC_Type_Datagram_Send(const void *Ident, size_t Length, const void *Data); + int IPC_Type_Sys_GetSize(const void *Ident); + int IPC_Type_Sys_Compare(const void *Ident1, const void *Ident2); +void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data); + int IPC_Type_IPCPipe_GetSize(const void *Ident); + int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2); +void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data); + +// === GLOBALS === +const tIPC_Type gIPC_Type_Datagram = { + IPC_Type_Datagram_GetSize, + IPC_Type_Datagram_Compare, + IPC_Type_Datagram_Send +}; +const tIPC_Type gIPC_Type_SysMessage = { + IPC_Type_Sys_GetSize, + IPC_Type_Sys_Compare, + IPC_Type_Sys_Send +}; +const tIPC_Type gIPC_Type_IPCPipe = { + IPC_Type_IPCPipe_GetSize, + IPC_Type_IPCPipe_Compare, + IPC_Type_IPCPipe_Send +}; + int giNetworkFileHandle = -1; + int giIPCPipeHandle = -1; + +// === CODE === +void IPC_Init(void) +{ + int tmp; + // TODO: Check this + giNetworkFileHandle = _SysOpen("/Devices/ip/loop/udp", OPENFLAG_READ); + if( giNetworkFileHandle != -1 ) + { + tmp = AXWIN_PORT; + _SysIOCtl(giNetworkFileHandle, 4, &tmp); // TODO: Don't hard-code IOCtl number + } + + giIPCPipeHandle = _SysOpen("/Devices/ipcpipe/axwin"/*-$USER*/, OPENFLAG_CREATE); + _SysDebug("giIPCPipeHandle = %i", giIPCPipeHandle); + if( giIPCPipeHandle == -1 ) + _SysDebug("ERROR: Can't create IPCPipe handle"); +} + +void _setfd(int fd, int *nfds, fd_set *set) +{ + if( fd >= 0 ) + { + if( fd >= *nfds ) *nfds = fd+1; + FD_SET(fd, set); + } +} + +void IPC_FillSelect(int *nfds, fd_set *set) +{ + _setfd(giNetworkFileHandle, nfds, set); + _setfd(giIPCPipeHandle, nfds, set); + for( int i = 0; i < giIPC_ClientCount; i ++ ) + { + if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) + _setfd( *(int*)(gIPC_Clients[i]->Ident), nfds, set ); + } +} + +void IPC_HandleSelect(fd_set *set) +{ + if( giNetworkFileHandle != -1 && FD_ISSET(giNetworkFileHandle, set) ) + { + char staticBuf[STATICBUF_SIZE]; + int readlen, identlen; + char *msg; + + readlen = _SysRead(giNetworkFileHandle, staticBuf, sizeof(staticBuf)); + + identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); + msg = staticBuf + identlen; + + IPC_Handle( IPC_int_GetClient(&gIPC_Type_Datagram, staticBuf), readlen - identlen, (void*)msg); + //_SysDebug("IPC_HandleSelect: UDP handled"); + } + + if( giIPCPipeHandle != -1 && FD_ISSET(giIPCPipeHandle, set) ) + { + int newfd = _SysOpenChild(giIPCPipeHandle, "newclient", OPENFLAG_READ|OPENFLAG_WRITE); + _SysDebug("newfd = %i", newfd); + IPC_int_GetClient(&gIPC_Type_IPCPipe, &newfd); + } + + for( int i = 0; i < giIPC_ClientCount; i ++ ) + { + if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) + { + int fd = *(const int*)gIPC_Clients[i]->Ident; + if( FD_ISSET(fd, set) ) + { + char staticBuf[STATICBUF_SIZE]; + size_t len; + len = _SysRead(fd, staticBuf, sizeof(staticBuf)); + if( len == (size_t)-1 ) { + // TODO: Check errno for EINTR + IPC_int_DropClient(gIPC_Clients[i]); + break; + } + IPC_Handle( gIPC_Clients[i], len, (void*)staticBuf ); + } + } + } + + size_t len; + int tid; + while( (len = _SysGetMessage(&tid, 0, NULL)) ) + { + char data[len]; + _SysGetMessage(NULL, len, data); + + IPC_Handle( IPC_int_GetClient(&gIPC_Type_SysMessage, &tid), len, (void*)data ); +// _SysDebug("IPC_HandleSelect: Message handled"); + } +} + +int IPC_Type_Datagram_GetSize(const void *Ident) +{ + return 4 + Net_GetAddressSize( ((const uint16_t*)Ident)[1] ); +} + +int IPC_Type_Datagram_Compare(const void *Ident1, const void *Ident2) +{ + // Pass the buck :) + // - No need to worry about mis-matching sizes, as the size is computed + // from the 3rd/4th bytes, hence it will differ before the size is hit. + return memcmp(Ident1, Ident2, IPC_Type_Datagram_GetSize(Ident1)); +} + +void IPC_Type_Datagram_Send(const void *Ident, size_t Length, const void *Data) +{ + int identlen = IPC_Type_Datagram_GetSize(Ident); + char tmpbuf[ identlen + Length ]; + memcpy(tmpbuf, Ident, identlen); // Header + memcpy(tmpbuf + identlen, Data, Length); // Data + // TODO: Handle fragmented packets + _SysWrite(giNetworkFileHandle, tmpbuf, sizeof(tmpbuf)); +} + +int IPC_Type_Sys_GetSize(const void *Ident) +{ + return sizeof(pid_t); +} + +int IPC_Type_Sys_Compare(const void *Ident1, const void *Ident2) +{ + return *(const tid_t*)Ident1 - *(const tid_t*)Ident2; +} + +void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data) +{ + _SysSendMessage( *(const tid_t*)Ident, Length, Data ); +} + +int IPC_Type_IPCPipe_GetSize(const void *Ident) +{ + return sizeof(int); +} +int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2) +{ + return *(const int*)Ident1 - *(const int*)Ident2; +} +void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data) +{ + size_t rv = _SysWrite( *(const int*)Ident, Data, Length ); + if(rv != Length) { + _SysDebug("Sent message oversize %x", Length); + } +} diff --git a/Usermode/Applications/axwin3_src/WM/main.c b/Usermode/Applications/axwin3_src/WM/main.c index bf796d7b..5a2c3549 100644 --- a/Usermode/Applications/axwin3_src/WM/main.c +++ b/Usermode/Applications/axwin3_src/WM/main.c @@ -9,20 +9,13 @@ #include #include #include -#include #include #include "include/lowlevel.h" // === IMPORTS === extern void Video_Setup(void); extern void WM_Initialise(void); -extern int Renderer_Menu_Init(void); -extern int Renderer_Widget_Init(void); -extern int Renderer_Background_Init(void); -extern int Renderer_Framebuffer_Init(void); -extern int Renderer_RichText_Init(void); extern void WM_Update(void); -extern void WM_Hotkey_Register(int nKeys, uint32_t *Keys, const char *ActionName); // === PROTOTYPES === void ParseCommandline(int argc, char **argv); @@ -63,21 +56,7 @@ int main(int argc, char *argv[]) IPC_Init(); Input_Init(); - Renderer_Menu_Init(); - Renderer_Widget_Init(); - Renderer_Background_Init(); - Renderer_Framebuffer_Init(); - Renderer_RichText_Init(); WM_Initialise(); - - // TODO: Move these to config - uint32_t keys[4]; - keys[0] = KEYSYM_LEFTGUI; keys[1] = KEYSYM_r; - WM_Hotkey_Register(2, keys, "Interface>Run"); - keys[0] = KEYSYM_LEFTGUI; keys[1] = KEYSYM_t; - WM_Hotkey_Register(2, keys, "Interface>Terminal"); - keys[0] = KEYSYM_LEFTGUI; keys[1] = KEYSYM_e; - WM_Hotkey_Register(2, keys, "Interface>TextEdit"); // Spawn interface root if( !gbNoSpawnUI ) diff --git a/Usermode/Applications/axwin3_src/WM/wm.c b/Usermode/Applications/axwin3_src/WM/wm.c index 4b28d11d..5f204af9 100644 --- a/Usermode/Applications/axwin3_src/WM/wm.c +++ b/Usermode/Applications/axwin3_src/WM/wm.c @@ -12,8 +12,15 @@ #include #include #include +#include // === IMPORTS === +extern int Renderer_Menu_Init(void); +extern int Renderer_Widget_Init(void); +extern int Renderer_Background_Init(void); +extern int Renderer_Framebuffer_Init(void); +extern int Renderer_RichText_Init(void); + 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); @@ -29,10 +36,26 @@ tWindow *gpWM_HilightedWindow; // === CODE === void WM_Initialise(void) { + // TODO: Autodetect these + Renderer_Menu_Init(); + Renderer_Widget_Init(); + Renderer_Background_Init(); + Renderer_Framebuffer_Init(); + Renderer_RichText_Init(); + WM_CreateWindow(NULL, NULL, 0, 0x0088FF, "Background"); gpWM_RootWindow->W = giScreenWidth; gpWM_RootWindow->H = giScreenHeight; gpWM_RootWindow->Flags = WINFLAG_SHOW|WINFLAG_NODECORATE; + + // TODO: Move these to config + uint32_t keys[4]; + keys[0] = KEYSYM_LEFTGUI; keys[1] = KEYSYM_r; + WM_Hotkey_Register(2, keys, "Interface>Run"); + keys[0] = KEYSYM_LEFTGUI; keys[1] = KEYSYM_t; + WM_Hotkey_Register(2, keys, "Interface>Terminal"); + keys[0] = KEYSYM_LEFTGUI; keys[1] = KEYSYM_e; + WM_Hotkey_Register(2, keys, "Interface>TextEdit"); } void WM_RegisterRenderer(tWMRenderer *Renderer) -- 2.20.1