Implement SetShape() for wxPopupWindow in wxGTK.

Move SetShape() implementation from wxTopLevelWindow to wxNonOwnedWindow so
that wxPopupWindow, which also inherits from the latter, could use it as well.

This makes it possible to have popup windows with irregular shapes in wxGTK as
well as in wxMSW and wxOSX.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69408 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-10-13 12:45:56 +00:00
parent b39badac11
commit a82afab363
7 changed files with 152 additions and 52 deletions

View File

@@ -328,9 +328,6 @@ void wxTopLevelWindowGTK::GTKHandleRealized()
const wxIconBundle& icons = GetIcons();
if (icons.GetIconCount())
SetIcons(icons);
if (HasFlag(wxFRAME_SHAPED))
SetShape(m_shape); // it will really set the window shape now
}
//-----------------------------------------------------------------------------
@@ -1321,48 +1318,6 @@ void wxTopLevelWindowGTK::RemoveGrab()
}
// helper
static bool do_shape_combine_region(GdkWindow* window, const wxRegion& region)
{
if (window)
{
if (region.IsEmpty())
{
gdk_window_shape_combine_mask(window, NULL, 0, 0);
}
else
{
gdk_window_shape_combine_region(window, region.GetRegion(), 0, 0);
return true;
}
}
return false;
}
bool wxTopLevelWindowGTK::SetShape(const wxRegion& region)
{
wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false,
wxT("Shaped windows must be created with the wxFRAME_SHAPED style."));
if ( gtk_widget_get_realized(m_widget) )
{
if ( m_wxwindow )
do_shape_combine_region(gtk_widget_get_window(m_wxwindow), region);
return do_shape_combine_region(gtk_widget_get_window(m_widget), region);
}
else // not realized yet
{
// store the shape to set, it will be really set once we're realized
m_shape = region;
// we don't know if we're going to succeed or fail, be optimistic by
// default
return true;
}
}
bool wxTopLevelWindowGTK::IsActive()
{
return (this == (wxTopLevelWindowGTK*)g_activeFrame);