[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53675] trunk/blender/source/blender: avoid having dangling panel pointers in the interface, unregistering addons could leave the interface pointing to freed memory.
Campbell Barton
ideasman42 at gmail.com
Wed Jan 9 07:00:40 CET 2013
Revision: 53675
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53675
Author: campbellbarton
Date: 2013-01-09 06:00:33 +0000 (Wed, 09 Jan 2013)
Log Message:
-----------
avoid having dangling panel pointers in the interface, unregistering addons could leave the interface pointing to freed memory.
Modified Paths:
--------------
trunk/blender/source/blender/editors/include/UI_interface.h
trunk/blender/source/blender/editors/interface/interface_panel.c
trunk/blender/source/blender/makesrna/intern/rna_ui.c
Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h 2013-01-09 05:32:15 UTC (rev 53674)
+++ trunk/blender/source/blender/editors/include/UI_interface.h 2013-01-09 06:00:33 UTC (rev 53675)
@@ -42,6 +42,7 @@
struct Main;
struct ListBase;
struct ARegion;
+struct ARegionType;
struct ScrArea;
struct wmWindow;
struct wmWindowManager;
@@ -660,6 +661,7 @@
struct Panel *uiBeginPanel(struct ScrArea *sa, struct ARegion *ar, uiBlock *block, struct PanelType *pt, int *open);
void uiEndPanel(uiBlock *block, int width, int height);
void uiScalePanels(struct ARegion *ar, float new_width);
+void uiPanelClearType(struct wmWindowManager *wm, const struct ARegionType *art, const struct PanelType *type);
/* Handlers
*
Modified: trunk/blender/source/blender/editors/interface/interface_panel.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_panel.c 2013-01-09 05:32:15 UTC (rev 53674)
+++ trunk/blender/source/blender/editors/interface/interface_panel.c 2013-01-09 06:00:33 UTC (rev 53675)
@@ -306,6 +306,31 @@
}
}
+void uiPanelClearType(wmWindowManager *wm, const ARegionType *art, const PanelType *type)
+{
+ wmWindow *win;
+ for (win = wm->windows.first; win; win = win->next) {
+ ScrArea *sa;
+ for (sa = win->screen->areabase.first; sa; sa = sa->next) {
+ ARegion *ar;
+ for (ar = sa->regionbase.first; ar; ar = ar->next) {
+ if (ar->type == art) {
+ uiBlock *block, *nblock = ar->uiblocks.first;
+ while ((block = nblock)) {
+ nblock = block->next;
+ if (block->panel) {
+ if (block->panel->type == type) {
+ uiFreeBlock(block->evil_C, block);
+ BLI_remlink(&ar->uiblocks, block);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
static void ui_offset_panel_block(uiBlock *block)
{
uiStyle *style = UI_GetStyleDraw();
Modified: trunk/blender/source/blender/makesrna/intern/rna_ui.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ui.c 2013-01-09 05:32:15 UTC (rev 53674)
+++ trunk/blender/source/blender/makesrna/intern/rna_ui.c 2013-01-09 06:00:33 UTC (rev 53675)
@@ -165,8 +165,9 @@
RNA_parameter_list_free(&list);
}
-static void rna_Panel_unregister(Main *UNUSED(bmain), StructRNA *type)
+static void rna_Panel_unregister(Main *bmain, StructRNA *type)
{
+ wmWindowManager *wm;
ARegionType *art;
PanelType *pt = RNA_struct_blender_type_get(type);
@@ -174,6 +175,10 @@
return;
if (!(art = region_type_find(NULL, pt->space_type, pt->region_type)))
return;
+
+ for (wm = bmain->wm.first; wm; wm = wm->id.next) {
+ uiPanelClearType(wm, art, pt);
+ }
RNA_struct_free_extension(type, &pt->ext);
More information about the Bf-blender-cvs
mailing list