X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fwm.c;h=8886af1947e2d78cfc3317c4c9e33fd207130624;hb=ae4f74ae1303ff2ef59d0885606f607e529c5ca0;hp=fe944e3aff188901e22ba9d5365279981926b4eb;hpb=1b9e758fbf856934974e847c3d5b348d237a0001;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/wm.c b/Usermode/Applications/axwin3_src/WM/wm.c index fe944e3a..8886af19 100644 --- a/Usermode/Applications/axwin3_src/WM/wm.c +++ b/Usermode/Applications/axwin3_src/WM/wm.c @@ -15,6 +15,7 @@ // === 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 === @@ -139,30 +140,61 @@ void WM_RaiseWindow(tWindow *Window) Window->PrevSibling = parent->LastChild; Window->NextSibling = NULL; parent->LastChild = Window; + + _SysDebug("Raised %p", Window); } +/* +void WM_RaiseWindow(tWindow *Window) +{ + // Move to the last render position (move to top) + while(Window && Window->Parent) + { + if( Window->NextSibling ) + { + // remove + if( Window->PrevSibling ) + Window->PrevSibling->NextSibling = Window->NextSibling; + Window->NextSibling->PrevSibling = Window->PrevSibling; + // Mutate self + Window->PrevSibling = Window->Parent->LastChild; + Window->NextSibling = NULL; + // re-add + Window->PrevSibling->NextSibling = Window; + Window->Parent->LastChild = Window; + } + _SysDebug("WM_RaiseWindow: Raised %p", Window); + Window = Window->Parent; + } +} +*/ + 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) ) return ; - _msg.Val = 0; - WM_SendMessage(NULL, gpWM_FocusedWindow, WNDMSG_FOCUS, sizeof(_msg), &_msg); - _msg.Val = 1; - WM_SendMessage(NULL, Destination, WNDMSG_FOCUS, sizeof(_msg), &_msg); - + if( gpWM_FocusedWindow ) + { + _msg.Val = 0; + WM_SendMessage(NULL, gpWM_FocusedWindow, WNDMSG_FOCUS, sizeof(_msg), &_msg); + } + if( Destination ) + { + _msg.Val = 1; + WM_SendMessage(NULL, Destination, WNDMSG_FOCUS, sizeof(_msg), &_msg); + } + WM_Invalidate(gpWM_FocusedWindow); WM_Invalidate(Destination); - gpWM_FocusedWindow = Destination; - - // Get the owner of the focused window -// while(Destination && Destination->Owner) Destination = Destination->Owner; -// gpWM_HilightedWindow = Destination; + gpWM_FocusedWindow = Destination; } @@ -178,8 +210,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; @@ -192,6 +226,7 @@ void WM_ShowWindow(tWindow *Window, int bShow) free(Window->RenderBuffer); Window->RenderBuffer = NULL; } + _SysDebug("Window %p hidden", Window); } WM_Invalidate(Window); @@ -256,10 +291,12 @@ int WM_MoveWindow(tWindow *Window, int X, int Y) } // TODO: Re-sanitise + _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; } @@ -273,6 +310,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); Window->W = W; Window->H = H; if(Window->RenderBuffer) { @@ -293,12 +331,20 @@ int WM_ResizeWindow(tWindow *Window, int W, int H) int WM_SendMessage(tWindow *Source, tWindow *Dest, int Message, int Length, const void *Data) { - if(Dest == NULL) return -2; - if(Length > 0 && Data == NULL) return -1; +// _SysDebug("WM_SendMessage: (%p, %p, %i, %i, %p)", Source, Dest, Message, Length, Data); + if(Dest == NULL) { + _SysDebug("WM_SendMessage: NULL destination from %p", __builtin_return_address(0)); + return -2; + } + if(Length > 0 && Data == NULL) { + _SysDebug("WM_SendMessage: non-zero length and NULL data"); + return -1; + } if( Decorator_HandleMessage(Dest, Message, Length, Data) != 1 ) { // TODO: Catch errors from ->HandleMessage +// _SysDebug("WM_SendMessage: Decorator grabbed message?"); return 0; } @@ -306,11 +352,13 @@ int WM_SendMessage(tWindow *Source, tWindow *Dest, int Message, int Length, cons if( Dest->Renderer->HandleMessage(Dest, Message, Length, Data) != 1 ) { // TODO: Catch errors from ->HandleMessage +// _SysDebug("WM_SendMessage: Renderer grabbed message?"); return 0; } // TODO: Implement message masking + // Dispatch to client if(Dest->Client) { uint32_t src_id; @@ -325,12 +373,19 @@ int WM_SendMessage(tWindow *Source, tWindow *Dest, int Message, int Length, cons src_id = Source->ID; } +// _SysDebug("WM_SendMessage: IPC Dispatch"); IPC_SendWMMessage(Dest->Client, src_id, Dest->ID, Message, Length, Data); } 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 ; @@ -355,6 +410,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) ) { @@ -376,17 +442,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; @@ -414,6 +469,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);