[clutter] osx: Avoid leaks in Stage::realize
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter] osx: Avoid leaks in Stage::realize
- Date: Fri, 29 Jul 2011 12:58:40 +0000 (UTC)
commit 01fd673505efeca530946018c921caf14b492f31
Author: Kirk A. Baker <kbaker camerabits com>
Date: Mon Jul 25 15:00:30 2011 -0700
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 | 62 ++++++++++++++++++++++----------------
clutter/osx/clutter-stage-osx.h | 1 +
2 files changed, 37 insertions(+), 26 deletions(-)
---
diff --git a/clutter/osx/clutter-stage-osx.c b/clutter/osx/clutter-stage-osx.c
index fb6a094..e8db937 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);
-
- /* 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;
-
- rect = NSMakeRect(0, 0, self->requisition_width, self->requisition_height);
-
- self->view = [[ClutterGLView alloc]
- initWithFrame: rect
- pixelFormat: backend_osx->pixel_format
- stage: self];
- [self->view setOpenGLContext: backend_osx->context];
+ if (!self->haveRealized)
+ {
+ ClutterBackendOSX *backend_osx;
- 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];
+ backend_osx = CLUTTER_BACKEND_OSX (self->backend);
- CLUTTER_NOTE (BACKEND, "Stage successfully realized");
+ /* 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;
+
+ rect = NSMakeRect (0, 0, self->requisition_width, self->requisition_height);
+
+ self->view = [[ClutterGLView alloc]
+ initWithFrame: rect
+ pixelFormat: backend_osx->pixel_format
+ stage: self];
+ [self->view setOpenGLContext:backend_osx->context];
+
+ 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 b68f4bd..45943d1 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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]