[x11] Destroy the Window we own when setting a foreign one

When we replace the stage Window using a foreign one we also need to
destroy the Window we created, if needed, to avoid leaking resources
all around.

Fixes bug:

  http://bugzilla.openedhand.com/show_bug.cgi?id=1750
This commit is contained in:
Emmanuele Bassi 2009-08-04 16:59:15 +01:00
parent 7963254c23
commit b190448ed4

View File

@ -781,6 +781,7 @@ typedef struct {
ClutterStageX11 *stage_x11; ClutterStageX11 *stage_x11;
ClutterGeometry geom; ClutterGeometry geom;
Window xwindow; Window xwindow;
guint destroy_old_xwindow : 1;
} ForeignWindowData; } ForeignWindowData;
static void static void
@ -791,6 +792,9 @@ set_foreign_window_callback (ClutterActor *actor,
CLUTTER_NOTE (BACKEND, "Setting foreign window (0x%x)", (int) fwd->xwindow); CLUTTER_NOTE (BACKEND, "Setting foreign window (0x%x)", (int) fwd->xwindow);
if (fwd->destroy_old_xwindow)
XDestroyWindow (fwd->stage_x11->xdpy, fwd->stage_x11->xwin);
fwd->stage_x11->xwin = fwd->xwindow; fwd->stage_x11->xwin = fwd->xwindow;
fwd->stage_x11->is_foreign_xwin = TRUE; fwd->stage_x11->is_foreign_xwin = TRUE;
@ -858,6 +862,8 @@ clutter_x11_set_stage_foreign (ClutterStage *stage,
fwd.stage_x11 = stage_x11; fwd.stage_x11 = stage_x11;
fwd.xwindow = xwindow; fwd.xwindow = xwindow;
/* destroy the old Window, if we own it */
fwd.destroy_old_xwindow = stage_x11->is_foreign_xwin ? FALSE : TRUE;
fwd.geom.x = x; fwd.geom.x = x;
fwd.geom.y = y; fwd.geom.y = y;
fwd.geom.width = width; fwd.geom.width = width;