Avoid g++ warnings about breaking strict aliasing rules in wxTreeCtrl.
The standard TreeView_GetItemRect() macro resulted in warnings about breaking strict aliasing rules as it passed a variable of one type via a pointer to another one. Fix this by using a union and our own custom macro instead. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68126 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -131,6 +131,32 @@ private:
|
|||||||
// private functions
|
// private functions
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
// Work around a problem with TreeView_GetItemRect() when using MinGW/Cygwin:
|
||||||
|
// it results in warnings about breaking strict aliasing rules because HITEM is
|
||||||
|
// passed via a RECT pointer, so use a union to avoid them and define our own
|
||||||
|
// version of the standard macro using it.
|
||||||
|
union TVGetItemRectParam
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
HTREEITEM hItem;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
wxTreeView_GetItemRect(HWND hwnd,
|
||||||
|
HTREEITEM hItem,
|
||||||
|
TVGetItemRectParam& param,
|
||||||
|
BOOL fItemRect)
|
||||||
|
{
|
||||||
|
param.hItem = hItem;
|
||||||
|
return ::SendMessage(hwnd, TVM_GETITEMRECT, fItemRect,
|
||||||
|
(LPARAM)¶m) == TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
// wrappers for TreeView_GetItem/TreeView_SetItem
|
// wrappers for TreeView_GetItem/TreeView_SetItem
|
||||||
static bool IsItemSelected(HWND hwndTV, HTREEITEM hItem)
|
static bool IsItemSelected(HWND hwndTV, HTREEITEM hItem)
|
||||||
{
|
{
|
||||||
@@ -1198,14 +1224,10 @@ bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Bug in Gnu-Win32 headers, so don't use the macro TreeView_GetItemRect
|
// Bug in Gnu-Win32 headers, so don't use the macro TreeView_GetItemRect
|
||||||
RECT rect;
|
TVGetItemRectParam param;
|
||||||
|
|
||||||
// this ugliness comes directly from MSDN - it *is* the correct way to pass
|
|
||||||
// the HTREEITEM with TVM_GETITEMRECT
|
|
||||||
*(HTREEITEM *)&rect = HITEM(item);
|
|
||||||
|
|
||||||
// true means to get rect for just the text, not the whole line
|
// true means to get rect for just the text, not the whole line
|
||||||
if ( !::SendMessage(GetHwnd(), TVM_GETITEMRECT, true, (LPARAM)&rect) )
|
if ( !wxTreeView_GetItemRect(GetHwnd(), HITEM(item), param, TRUE) )
|
||||||
{
|
{
|
||||||
// if TVM_GETITEMRECT returned false, then the item is definitely not
|
// if TVM_GETITEMRECT returned false, then the item is definitely not
|
||||||
// visible (because its parent is not expanded)
|
// visible (because its parent is not expanded)
|
||||||
@@ -1215,7 +1237,7 @@ bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const
|
|||||||
// however if it returned true, the item might still be outside the
|
// however if it returned true, the item might still be outside the
|
||||||
// currently visible part of the tree, test for it (notice that partly
|
// currently visible part of the tree, test for it (notice that partly
|
||||||
// visible means visible here)
|
// visible means visible here)
|
||||||
return rect.bottom > 0 && rect.top < GetClientSize().y;
|
return param.rect.bottom > 0 && param.rect.top < GetClientSize().y;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const
|
bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const
|
||||||
@@ -1488,9 +1510,10 @@ wxTreeItemId wxTreeCtrl::DoInsertAfter(const wxTreeItemId& parent,
|
|||||||
// need this to make the "[+]" appear
|
// need this to make the "[+]" appear
|
||||||
if ( firstChild )
|
if ( firstChild )
|
||||||
{
|
{
|
||||||
RECT rect;
|
TVGetItemRectParam param;
|
||||||
TreeView_GetItemRect(GetHwnd(), HITEM(parent), &rect, FALSE);
|
|
||||||
::InvalidateRect(GetHwnd(), &rect, FALSE);
|
wxTreeView_GetItemRect(GetHwnd(), HITEM(parent), param, FALSE);
|
||||||
|
::InvalidateRect(GetHwnd(), ¶m.rect, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// associate the application tree item with Win32 tree item handle
|
// associate the application tree item with Win32 tree item handle
|
||||||
@@ -2030,18 +2053,18 @@ bool wxTreeCtrl::GetBoundingRect(const wxTreeItemId& item,
|
|||||||
wxRect& rect,
|
wxRect& rect,
|
||||||
bool textOnly) const
|
bool textOnly) const
|
||||||
{
|
{
|
||||||
RECT rc;
|
|
||||||
|
|
||||||
// Virtual root items have no bounding rectangle
|
// Virtual root items have no bounding rectangle
|
||||||
if ( IS_VIRTUAL_ROOT(item) )
|
if ( IS_VIRTUAL_ROOT(item) )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( TreeView_GetItemRect(GetHwnd(), HITEM(item),
|
TVGetItemRectParam param;
|
||||||
&rc, textOnly) )
|
|
||||||
|
if ( wxTreeView_GetItemRect(GetHwnd(), HITEM(item), param, textOnly) )
|
||||||
{
|
{
|
||||||
rect = wxRect(wxPoint(rc.left, rc.top), wxPoint(rc.right, rc.bottom));
|
rect = wxRect(wxPoint(param.rect.left, param.rect.top),
|
||||||
|
wxPoint(param.rect.right, param.rect.bottom));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -3093,16 +3116,16 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
|
|||||||
// do it for the other items itself - help it
|
// do it for the other items itself - help it
|
||||||
wxArrayTreeItemIds selections;
|
wxArrayTreeItemIds selections;
|
||||||
size_t count = GetSelections(selections);
|
size_t count = GetSelections(selections);
|
||||||
RECT rect;
|
TVGetItemRectParam param;
|
||||||
|
|
||||||
for ( size_t n = 0; n < count; n++ )
|
for ( size_t n = 0; n < count; n++ )
|
||||||
{
|
{
|
||||||
// TreeView_GetItemRect() will return false if item is not
|
// TreeView_GetItemRect() will return false if item is not
|
||||||
// visible, which may happen perfectly well
|
// visible, which may happen perfectly well
|
||||||
if ( TreeView_GetItemRect(GetHwnd(), HITEM(selections[n]),
|
if ( wxTreeView_GetItemRect(GetHwnd(), HITEM(selections[n]),
|
||||||
&rect, TRUE) )
|
param, TRUE) )
|
||||||
{
|
{
|
||||||
::InvalidateRect(GetHwnd(), &rect, FALSE);
|
::InvalidateRect(GetHwnd(), ¶m.rect, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user