[clutter] osx: Avoid leaks in Stage::realize



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]