X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fwm.c;h=cc9d81d073392838f32933aed07aa93fe8857e9a;hb=94d9540cae85d2f9e145fe4d2986e84b46bbd052;hp=89cdd06e38e26dd35b0dabfdeb1896231fe392ff;hpb=d0a5fece3e6b4ce2bb4d73817d4026f9ca8e220a;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/wm.c b/Usermode/Applications/axwin3_src/WM/wm.c index 89cdd06e..cc9d81d0 100644 --- a/Usermode/Applications/axwin3_src/WM/wm.c +++ b/Usermode/Applications/axwin3_src/WM/wm.c @@ -94,6 +94,57 @@ tWindow *WM_CreateWindow(tWindow *Parent, tIPC_Client *Client, uint32_t ID, int return ret; } +void WM_DestroyWindow(tWindow *Window) +{ + // TODO: Lock window and flag as invalid + + // - Remove from render tree + { + // TODO: Lock render tree? + tWindow *prev = Window->PrevSibling; + tWindow *next = Window->NextSibling; + if(prev) + prev->NextSibling = next; + else + Window->Parent->FirstChild = next; + if(next) + next->PrevSibling = prev; + else + Window->Parent->LastChild = prev; + } + WM_Invalidate(Window->Parent); + + // - Remove from inheritance tree? + + // - Clean up render children + { + // Lock should not be needed + tWindow *win, *next; + for( win = Window->FirstChild; win; win = next ) + { + next = win->NextSibling; + ASSERT(Window->FirstChild->Parent == Window); + WM_DestroyWindow(win); + } + } + + // - Clean up inheriting children? + + // - Tell renderer to clean up + if( Window->Renderer->DestroyWindow ) + Window->Renderer->DestroyWindow(Window); + else + _SysDebug("WARN: Renderer %s does not have a destroy function", Window->Renderer->Name); + + // - Tell client to clean up + WM_SendMessage(NULL, Window, WNDMSG_DESTROY, 0, NULL); + + // - Clean up render cache and window structure + free(Window->Title); + free(Window->RenderBuffer); + free(Window); +} + tWindow *WM_GetWindowByID(tWindow *Requester, uint32_t ID) { return IPC_int_GetWindow(Requester->Client, ID); @@ -140,6 +191,8 @@ void WM_RaiseWindow(tWindow *Window) Window->PrevSibling = parent->LastChild; Window->NextSibling = NULL; parent->LastChild = Window; + + _SysDebug("Raised %p", Window); } /* @@ -171,6 +224,8 @@ void WM_FocusWindow(tWindow *Destination) { struct sWndMsg_Bool _msg; + _SysDebug("WM_FocusWindow(%p)", Destination); + if( gpWM_FocusedWindow == Destination ) return ; if( Destination && !(Destination->Flags & WINFLAG_SHOW) ) @@ -190,8 +245,6 @@ void WM_FocusWindow(tWindow *Destination) WM_Invalidate(gpWM_FocusedWindow); WM_Invalidate(Destination); - WM_RaiseWindow(Destination); - gpWM_FocusedWindow = Destination; } @@ -208,8 +261,10 @@ void WM_ShowWindow(tWindow *Window, int bShow) WM_SendMessage(NULL, Window, WNDMSG_SHOW, sizeof(_msg), &_msg); // Update the flag - if(bShow) + if(bShow) { Window->Flags |= WINFLAG_SHOW; + _SysDebug("Window %p shown", Window); + } else { Window->Flags &= ~WINFLAG_SHOW; @@ -222,6 +277,7 @@ void WM_ShowWindow(tWindow *Window, int bShow) free(Window->RenderBuffer); Window->RenderBuffer = NULL; } + _SysDebug("Window %p hidden", Window); } WM_Invalidate(Window); @@ -289,8 +345,9 @@ int WM_MoveWindow(tWindow *Window, int X, int Y) _SysDebug("WM_MoveWindow: (%i,%i)", X, Y); Window->X = X; Window->Y = Y; - // TODO: Why invalidate buffer? - WM_Invalidate(Window); + // Mark up the tree that a child window has changed + while( (Window = Window->Parent) ) + Window->Flags &= ~WINFLAG_CHILDCLEAN; return 0; } @@ -304,7 +361,7 @@ int WM_ResizeWindow(tWindow *Window, int W, int H) if( Window->W == W && Window->H == H ) return 0; - _SysDebug("WM_Resizeindow: %ix%i", W, H); + _SysDebug("WM_ResizeWindow: %ix%i", W, H); Window->W = W; Window->H = H; if(Window->RenderBuffer) { @@ -404,6 +461,17 @@ void WM_int_UpdateWindow(tWindow *Window) if( !(Window->Flags & WINFLAG_SHOW) ) return ; + if( (Window->Flags & WINFLAG_RELATIVE) && Window->Parent ) + { + Window->RealX = Window->Parent->RealX + Window->Parent->BorderL + Window->X; + Window->RealY = Window->Parent->RealY + Window->Parent->BorderT + Window->Y; + } + else + { + Window->RealX = Window->X; + Window->RealY = Window->Y; + } + // Render if( !(Window->Flags & WINFLAG_CLEAN) ) { @@ -425,17 +493,6 @@ void WM_int_UpdateWindow(tWindow *Window) Window->RealW = Window->W; Window->RealH = Window->H; } - - if( (Window->Flags & WINFLAG_RELATIVE) && Window->Parent ) - { - Window->RealX = Window->Parent->X + Window->Parent->BorderL + Window->X; - Window->RealY = Window->Parent->Y + Window->Parent->BorderT + Window->Y; - } - else - { - Window->RealX = Window->X; - Window->RealY = Window->Y; - } Window->Renderer->Redraw(Window); Window->Flags |= WINFLAG_CLEAN; @@ -463,6 +520,18 @@ void WM_int_BlitWindow(tWindow *Window) // Ignore hidden windows if( !(Window->Flags & WINFLAG_SHOW) ) return ; + + // Duplicated position update to handle window moving + if( (Window->Flags & WINFLAG_RELATIVE) && Window->Parent ) + { + Window->RealX = Window->Parent->RealX + Window->Parent->BorderL + Window->X; + Window->RealY = Window->Parent->RealY + Window->Parent->BorderT + Window->Y; + } + else + { + Window->RealX = Window->X; + Window->RealY = Window->Y; + } // _SysDebug("Blit %p (%p) to (%i,%i) %ix%i", Window, Window->RenderBuffer, // Window->RealX, Window->RealY, Window->RealW, Window->RealH);