]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/utilsx.cpp
Merge in from trunk r64802 - r68625
[wxWidgets.git] / src / x11 / utilsx.cpp
index 1e9acde5673694e628ba961d26d37c8ce177bb5b..3285b0a2a4f8145ccd0ef9a7ac8c89fb7525b5c5 100644 (file)
@@ -9,8 +9,97 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __VMS
+#define XShapeQueryExtension XSHAPEQUERYEXTENSION
+#endif
+
 #include "wx/x11/privx.h"
 
 #include "wx/x11/privx.h"
 
+#ifdef HAVE_XSHAPE
+
+    #ifndef WX_PRECOMP
+        #include "wx/bitmap.h"
+        #include "wx/region.h"
+    #endif
+
+    #ifdef __VMS
+        #include "wx/vms_x_fix.h"
+        #include <X11/shape.h>
+    #else
+        #include <X11/extensions/shape.h>
+    #endif
+
+    #include "wx/dcmemory.h"
+#endif
+
+#ifdef HAVE_X11_XKBLIB_H
+    /* under HP-UX and Solaris 2.6, at least, XKBlib.h defines structures with
+     * field named "explicit" - which is, of course, an error for a C++
+     * compiler. To be on the safe side, just redefine it everywhere. */
+    #define explicit __wx_explicit
+
+    #include "X11/XKBlib.h"
+
+    #undef explicit
+#endif // HAVE_X11_XKBLIB_H
+
+
+// ----------------------------------------------------------------------------
+// XShape code
+// ----------------------------------------------------------------------------
+
+#ifdef HAVE_XSHAPE
+
+bool wxDoSetShape( Display* xdisplay,
+                   Window xwindow,
+                   const wxRegion& region )
+{
+    int dummy1, dummy2;
+
+    if( !XShapeQueryExtension( xdisplay, &dummy1, &dummy2 ) )
+        return false;
+
+    if( region.IsEmpty() )
+    {
+        XShapeCombineMask( xdisplay, xwindow, ShapeBounding, 0, 0,
+                           None, ShapeSet );
+    }
+    else
+    {
+        // wxRegion::ConvertToBitmap gives us the wrong Pixmap:
+        // polychrome and with black and white reversed
+        wxRect box = region.GetBox();
+        wxBitmap bmp(box.GetRight(), box.GetBottom(), 1);
+        wxMemoryDC dc;
+        dc.SelectObject(bmp);
+        dc.SetBackground(*wxBLACK_BRUSH);
+        dc.Clear();
+        dc.SetDeviceClippingRegion(region);
+        dc.SetBackground(*wxWHITE_BRUSH);
+        dc.Clear();
+        dc.SelectObject(wxNullBitmap);
+
+        XShapeCombineMask( xdisplay, xwindow, ShapeBounding, 0, 0,
+                           (Pixmap)bmp.GetDrawable(), ShapeSet );
+    }
+
+    return true;
+}
+
+#else
+
+bool wxDoSetShape( Display* WXUNUSED(xdisplay),
+                   Window WXUNUSED(xwindow),
+                   const wxRegion& WXUNUSED(region) )
+{
+    return false;
+}
+
+#endif
+
 // ----------------------------------------------------------------------------
 // wxXVisualInfo
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxXVisualInfo
 // ----------------------------------------------------------------------------
@@ -110,7 +199,7 @@ void wxXVisualInfo::Init( Display* dpy, XVisualInfo* vi )
     XColor* colors = (XColor*) m_visualColormap;
 
     for (int i = 0; i < m_visualColormapSize; i++)
     XColor* colors = (XColor*) m_visualColormap;
 
     for (int i = 0; i < m_visualColormapSize; i++)
-           colors[i].pixel = i;
+        colors[i].pixel = i;
 
     XQueryColors( dpy, DefaultColormap(dpy, vi->screen),
                   colors, m_visualColormapSize );
 
     XQueryColors( dpy, DefaultColormap(dpy, vi->screen),
                   colors, m_visualColormapSize );
@@ -152,10 +241,25 @@ void wxXVisualInfo::Init( Display* dpy, XVisualInfo* vi )
                     index |= (g >> (5 - m_visualGreenPrec)) << m_visualGreenShift;
                     index |= (b >> (5 - m_visualBluePrec)) << m_visualBlueShift;
                 }
                     index |= (g >> (5 - m_visualGreenPrec)) << m_visualGreenShift;
                     index |= (b >> (5 - m_visualBluePrec)) << m_visualBlueShift;
                 }
-                m_colorCube[ (r*1024) + (g*32) + b ] = index;
+                m_colorCube[ (r*1024) + (g*32) + b ] = (unsigned char)index;
             }
         }
     }
 }
 
 #endif // !wxUSE_NANOX
             }
         }
     }
 }
 
 #endif // !wxUSE_NANOX
+
+/* Don't synthesize KeyUp events holding down a key and producing
+   KeyDown events with autorepeat. */
+bool wxSetDetectableAutoRepeat( bool flag )
+{
+#ifdef HAVE_X11_XKBLIB_H
+    Bool result;
+    XkbSetDetectableAutoRepeat( (Display *)wxGetDisplay(), flag, &result );
+    return result;       /* true if keyboard hardware supports this mode */
+#else
+    wxUnusedVar(flag);
+    return false;
+#endif
+}
+