X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/850c6ed46e3da19d897c2eac500d8917e6b29ced..2659dad3209167f248dcae39a7ee25d2f8c91ff9:/src/gtk1/toplevel.cpp

diff --git a/src/gtk1/toplevel.cpp b/src/gtk1/toplevel.cpp
index b5a88382bf..9660e9d30e 100644
--- a/src/gtk1/toplevel.cpp
+++ b/src/gtk1/toplevel.cpp
@@ -15,10 +15,13 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "toplevel.h"
 #endif
 
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
 #ifdef __VMS
 #define XIconifyWindow XICONIFYWINDOW
 #endif
@@ -513,10 +516,10 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style )
     m_fsIsShowing = show;
 
     GdkWindow *window = m_widget->window;
-    wxX11FullScreenMethod method = 
+    wxX11FullScreenMethod method =
         wxGetFullScreenMethodX11((WXDisplay*)GDK_DISPLAY(),
                                  (WXWindow)GDK_ROOT_WINDOW());
-    
+
     if (show)
     {
         m_fsSaveFlag = style;
@@ -538,7 +541,7 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style )
             gdk_window_set_decorations(window, (GdkWMDecoration)0);
             gdk_window_set_functions(window, (GdkWMFunction)0);
         }
-        
+
 		gdk_window_get_origin (m_widget->window, &root_x, &root_y);
 		gdk_window_get_geometry (m_widget->window, &client_x, &client_y,
 					 &width, &height, NULL);
@@ -561,12 +564,12 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style )
             gdk_window_set_decorations(window, (GdkWMDecoration)m_gdkDecor);
             gdk_window_set_functions(window, (GdkWMFunction)m_gdkFunc);
         }
-        
+
         wxSetFullScreenStateX11((WXDisplay*)GDK_DISPLAY(),
                                 (WXWindow)GDK_ROOT_WINDOW(),
                                 (WXWindow)GDK_WINDOW_XWINDOW(window),
                                 show, &m_fsSaveFrame, method);
-       
+
         SetSize(m_fsSaveFrame.x, m_fsSaveFrame.y,
                 m_fsSaveFrame.width, m_fsSaveFrame.height);
     }
@@ -973,4 +976,46 @@ 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
+        {
+#ifdef __WXGTK20__
+        gdk_window_shape_combine_region(window, region.GetRegion(), 0, 0);
+#else
+        wxBitmap bmp = region.ConvertToBitmap();
+        bmp.SetMask(new wxMask(bmp, *wxBLACK));
+        GdkBitmap* mask = bmp.GetMask()->GetBitmap();
+        gdk_window_shape_combine_mask(window, mask, 0, 0);
+#endif
+        return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+
+bool wxTopLevelWindowGTK::SetShape(const wxRegion& region)
+{
+    wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), FALSE,
+                 _T("Shaped windows must be created with the wxFRAME_SHAPED style."));
+
+    GdkWindow *window = NULL;
+    if (m_wxwindow)
+    {
+        window = GTK_PIZZA(m_wxwindow)->bin_window;
+        do_shape_combine_region(window, region);
+    }
+    window = m_widget->window;
+    return do_shape_combine_region(window, region);
+}
+
 // vi:sts=4:sw=4:et