From: John Hodge Date: Fri, 18 May 2012 14:36:13 +0000 (+0800) Subject: Usermode/AxWin3 - Bugfixing and cleanup X-Git-Tag: rel0.15~611^2~98 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=f22d52d646638847ec2ff876f603efa2b173995d;p=tpg%2Facess2.git Usermode/AxWin3 - Bugfixing and cleanup --- diff --git a/Usermode/Applications/axwin3_src/WM/include/common.h b/Usermode/Applications/axwin3_src/WM/include/common.h index 360f99ad..1be86ffe 100644 --- a/Usermode/Applications/axwin3_src/WM/include/common.h +++ b/Usermode/Applications/axwin3_src/WM/include/common.h @@ -12,6 +12,8 @@ #define TODO(str) +#define ASSERT(expr) do{if(!(expr)){_SysDebug("%s:%i - ASSERTION FAILED: "#expr, __FILE__, __LINE__);exit(-1);}}while(0) + #define UNIMPLEMENTED() do{_SysDebug("TODO: Implement %s", __func__); for(;;);}while(0) #define AXWIN_VERSION 0x300 diff --git a/Usermode/Applications/axwin3_src/WM/include/wm_messages.h b/Usermode/Applications/axwin3_src/WM/include/wm_messages.h deleted file mode 100644 index 2308c284..00000000 --- a/Usermode/Applications/axwin3_src/WM/include/wm_messages.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Acess2 Window Manager v3 (axwin3) - * - By John Hodge (thePowersGang) - * - * include/wm_messages.h - * - Core window messages - */ -#ifndef _WM_MESSAGES_H_ -#define _WM_MESSAGES_H_ - -/** - * \brief Messages delivered to windows - */ -enum eWM_WindowMessages -{ - WNDMSG_NULL, - - WNDMSG_CREATE, - WNDMSG_DESTROY, - WNDMSG_FOCUS, // Called on change - WNDMSG_SHOW, // Called on change - - WNDMSG_RESIZE, - - WNDMSG_MOUSEMOVE, - WNDMSG_MOUSEBTN, - WNDMSG_KEYDOWN, - WNDMSG_KEYFIRE, - WNDMSG_KEYUP, - - WNDMSG_HOTKEY, - - WNDMSG_CLASS_MIN = 0x1000, - WNDMSG_CLASS_MAX = 0x2000, -}; - -struct sWndMsg_Bool -{ - uint8_t Val; -}; - -struct sWndMsg_Resize -{ - uint16_t W, H; -}; - -struct sWndMsg_MouseMove -{ - int16_t X, Y; - int16_t dX, dY; -}; - -struct sWndMsg_MouseButton -{ - int16_t X, Y; - uint8_t Button; - uint8_t bPressed; -}; - -struct sWndMsg_KeyAction -{ - uint32_t KeySym; - uint32_t UCS32; -}; - -struct sWndMsg_Hotkey -{ - uint16_t ID; -}; - -#endif diff --git a/Usermode/Applications/axwin3_src/WM/ipc.c b/Usermode/Applications/axwin3_src/WM/ipc.c index fee78bb1..92f89846 100644 --- a/Usermode/Applications/axwin3_src/WM/ipc.c +++ b/Usermode/Applications/axwin3_src/WM/ipc.c @@ -259,10 +259,88 @@ void IPC_int_SetWindow(tIPC_Client *Client, uint32_t WindowID, tWindow *WindowPt } // --- IPC Message Handlers --- +int IPC_Msg_Ping(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + ASSERT(Msg->ID == IPCMSG_PING); + + if( !(Msg->Flags & IPCMSG_FLAG_RETURN) ) return 0; + + if( Msg->Size < 4 ) return -1; + + tIPCMsg_ReturnInt *ret = (void*)Msg->Data; + Msg->ID = IPCMSG_PING; + Msg->Size = sizeof(*ret); + ret->Value = AXWIN_VERSION; + Client->IPCType->SendMessage(Client->Ident, sizeof(*Msg)+sizeof(*ret), Msg); + return 0; +} + +int IPC_Msg_GetDisplayCount(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tAxWin_IPCMessage *ret_hdr; + tIPCMsg_ReturnInt *ret; + char buf[sizeof(*ret_hdr)+sizeof(*ret)]; + + ASSERT(Msg->ID == IPCMSG_GETDISPLAYCOUNT); + + if( !(Msg->Flags & IPCMSG_FLAG_RETURN) ) return 0; + + ret_hdr = (void*)buf; + ret_hdr->ID = IPCMSG_GETDISPLAYCOUNT; + ret_hdr->Flags = 0; + ret_hdr->Window = -1; + ret_hdr->Size = sizeof(*ret); + ret = (void*)ret_hdr->Data; + ret->Value = 1; // HARD CODE - Current version only supports one display + + Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf); + return 0; +} + +int IPC_Msg_GetDisplayDims(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tIPCMsg_GetDisplayDims *info; + tAxWin_IPCMessage *ret_hdr; + tIPCMsg_RetDisplayDims *ret; + char buf[sizeof(*ret_hdr)+sizeof(*ret)]; + + ASSERT(Msg->ID == IPCMSG_GETDISPLAYDIMS); + + if( !(Msg->Flags & IPCMSG_FLAG_RETURN) ) return 0; + + info = (void*)Msg->Data; + + ret_hdr = (void*)buf; + ret_hdr->ID = IPCMSG_GETDISPLAYDIMS; + ret_hdr->Flags = 0; + ret_hdr->Window = -1; + ret_hdr->Size = sizeof(*ret); + ret = (void*)ret_hdr->Data; + + // HARD CODE! Only one display supported + if( info->DisplayID == 0 ) + { + ret->X = 0; + ret->Y = 0; + ret->W = giScreenWidth; + ret->H = giScreenHeight; + } + else + { + ret->X = 0; ret->Y = 0; + ret->W = 0; ret->H = 0; + } + + Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf); + return 0; +} + int IPC_Msg_SendMsg(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { tIPCMsg_SendMsg *info = (void*)Msg->Data; tWindow *src, *dest; + + ASSERT(Msg->ID == IPCMSG_SENDMSG); // - Sanity checks if( Msg->Size < sizeof(tIPCMsg_SendMsg) ) @@ -280,27 +358,13 @@ int IPC_Msg_SendMsg(tIPC_Client *Client, tAxWin_IPCMessage *Msg) return 0; } -int IPC_Msg_FocusWindow(tIPC_Client *Client, tAxWin_IPCMessage *Msg) -{ - tWindow *win; - - // Don't allow the focus to be changed unless the client has the focus - if(!gpWM_FocusedWindow) return 1; - if(gpWM_FocusedWindow->Client != Client) return 1; - - win = IPC_int_GetWindow(Client, Msg->Window); - if(!win) return 1; - - WM_FocusWindow(win); - - return 0; -} - int IPC_Msg_CreateWin(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { tIPCMsg_CreateWin *info = (void*)Msg->Data; tWindow *newwin, *parent; + ASSERT(Msg->ID == IPCMSG_CREATEWIN); + // - Sanity checks // > +1 is for NULL byte on string if( Msg->Size < sizeof(*info) + 1 ) { @@ -335,6 +399,8 @@ int IPC_Msg_SetWindowTitle(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { tWindow *win; + ASSERT(Msg->ID == IPCMSG_SETWINTITLE); + if( Msg->Size < 1 ) return -1; if( Msg->Data[ Msg->Size-1 ] != '\0' ) return -1; @@ -351,6 +417,8 @@ int IPC_Msg_ShowWindow(tIPC_Client *Client, tAxWin_IPCMessage *Msg) tIPCMsg_Boolean *info = (void*)Msg->Data; tWindow *win; + ASSERT(Msg->ID == IPCMSG_SHOWWINDOW); + if( Msg->Size < sizeof(*info) ) return -1; win = IPC_int_GetWindow(Client, Msg->Window); @@ -375,11 +443,31 @@ int IPC_Msg_DecorateWindow(tIPC_Client *Client, tAxWin_IPCMessage *Msg) return 0; } +int IPC_Msg_FocusWindow(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tWindow *win; + + ASSERT(Msg->ID == IPCMSG_FOCUSWINDOW); + + // Don't allow the focus to be changed unless the client has the focus + if(!gpWM_FocusedWindow) return 1; + if(gpWM_FocusedWindow->Client != Client) return 1; + + win = IPC_int_GetWindow(Client, Msg->Window); + if(!win) return 1; + + WM_FocusWindow(win); + + return 0; +} + int IPC_Msg_SetWinPos(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { tIPCMsg_SetWindowPos *info = (void*)Msg->Data; tWindow *win; + ASSERT(Msg->ID == IPCMSG_SETWINPOS); + if(Msg->Size < sizeof(*info)) return -1; win = IPC_int_GetWindow(Client, Msg->Window); @@ -395,61 +483,27 @@ int IPC_Msg_SetWinPos(tIPC_Client *Client, tAxWin_IPCMessage *Msg) return 0; } -int IPC_Msg_GetDisplayCount(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +int IPC_Msg_RegisterAction(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { - tAxWin_IPCMessage *ret_hdr; - tIPCMsg_ReturnInt *ret; - char buf[sizeof(*ret_hdr)+sizeof(*ret)]; - - if( !(Msg->Flags & IPCMSG_FLAG_RETURN) ) return 0; - - ret_hdr = (void*)buf; - ret_hdr->ID = IPCMSG_GETDISPLAYCOUNT; - ret_hdr->Flags = 0; - ret_hdr->Window = -1; - ret_hdr->Size = sizeof(*ret); - ret = (void*)ret_hdr->Data; - ret->Value = 1; // HARD CODE - Current version only supports one display - - Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf); + ASSERT(Msg->ID == IPCMSG_REGACTION); return 0; } -int IPC_Msg_GetDisplayDims(tIPC_Client *Client, tAxWin_IPCMessage *Msg) -{ - tIPCMsg_GetDisplayDims *info; - tAxWin_IPCMessage *ret_hdr; - tIPCMsg_RetDisplayDims *ret; - char buf[sizeof(*ret_hdr)+sizeof(*ret)]; - - if( !(Msg->Flags & IPCMSG_FLAG_RETURN) ) return 0; - - info = (void*)Msg->Data; - - ret_hdr = (void*)buf; - ret_hdr->ID = IPCMSG_GETDISPLAYDIMS; - ret_hdr->Flags = 0; - ret_hdr->Window = -1; - ret_hdr->Size = sizeof(*ret); - ret = (void*)ret_hdr->Data; - - // HARD CODE! Only one display supported - if( info->DisplayID == 0 ) - { - ret->X = 0; - ret->Y = 0; - ret->W = giScreenWidth; - ret->H = giScreenHeight; - } - else - { - ret->X = 0; ret->Y = 0; - ret->W = 0; ret->H = 0; - } - - Client->IPCType->SendMessage(Client->Ident, sizeof(buf), buf); - return 0; -} +int (*gIPC_MessageHandlers[])(tIPC_Client *Client, tAxWin_IPCMessage *Msg) = { + IPC_Msg_Ping, + IPC_Msg_GetDisplayCount, + IPC_Msg_GetDisplayDims, + IPC_Msg_SendMsg, + IPC_Msg_CreateWin, + NULL, // Destroy window + IPC_Msg_SetWindowTitle, + IPC_Msg_ShowWindow, + IPC_Msg_DecorateWindow, + IPC_Msg_FocusWindow, + IPC_Msg_SetWinPos, + IPC_Msg_RegisterAction +}; +const int giIPC_NumMessageHandlers = sizeof(gIPC_MessageHandlers)/sizeof(gIPC_MessageHandlers[0]); void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxWin_IPCMessage *Msg) { @@ -466,77 +520,20 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW client = IPC_int_GetClient(IPCType, Ident); - switch((enum eAxWin_IPCMessageTypes) Msg->ID) - { - // --- Ping message (reset timeout and get server version) - case IPCMSG_PING: - _SysDebug(" IPC_Handle: IPCMSG_PING"); - if( Msg->Size < 4 ) return; - if( Msg->Flags & IPCMSG_FLAG_RETURN ) - { - tIPCMsg_ReturnInt *ret = (void*)Msg->Data; - Msg->ID = IPCMSG_PING; - Msg->Size = sizeof(*ret); - ret->Value = AXWIN_VERSION; - IPCType->SendMessage(Ident, sizeof(*Msg)+sizeof(*ret), Msg); - } - break; - - // -- Get display count - case IPCMSG_GETDISPLAYCOUNT: - rv = IPC_Msg_GetDisplayCount(client, Msg); - break; - - // --- Get display dimensions - case IPCMSG_GETDISPLAYDIMS: - rv = IPC_Msg_GetDisplayDims(client, Msg); - break; - - // --- Send a message - case IPCMSG_SENDMSG: - _SysDebug(" IPC_Handle: IPCMSG_SENDMSG %i", ((tIPCMsg_SendMsg*)Msg->Data)->ID); - rv = IPC_Msg_SendMsg(client, Msg); - break; - - // --- Create window - case IPCMSG_CREATEWIN: - _SysDebug(" IPC_Handle: IPCMSG_CREATEWIN"); - rv = IPC_Msg_CreateWin(client, Msg); - break; - // TODO: Destroy window - - // --- Set window title - case IPCMSG_SETWINTITLE: - _SysDebug(" IPC_Handle: IPCMSG_SETWINTITLE"); - rv = IPC_Msg_SetWindowTitle(client, Msg); - break; - - // --- Give a window focus - case IPCMSG_FOCUSWINDOW: - _SysDebug(" IPC_Handle: IPCMSG_FOCUSWINDOW"); - rv = IPC_Msg_FocusWindow(client, Msg); - break; - // --- Show/Hide a window - case IPCMSG_SHOWWINDOW: - _SysDebug(" IPC_Handle: IPCMSG_SHOWWINDOW"); - rv = IPC_Msg_ShowWindow(client, Msg); - break; - case IPCMSG_DECORATEWINDOW: - _SysDebug(" IPC_Handle: IPCMSG_DECORATEWINDOW"); - rv = IPC_Msg_DecorateWindow(client, Msg); - break; - // --- Move/Resize a window - case IPCMSG_SETWINPOS: - _SysDebug(" IPC_Handle: IPCMSG_SETWINPOS"); - rv = IPC_Msg_SetWinPos(client, Msg); - break; - - // --- Unknown message - default: + 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); - break; + 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: Msg->ID = %i", Msg->ID); + rv = gIPC_MessageHandlers[Msg->ID](client, Msg); _SysDebug("IPC_Handle: rv = %i", rv); } diff --git a/Usermode/Applications/axwin3_src/WM/video.c b/Usermode/Applications/axwin3_src/WM/video.c index a65ddf96..3e6af589 100644 --- a/Usermode/Applications/axwin3_src/WM/video.c +++ b/Usermode/Applications/axwin3_src/WM/video.c @@ -70,11 +70,11 @@ void Video_Update(void) if( giVideo_LastDirtyLine == 0 ) return; - _SysDebug("Video_Update - Updating lines %i to %i (0x%x+0x%x px)", - giVideo_FirstDirtyLine, giVideo_LastDirtyLine, ofs, size); +// _SysDebug("Video_Update - Updating lines %i to %i (0x%x+0x%x px)", +// giVideo_FirstDirtyLine, giVideo_LastDirtyLine, ofs, size); seek(giTerminalFD, ofs*4, 1); write(giTerminalFD, gpScreenBuffer+ofs, size*4); - _SysDebug("Video_Update - Done"); +// _SysDebug("Video_Update - Done"); giVideo_FirstDirtyLine = 0; giVideo_LastDirtyLine = 0; } diff --git a/Usermode/Applications/axwin3_src/WM/wm_input.c b/Usermode/Applications/axwin3_src/WM/wm_input.c index 223dbef9..751bcbbe 100644 --- a/Usermode/Applications/axwin3_src/WM/wm_input.c +++ b/Usermode/Applications/axwin3_src/WM/wm_input.c @@ -129,8 +129,6 @@ void WM_Input_KeyFire(uint32_t Character, uint32_t Scancode) // TODO: Properly translate into KeySyms and Unicode - // TODO: Shortcuts - msg.KeySym = Scancode; msg.UCS32 = Character; WM_SendMessage(NULL, gpWM_FocusedWindow, WNDMSG_KEYFIRE, sizeof(msg), &msg); diff --git a/Usermode/Applications/axwin3_src/include/ipcmessages.h b/Usermode/Applications/axwin3_src/include/ipcmessages.h index a752e368..e7424fe3 100644 --- a/Usermode/Applications/axwin3_src/include/ipcmessages.h +++ b/Usermode/Applications/axwin3_src/include/ipcmessages.h @@ -100,6 +100,7 @@ enum eAxWin_IPCMessageTypes IPCMSG_DECORATEWINDOW, //!< Enable/Disable decorations IPCMSG_FOCUSWINDOW, //!< Give a window focus (no data) IPCMSG_SETWINPOS, //!< Set a window position + IPCMSG_REGACTION //!< Register an action name }; #endif diff --git a/Usermode/Applications/axwin3_src/include/wm_messages.h b/Usermode/Applications/axwin3_src/include/wm_messages.h new file mode 100644 index 00000000..2308c284 --- /dev/null +++ b/Usermode/Applications/axwin3_src/include/wm_messages.h @@ -0,0 +1,71 @@ +/* + * Acess2 Window Manager v3 (axwin3) + * - By John Hodge (thePowersGang) + * + * include/wm_messages.h + * - Core window messages + */ +#ifndef _WM_MESSAGES_H_ +#define _WM_MESSAGES_H_ + +/** + * \brief Messages delivered to windows + */ +enum eWM_WindowMessages +{ + WNDMSG_NULL, + + WNDMSG_CREATE, + WNDMSG_DESTROY, + WNDMSG_FOCUS, // Called on change + WNDMSG_SHOW, // Called on change + + WNDMSG_RESIZE, + + WNDMSG_MOUSEMOVE, + WNDMSG_MOUSEBTN, + WNDMSG_KEYDOWN, + WNDMSG_KEYFIRE, + WNDMSG_KEYUP, + + WNDMSG_HOTKEY, + + WNDMSG_CLASS_MIN = 0x1000, + WNDMSG_CLASS_MAX = 0x2000, +}; + +struct sWndMsg_Bool +{ + uint8_t Val; +}; + +struct sWndMsg_Resize +{ + uint16_t W, H; +}; + +struct sWndMsg_MouseMove +{ + int16_t X, Y; + int16_t dX, dY; +}; + +struct sWndMsg_MouseButton +{ + int16_t X, Y; + uint8_t Button; + uint8_t bPressed; +}; + +struct sWndMsg_KeyAction +{ + uint32_t KeySym; + uint32_t UCS32; +}; + +struct sWndMsg_Hotkey +{ + uint16_t ID; +}; + +#endif diff --git a/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c b/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c index 17d089f9..4625db77 100644 --- a/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c +++ b/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c @@ -121,11 +121,16 @@ tAxWin_IPCMessage *AxWin3_int_GetIPCMessage(void) switch(giConnectionType) { case CONNTYPE_SENDMESSAGE: - _SysWaitEvent(THREAD_EVENT_IPCMSG); - while(SysGetMessage(NULL, NULL)) + for( ;; ) { pid_t tid; - len = SysGetMessage(&tid, NULL); + + // Wait for a message to arrive + while( !(len = SysGetMessage(&tid, NULL)) ) + { + _SysWaitEvent(THREAD_EVENT_IPCMSG); + } + // Check if the message came from the server if(tid != giConnectionNum) {