void GUIFreeWindowMemory( gui_window *wnd, bool from_parent, bool dialog ) { gui_window *root; HWND capture; from_parent = from_parent; if( ( wnd->hwnd != NULLHANDLE ) && ( GUICurrWnd == wnd ) ) { capture = _wpi_getcapture(); if( capture == wnd->hwnd ) { _wpi_releasecapture(); } } if( wnd->font != NULL ) { _wpi_deletefont( wnd->font ); wnd->font = NULL; } if( wnd->icon != (WPI_HICON)NULL ) { _wpi_destroyicon( wnd->icon ); } GUIFreeColours( wnd ); GUIFreeBKBrush( wnd ); GUIControlDeleteAll( wnd ); GUICloseToolBar( wnd ); GUIFreeHint( wnd ); _wpi_setwindowlongptr( wnd->hwnd, GUI_EXTRA_WORD * EXTRA_SIZE, 0 ); if( wnd->root != NULLHANDLE ) { _wpi_setwindowlongptr( wnd->root, GUI_EXTRA_WORD * EXTRA_SIZE, 0 ); } if( !dialog ) { GUIMDIDelete( wnd ); if( GUICurrWnd == wnd ) { GUICurrWnd = NULL; } GUIFreePopupList( wnd ); } GUIDeleteFromList( wnd ); /* If the window being deleted was the current window, choose a new * window to bring to front. Don't do this if the window that's being * destroyed is being destroyed because it's parent is being destroyed * (ie never got WM_CLOSE so DOING_CLOSE isn't set). */ if( !dialog && ( wnd->flags & DOING_CLOSE ) && ( GUICurrWnd == NULL ) && !GUIIsParentADialog( wnd ) ) { // if the root window has received a WM_DESTROY then just run away root = GUIGetRootWindow(); if( root && !( root->flags & DOING_DESTROY ) ) { GUIBringNewToFront( wnd ); } } if( wnd->hdc != (WPI_PRES)NULL ) { _wpi_releasepres( wnd->hwnd, wnd->hdc ); wnd->hdc = NULLHANDLE; } #ifdef __OS2_PM__ GUIFreeWndPaintHandles( wnd, true ); if( wnd->root_pinfo.normal_pres != (WPI_PRES)NULL ) { _wpi_deleteos2normpres( wnd->root_pinfo.normal_pres ); wnd->root_pinfo.normal_pres = (WPI_PRES)NULL; } if( wnd->hwnd_pinfo.normal_pres != (WPI_PRES)NULL ) { _wpi_deleteos2normpres( wnd->hwnd_pinfo.normal_pres ); wnd->hwnd_pinfo.normal_pres = (WPI_PRES)NULL; } #endif GUIMemFree( wnd ); }
/* * StatusWndCallback - handle messages for the status window */ WPI_MRESULT CALLBACK StatusWndCallback( HWND hwnd, WPI_MSG msg, WPI_PARAM1 wparam, WPI_PARAM2 lparam ) { PAINTSTRUCT ps; WPI_RECT r; int i; WPI_PRES pres; statwnd *sw; sw = (statwnd *)_wpi_getwindowlongptr( hwnd, classWinExtra ); if( statusWndHookFunc != NULL ) { if( statusWndHookFunc( hwnd, msg, wparam, lparam ) ) { return( 0 ); } } if( (msg == WM_SIZE || msg == WM_PAINT) && sw == NULL ) { return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); } switch( msg ) { case WM_CREATE: _wpi_setwindowlongptr( hwnd, classWinExtra, (LONG_PTR)currentStatWnd ); return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); case WM_SIZE: GetClientRect( hwnd, &sw->statusRect ); sw->wndHeight = _wpi_getheightrect( sw->statusRect ); _wpi_inflaterect( classHandle, &sw->statusRect, -HORZ_BORDER, -VERT_BORDER ); return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); case WM_PAINT: pres = _wpi_beginpaint( hwnd, NULLHANDLE, &ps ); #ifdef __OS2_PM__ WinFillRect( pres, &ps, CLR_PALEGRAY ); #endif #ifdef __NT__ /* * We have to do this little trick because currently this window does not receive * the WM_SYSCOLORCHANGE message when it should. */ if( colorButtonFace != GetSysColor( COLOR_BTNFACE ) ) { RECT rs; if( hasGDIObjects ) { _wpi_deleteobject( penLight ); _wpi_deleteobject( penShade ); _wpi_deleteobject( brushButtonFace ); } colorButtonFace = GetSysColor( COLOR_BTNFACE ); _wpi_setbackcolour( pres, colorButtonFace ); brushButtonFace = CreateSolidBrush( colorButtonFace ); penLight = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNHIGHLIGHT ) ); penShade = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNSHADOW ) ); hasGDIObjects = true; GetClientRect( hwnd, &rs ); FillRect( pres, &rs, brushButtonFace ); } #endif StatusWndDraw3DBox( sw, pres ); if( initPRES( sw, pres ) ) { for( i = 0; i <= sw->numSections; i++ ) { if( sw->sectionData[i] != NULL ) { getRect( sw, &r, i ); makeInsideRect( &r ); _wpi_drawtext( pres, sw->sectionData[i], -1, &r, sw->sectionDataFlags[i] ); } } finiPRES( pres ); } _wpi_endpaint( hwnd, pres, &ps ); break; #ifdef __NT__ case WM_SYSCOLORCHANGE: if( hasGDIObjects ) { DeleteObject( penLight ); DeleteObject( penShade ); DeleteObject( brushButtonFace ); hasGDIObjects = false; } colorButtonFace = GetSysColor( COLOR_BTNFACE ); colorTextFace = GetSysColor( COLOR_BTNTEXT ); brushButtonFace = CreateSolidBrush( colorButtonFace ); penLight = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNHIGHLIGHT ) ); penShade = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNSHADOW ) ); hasGDIObjects = true; break; #endif case WM_ERASEBKGND: #ifdef __NT__ if( colorButtonFace != GetSysColor( COLOR_BTNFACE ) ) { /* * If WM_SYSCOLORCHANGE message is not received by this window, we * have to fake it. */ SendMessage( hwnd, WM_SYSCOLORCHANGE, 0, 0L ); } #endif GetClientRect( hwnd, &r ); _wpi_unrealizeobject( brushButtonFace ); _wpi_fillrect( (WPI_PRES)wparam, &r, colorButtonFace, brushButtonFace ); break; default: return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); } return( 0 ); } /* StatusWndCallback */