From 01fd673505efeca530946018c921caf14b492f31 Mon Sep 17 00:00:00 2001 From: "Kirk A. Baker" Date: Mon, 25 Jul 2011 15:00:30 -0700 Subject: [PATCH] osx: Avoid leaks in Stage::realize clutter_stage_osx_realize() can now be called multiple times without leaking views and windows. https://bugzilla.gnome.org/show_bug.cgi?id=655307 --- clutter/osx/clutter-stage-osx.c | 56 +++++++++++++++++++-------------- clutter/osx/clutter-stage-osx.h | 1 + 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/clutter/osx/clutter-stage-osx.c b/clutter/osx/clutter-stage-osx.c index fb6a09478..e8db93773 100644 --- a/clutter/osx/clutter-stage-osx.c +++ b/clutter/osx/clutter-stage-osx.c @@ -306,7 +306,6 @@ static gboolean clutter_stage_osx_realize (ClutterStageWindow *stage_window) { ClutterStageOSX *self = CLUTTER_STAGE_OSX (stage_window); - ClutterBackendOSX *backend_osx; gfloat width, height; NSRect rect; @@ -314,33 +313,39 @@ clutter_stage_osx_realize (ClutterStageWindow *stage_window) CLUTTER_NOTE (BACKEND, "[%p] realize", self); - backend_osx = CLUTTER_BACKEND_OSX (self->backend); + if (!self->haveRealized) + { + ClutterBackendOSX *backend_osx; - /* Call get_size - this will either get the geometry size (which - * before we create the window is set to 640x480), or if a size - * is set, it will get that. This lets you set a size on the - * stage before it's realized. - */ - clutter_actor_get_size (CLUTTER_ACTOR (self->wrapper), &width, &height); - self->requisition_width = width; - self->requisition_height = height; + backend_osx = CLUTTER_BACKEND_OSX (self->backend); - rect = NSMakeRect(0, 0, self->requisition_width, self->requisition_height); + /* Call get_size - this will either get the geometry size (which + * before we create the window is set to 640x480), or if a size + * is set, it will get that. This lets you set a size on the + * stage before it's realized. + */ + clutter_actor_get_size (CLUTTER_ACTOR (self->wrapper), &width, &height); + self->requisition_width = width; + self->requisition_height= height; - self->view = [[ClutterGLView alloc] - initWithFrame: rect - pixelFormat: backend_osx->pixel_format - stage: self]; - [self->view setOpenGLContext: backend_osx->context]; + rect = NSMakeRect (0, 0, self->requisition_width, self->requisition_height); - self->window = [[ClutterGLWindow alloc] - initWithView: self->view - UTF8Title: clutter_stage_get_title (CLUTTER_STAGE (self->wrapper)) - stage: self]; - /* looks better than positioning to 0,0 (bottom right) */ - [self->window center]; + self->view = [[ClutterGLView alloc] + initWithFrame: rect + pixelFormat: backend_osx->pixel_format + stage: self]; + [self->view setOpenGLContext:backend_osx->context]; - CLUTTER_NOTE (BACKEND, "Stage successfully realized"); + self->window = [[ClutterGLWindow alloc] + initWithView: self->view + UTF8Title: clutter_stage_get_title (CLUTTER_STAGE (self->wrapper)) + stage: self]; + /* looks better than positioning to 0,0 (bottom right) */ + [self->window center]; + self->haveRealized = true; + + CLUTTER_NOTE (BACKEND, "Stage successfully realized"); + } CLUTTER_OSX_POOL_RELEASE(); @@ -364,6 +369,7 @@ clutter_stage_osx_unrealize (ClutterStageWindow *stage_window) self->view = NULL; self->window = NULL; + self->haveRealized = false; CLUTTER_OSX_POOL_RELEASE(); } @@ -605,6 +611,10 @@ _clutter_stage_osx_new (ClutterBackend *backend, self = g_object_new (CLUTTER_TYPE_STAGE_OSX, NULL); self->backend = backend; self->wrapper = wrapper; + self->isHiding = false; + self->haveRealized = false; + self->view = NULL; + self->window = NULL; return CLUTTER_STAGE_WINDOW(self); } diff --git a/clutter/osx/clutter-stage-osx.h b/clutter/osx/clutter-stage-osx.h index b68f4bd24..45943d137 100644 --- a/clutter/osx/clutter-stage-osx.h +++ b/clutter/osx/clutter-stage-osx.h @@ -68,6 +68,7 @@ struct _ClutterStageOSX gboolean acceptFocus; gboolean isHiding; + gboolean haveRealized; gfloat scroll_pos_x; gfloat scroll_pos_y;