diff options
author | Arun Thondapu | 2011-12-05 18:15:51 -0500 |
---|---|---|
committer | Bogdan Gheorghe | 2011-12-05 18:15:51 -0500 |
commit | 5c25a7e7d210c3ae9b3cfda453055f4312507ebd (patch) | |
tree | 604ecd3025b149f00d6d1163a904d45a592fc715 | |
parent | d4dc76f502521d658d8db0cfa2a42de71bc22567 (diff) | |
download | eclipse.platform.swt-5c25a7e7d210c3ae9b3cfda453055f4312507ebd.zip eclipse.platform.swt-5c25a7e7d210c3ae9b3cfda453055f4312507ebd.tar.gz eclipse.platform.swt-5c25a7e7d210c3ae9b3cfda453055f4312507ebd.tar.xz |
364593 - Memory leak in Table when changing cell background colors
4 files changed, 69 insertions, 5 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java index 7b38bd8..26bf464 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java @@ -229,6 +229,7 @@ int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*lo if (isPixbuf) { OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_PIXBUF, ptr, -1); OS.g_object_set (cell, OS.pixbuf, ptr [0], 0); + OS.g_object_unref (ptr [0]); } else { OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_TEXT, ptr, -1); if (ptr [0] != 0) { @@ -248,6 +249,7 @@ int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*lo OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_BACKGROUND, ptr, -1); if (ptr [0] != 0) { OS.g_object_set (cell, OS.cell_background_gdk, ptr [0], 0); + OS.gdk_color_free (ptr [0]); } } } @@ -256,11 +258,13 @@ int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*lo OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FOREGROUND, ptr, -1); if (ptr [0] != 0) { OS.g_object_set (cell, OS.foreground_gdk, ptr [0], 0); + OS.gdk_color_free (ptr [0]); } ptr [0] = 0; OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FONT, ptr, -1); if (ptr [0] != 0) { OS.g_object_set (cell, OS.font_desc, ptr [0], 0); + OS.pango_font_description_free (ptr [0]); } } } @@ -544,7 +548,17 @@ void createColumn (TableColumn column, int index) { for (int j=0; j<modelLength; j++) { OS.gtk_tree_model_get (oldModel, oldItem, j, ptr, -1); OS.gtk_list_store_set (newModel, newItem, j, ptr [0], -1); - if (types [j] == OS.G_TYPE_STRING ()) OS.g_free ((ptr [0])); + if (types [j] == OS.G_TYPE_STRING ()) { + OS.g_free ((ptr [0])); + } else if (ptr [0] != 0) { + if (types [j] == OS.GDK_TYPE_COLOR()) { + OS.gdk_color_free (ptr [0]); + } else if (types [j] == OS.GDK_TYPE_PIXBUF()) { + OS.g_object_unref (ptr [0]); + } else if (types [j] == OS.PANGO_TYPE_FONT_DESCRIPTION()) { + OS.pango_font_description_free (ptr [0]); + } + } } OS.gtk_list_store_remove (oldModel, oldItem); OS.g_free (oldItem); @@ -997,18 +1011,29 @@ void destroyItem (TableColumn column) { for (int j=0; j<FIRST_COLUMN; j++) { OS.gtk_tree_model_get (oldModel, oldItem, j, ptr, -1); OS.gtk_list_store_set (newModel, newItem, j, ptr [0], -1); + if (ptr [0] != 0) { + if (j == FOREGROUND_COLUMN || j == BACKGROUND_COLUMN) { + OS.gdk_color_free (ptr [0]); + } else if (j == FONT_COLUMN) { + OS.pango_font_description_free (ptr [0]); + } + } } OS.gtk_tree_model_get (oldModel, oldItem, column.modelIndex + CELL_PIXBUF, ptr, -1); OS.gtk_list_store_set (newModel, newItem, FIRST_COLUMN + CELL_PIXBUF, ptr [0], -1); + if (ptr [0] != 0) OS.g_object_unref (ptr [0]); OS.gtk_tree_model_get (oldModel, oldItem, column.modelIndex + CELL_TEXT, ptr, -1); OS.gtk_list_store_set (newModel, newItem, FIRST_COLUMN + CELL_TEXT, ptr [0], -1); OS.g_free (ptr [0]); OS.gtk_tree_model_get (oldModel, oldItem, column.modelIndex + CELL_FOREGROUND, ptr, -1); OS.gtk_list_store_set (newModel, newItem, FIRST_COLUMN + CELL_FOREGROUND, ptr [0], -1); + if (ptr [0] != 0) OS.gdk_color_free (ptr [0]); OS.gtk_tree_model_get (oldModel, oldItem, column.modelIndex + CELL_BACKGROUND, ptr, -1); OS.gtk_list_store_set (newModel, newItem, FIRST_COLUMN + CELL_BACKGROUND, ptr [0], -1); + if (ptr [0] != 0) OS.gdk_color_free (ptr [0]); OS.gtk_tree_model_get (oldModel, oldItem, column.modelIndex + CELL_FONT, ptr, -1); OS.gtk_list_store_set (newModel, newItem, FIRST_COLUMN + CELL_FONT, ptr [0], -1); + if (ptr [0] != 0) OS.pango_font_description_free (ptr [0]); OS.gtk_list_store_remove (oldModel, oldItem); OS.g_free (oldItem); item.handle = newItem; @@ -2649,7 +2674,10 @@ int /*long*/ rendererRenderProc (int /*long*/ cell, int /*long*/ window, int /*l int modelIndex = columnCount == 0 ? Table.FIRST_COLUMN : columns [columnIndex].modelIndex; OS.gtk_tree_model_get (modelHandle, item.handle, modelIndex + Table.CELL_BACKGROUND, ptr, -1); } - if (ptr [0] != 0) drawState |= SWT.BACKGROUND; + if (ptr [0] != 0) { + drawState |= SWT.BACKGROUND; + OS.gdk_color_free (ptr [0]); + } if ((flags & OS.GTK_CELL_RENDERER_SELECTED) != 0) drawState |= SWT.SELECTED; if ((flags & OS.GTK_CELL_RENDERER_FOCUSED) != 0) drawState |= SWT.FOCUSED; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java index 3307d50..7119af4 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java @@ -132,6 +132,7 @@ Color _getBackground () { if (ptr [0] == 0) return parent.getBackground (); GdkColor gdkColor = new GdkColor (); OS.memmove (gdkColor, ptr [0], GdkColor.sizeof); + OS.gdk_color_free (ptr [0]); return Color.gtk_new (display, gdkColor); } @@ -144,6 +145,7 @@ Color _getBackground (int index) { if (ptr [0] == 0) return _getBackground (); GdkColor gdkColor = new GdkColor (); OS.memmove (gdkColor, ptr [0], GdkColor.sizeof); + OS.gdk_color_free (ptr [0]); return Color.gtk_new (display, gdkColor); } @@ -159,6 +161,7 @@ Color _getForeground () { if (ptr [0] == 0) return parent.getForeground (); GdkColor gdkColor = new GdkColor (); OS.memmove (gdkColor, ptr [0], GdkColor.sizeof); + OS.gdk_color_free (ptr [0]); return Color.gtk_new (display, gdkColor); } @@ -171,6 +174,7 @@ Color _getForeground (int index) { if (ptr [0] == 0) return _getForeground (); GdkColor gdkColor = new GdkColor (); OS.memmove (gdkColor, ptr [0], GdkColor.sizeof); + OS.gdk_color_free (ptr [0]); return Color.gtk_new (display, gdkColor); } @@ -183,6 +187,7 @@ Image _getImage (int index) { if (ptr [0] == 0) return null; ImageList imageList = parent.imageList; int imageIndex = imageList.indexOf (ptr [0]); + OS.g_object_unref (ptr [0]); if (imageIndex == -1) return null; return imageList.get (imageIndex); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java index 7715436..7960433 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java @@ -274,6 +274,7 @@ int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*lo ptr [0] = 0; OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_PIXBUF, ptr, -1); OS.g_object_set (cell, OS.pixbuf, ptr[0], 0); + OS.g_object_unref (ptr [0]); } else { ptr [0] = 0; OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_TEXT, ptr, -1); @@ -294,6 +295,7 @@ int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*lo OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_BACKGROUND, ptr, -1); if (ptr [0] != 0) { OS.g_object_set (cell, OS.cell_background_gdk, ptr[0], 0); + OS.gdk_color_free (ptr [0]); } } } @@ -302,11 +304,13 @@ int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*lo OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FOREGROUND, ptr, -1); if (ptr [0] != 0) { OS.g_object_set (cell, OS.foreground_gdk, ptr[0], 0); + OS.gdk_color_free (ptr [0]); } ptr [0] = 0; OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FONT, ptr, -1); if (ptr [0] != 0) { OS.g_object_set (cell, OS.font_desc, ptr[0], 0); + OS.pango_font_description_free (ptr [0]); } } } @@ -589,12 +593,32 @@ void copyModel (int /*long*/ oldModel, int oldStart, int /*long*/ newModel, int for (int j = 0; j < FIRST_COLUMN; j++) { OS.gtk_tree_model_get (oldModel, oldItem, j, ptr, -1); OS.gtk_tree_store_set (newModel, newItem, j, ptr [0], -1); - if (types [j] == OS.G_TYPE_STRING ()) OS.g_free ((ptr [0])); + if (types [j] == OS.G_TYPE_STRING ()) { + OS.g_free ((ptr [0])); + } else if (ptr[0] != 0) { + if (types[j] == OS.GDK_TYPE_COLOR()) { + OS.gdk_color_free(ptr[0]); + } else if (types[j] == OS.GDK_TYPE_PIXBUF()) { + OS.g_object_unref(ptr[0]); + } else if (types[j] == OS.PANGO_TYPE_FONT_DESCRIPTION()) { + OS.pango_font_description_free(ptr[0]); + } + } } for (int j= 0; j<modelLength - FIRST_COLUMN; j++) { OS.gtk_tree_model_get (oldModel, oldItem, oldStart + j, ptr, -1); OS.gtk_tree_store_set (newModel, newItem, newStart + j, ptr [0], -1); - if (types [j] == OS.G_TYPE_STRING ()) OS.g_free ((ptr [0])); + if (types [j] == OS.G_TYPE_STRING ()) { + OS.g_free ((ptr [0])); + } else if (ptr[0] != 0) { + if (types[j] == OS.GDK_TYPE_COLOR()) { + OS.gdk_color_free(ptr[0]); + } else if (types[j] == OS.GDK_TYPE_PIXBUF()) { + OS.g_object_unref(ptr[0]); + } else if (types[j] == OS.PANGO_TYPE_FONT_DESCRIPTION()) { + OS.pango_font_description_free(ptr[0]); + } + } } } } else { @@ -2646,7 +2670,10 @@ int /*long*/ rendererRenderProc (int /*long*/ cell, int /*long*/ window, int /*l int modelIndex = columnCount == 0 ? Tree.FIRST_COLUMN : columns [columnIndex].modelIndex; OS.gtk_tree_model_get (modelHandle, item.handle, modelIndex + Tree.CELL_BACKGROUND, ptr, -1); } - if (ptr [0] != 0) drawState |= SWT.BACKGROUND; + if (ptr [0] != 0) { + drawState |= SWT.BACKGROUND; + OS.gdk_color_free(ptr[0]); + } if ((flags & OS.GTK_CELL_RENDERER_SELECTED) != 0) drawState |= SWT.SELECTED; if ((flags & OS.GTK_CELL_RENDERER_FOCUSED) != 0) drawState |= SWT.FOCUSED; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java index c40dea4..cfa542d 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java @@ -229,6 +229,7 @@ Color _getBackground (int index) { if (ptr [0] == 0) return _getBackground (); GdkColor gdkColor = new GdkColor (); OS.memmove (gdkColor, ptr [0], GdkColor.sizeof); + OS.gdk_color_free (ptr [0]); return Color.gtk_new (display, gdkColor); } @@ -244,6 +245,7 @@ Color _getForeground () { if (ptr [0] == 0) return parent.getForeground (); GdkColor gdkColor = new GdkColor (); OS.memmove (gdkColor, ptr [0], GdkColor.sizeof); + OS.gdk_color_free (ptr [0]); return Color.gtk_new (display, gdkColor); } @@ -256,6 +258,7 @@ Color _getForeground (int index) { if (ptr [0] == 0) return _getForeground (); GdkColor gdkColor = new GdkColor (); OS.memmove (gdkColor, ptr [0], GdkColor.sizeof); + OS.gdk_color_free (ptr [0]); return Color.gtk_new (display, gdkColor); } @@ -268,6 +271,7 @@ Image _getImage (int index) { if (ptr [0] == 0) return null; ImageList imageList = parent.imageList; int imageIndex = imageList.indexOf (ptr [0]); + OS.g_object_unref (ptr [0]); if (imageIndex == -1) return null; return imageList.get (imageIndex); } |