src/gui/image/qpixmap_s60.cpp
changeset 37 758a864f9613
parent 33 3e2da88830cd
--- a/src/gui/image/qpixmap_s60.cpp	Fri Sep 17 08:34:18 2010 +0300
+++ b/src/gui/image/qpixmap_s60.cpp	Mon Oct 04 01:19:32 2010 +0300
@@ -63,6 +63,42 @@
 const uchar qt_pixmap_bit_mask[] = { 0x01, 0x02, 0x04, 0x08,
                                      0x10, 0x20, 0x40, 0x80 };
 
+static bool cleanup_function_registered = false;
+static QS60PixmapData *firstPixmap = 0;
+
+void qt_symbian_register_pixmap(QS60PixmapData *pd)
+{
+    if(!cleanup_function_registered) {
+        qAddPostRoutine(qt_symbian_release_pixmaps);
+        cleanup_function_registered = true;
+    }
+
+    pd->next = firstPixmap;
+    pd->prev = 0;
+    if (firstPixmap)
+        firstPixmap->prev = pd;
+    firstPixmap = pd;
+}
+
+void qt_symbian_unregister_pixmap(QS60PixmapData *pd)
+{
+    if (pd->next)
+        pd->next->prev = pd->prev;
+    if (pd->prev)
+        pd->prev->next = pd->next;
+    else
+        firstPixmap = pd->next;
+}
+
+void qt_symbian_release_pixmaps()
+{
+    // Scan all QS60PixmapData objects in the system and destroy them.
+    QS60PixmapData *pd = firstPixmap;
+    while (pd != 0) {
+        pd->release();
+        pd = pd->next;
+    }
+}
 
 /*
     \class QSymbianFbsClient
@@ -356,15 +392,18 @@
     cfbsBitmap(0),
     pengine(0),
     bytes(0),
-    formatLocked(false)
+    formatLocked(false),
+    next(0),
+    prev(0)
 {
-
+    qt_symbian_register_pixmap(this);
 }
 
 QS60PixmapData::~QS60PixmapData()
 {
     release();
     delete symbianBitmapDataAccess;
+    qt_symbian_unregister_pixmap(this);
 }
 
 void QS60PixmapData::resize(int width, int height)