Add support for composited child windows. (#412882, Ryan Lortie)

2007-06-01  Matthias Clasen  <mclasen@redhat.com>

        Add support for composited child windows.  (#412882, Ryan Lortie)

        * gdk/gdk.symbols:
        * gdk/gdkdisplay.h:
        * gdk/gdkinternals.h:
        * gdk/gdkwindow.[hc]: Add gdk_display_supports_composite() and
        gdk_window_set_composited().

        * gdk/x11/gdkevents-x11.c:
        * gdk/x11/gdkdisplay-x11.[hc]:
        * gdk/x11/gdkwindow-x11.[hc]: X11 implementation.

        * gdk/win32/gdkdisplay-win32.c:
        * gdk/win32/gdkwindow-win32.c: Dummy win32 implementration.

        * gdk/quartz/gdkdisplay-quartz.c:
        * gdk/quartz/gdkwindow-quartz.c: Dummy Quartz implementation.

        * gdk/directfb/gdkdisplay-directfb.c:
        * gdk/directfb/gdkwindow-directfb.c: Dummy DirectFB implementation.

        * tests/testgtk.c: Add a "composited window" test.


svn path=/trunk/; revision=18004
This commit is contained in:
Matthias Clasen
2007-06-01 12:16:12 +00:00
committed by Matthias Clasen
parent 62c13f0463
commit 885ba04648
21 changed files with 635 additions and 3 deletions

View File

@ -59,6 +59,18 @@
#include <X11/extensions/shape.h>
#endif
#ifdef HAVE_XCOMPOSITE
#include <X11/extensions/Xcomposite.h>
#endif
#ifdef HAVE_XFIXES
#include <X11/extensions/Xfixes.h>
#endif
#ifdef HAVE_XDAMAGE
#include <X11/extensions/Xdamage.h>
#endif
const int _gdk_event_mask_table[21] =
{
ExposureMask,
@ -185,6 +197,14 @@ gdk_window_impl_x11_finalize (GObject *object)
_gdk_xgrab_check_destroy (GDK_WINDOW (wrapper));
#if defined(HAVE_XCOMPOSITE) && defined(HAVE_XDAMAGE) && defined (HAVE_XFIXES)
if (window_impl->damage != None)
{
XDamageDestroy (GDK_WINDOW_XDISPLAY (object), window_impl->damage);
window_impl->damage = None;
}
#endif
if (!GDK_WINDOW_DESTROYED (wrapper))
{
GdkDisplay *display = GDK_WINDOW_DISPLAY (wrapper);
@ -6413,10 +6433,14 @@ gdk_window_beep (GdkWindow *window)
*
* Request the windowing system to make @window partially transparent,
* with opacity 0 being fully transparent and 1 fully opaque. (Values
* of the opacity parameter are clamped to the [0,1] range.) On X11
* this works only on X screens with a compositing manager running.
* of the opacity parameter are clamped to the [0,1] range.)
*
* On X11, this works only on X screens with a compositing manager
* running.
*
* For setting up per-pixel alpha, see gdk_screen_get_rgba_colormap().
* For making non-toplevel windows translucent, see
* gdk_window_set_composited().
*
* Since: 2.12
*/
@ -6455,5 +6479,39 @@ gdk_window_set_opacity (GdkWindow *window,
(guchar *) cardinal, 1);
}
void
_gdk_windowing_window_set_composited (GdkWindow *window,
gboolean composited)
{
#if defined(HAVE_XCOMPOSITE) && defined(HAVE_XDAMAGE) && defined (HAVE_XFIXES)
GdkWindowObject *private = (GdkWindowObject *) window;
GdkDisplayX11 *x11_display;
GdkWindowImplX11 *impl;
GdkDisplay *display;
Display *dpy;
Window xid;
impl = GDK_WINDOW_IMPL_X11 (private->impl);
display = gdk_screen_get_display (GDK_DRAWABLE_IMPL_X11 (impl)->screen);
x11_display = GDK_DISPLAY_X11 (display);
dpy = GDK_DISPLAY_XDISPLAY (display);
xid = GDK_WINDOW_XWINDOW (private);
if (composited)
{
XCompositeRedirectWindow (dpy, xid, CompositeRedirectManual);
impl->damage = XDamageCreate (dpy, xid, XDamageReportBoundingBox);
}
else
{
XCompositeUnredirectWindow (dpy, xid, CompositeRedirectManual);
XDamageDestroy (dpy, impl->damage);
impl->damage = None;
}
#endif
}
#define __GDK_WINDOW_X11_C__
#include "gdkaliasdef.c"