[Bf-blender-cvs] [721f384] temp_widgets_c++_experiment: Generalize deleting of wmWidget types

Julian Eisel noreply at git.blender.org
Mon Dec 21 19:21:27 CET 2015


Commit: 721f38439e013a8d7e4acbfc88f2186568c1bb41
Author: Julian Eisel
Date:   Mon Dec 21 19:01:19 2015 +0100
Branches: temp_widgets_c++_experiment
https://developer.blender.org/rB721f38439e013a8d7e4acbfc88f2186568c1bb41

Generalize deleting of wmWidget types

===================================================================

M	source/blender/blenkernel/intern/screen.c
M	source/blender/editors/space_graph/graph_edit.c
M	source/blender/editors/space_sequencer/sequencer_view.c
M	source/blender/windowmanager/intern/widgets/wm_widget.cc
M	source/blender/windowmanager/intern/widgets/wm_widget.h
M	source/blender/windowmanager/intern/widgets/wm_widgetgroup.cc
M	source/blender/windowmanager/intern/widgets/wm_widgetgroup.h
M	source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.cc
M	source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.h
M	source/blender/windowmanager/intern/widgets/wm_widgetmap.cc
M	source/blender/windowmanager/intern/widgets/wm_widgetmap.h
M	source/blender/windowmanager/intern/widgets/wm_widgets_c_api.cc
M	source/blender/windowmanager/intern/widgets/wm_widgets_c_api.h
M	source/blenderplayer/bad_level_call_stubs/stubs.c

===================================================================

diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 27621d9..2344bea 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -341,8 +341,7 @@ void BKE_area_region_free(SpaceType *st, ARegion *ar)
 		}
 	}
 
-	WM_widgetmaps_delete(&ar->widgetmaps);
-	BLI_listbase_clear(&ar->widgetmaps);
+	WM_widgetmaps_remove(&ar->widgetmaps);
 	BLI_freelistN(&ar->ui_lists);
 	BLI_freelistN(&ar->ui_previews);
 	BLI_freelistN(&ar->panels_category);
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index 8047c47..9ec3a61 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -2661,7 +2661,7 @@ static void graph_widget_backdrop_transform_finish(bContext *C, BackDropTransfor
 {
 	ScrArea *sa = CTX_wm_area(C);
 	ED_area_headerprint(sa, NULL);
-	WM_widgetgrouptype_delete(C, CTX_data_main(C), data->cagetype);
+	WM_widgetgrouptype_remove(C, CTX_data_main(C), data->cagetype);
 	MEM_freeN(data);
 }
 
diff --git a/source/blender/editors/space_sequencer/sequencer_view.c b/source/blender/editors/space_sequencer/sequencer_view.c
index dfb513c..cb8163b 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -320,7 +320,7 @@ static void sequencer_overdrop_finish(bContext *C, OverDropTransformData *data)
 {
 	ScrArea *sa = CTX_wm_area(C);
 	ED_area_headerprint(sa, NULL);
-	WM_widgetgrouptype_delete(C, CTX_data_main(C), data->cagetype);
+	WM_widgetgrouptype_remove(C, CTX_data_main(C), data->cagetype);
 	MEM_freeN(data);
 }
 
@@ -489,7 +489,7 @@ static void sequencer_image_transform_widget_finish(bContext *C, ImageTransformD
 {
 	ScrArea *sa = CTX_wm_area(C);
 	ED_area_headerprint(sa, NULL);
-	WM_widgetgrouptype_delete(C, CTX_data_main(C), data->cagetype);
+	WM_widgetgrouptype_remove(C, CTX_data_main(C), data->cagetype);
 	MEM_freeN(data);
 }
 
diff --git a/source/blender/windowmanager/intern/widgets/wm_widget.cc b/source/blender/windowmanager/intern/widgets/wm_widget.cc
index aa88754..d2db13d 100644
--- a/source/blender/windowmanager/intern/widgets/wm_widget.cc
+++ b/source/blender/windowmanager/intern/widgets/wm_widget.cc
@@ -71,7 +71,7 @@ void widget_data_free(wmWidget *widget)
  * Free and NULL \a widget.
  * \a widgetlist is allowed to be NULL.
  */
-void widget_delete(ListBase *widgetlist, wmWidget *widget)
+void widget_remove(ListBase *widgetlist, wmWidget *widget)
 {
 	widget_data_free(widget);
 	if (widgetlist)
diff --git a/source/blender/windowmanager/intern/widgets/wm_widget.h b/source/blender/windowmanager/intern/widgets/wm_widget.h
index a873e05..2e16642 100644
--- a/source/blender/windowmanager/intern/widgets/wm_widget.h
+++ b/source/blender/windowmanager/intern/widgets/wm_widget.h
@@ -60,7 +60,7 @@ public:
 };
 #endif
 
-void widget_delete(ListBase *widgetlist, wmWidget *widget);
+void widget_remove(ListBase *widgetlist, wmWidget *widget);
 void widget_data_free(wmWidget *widget);
 void widget_find_active_3D_loop(const bContext *C, ListBase *visible_widgets);
 void widget_calculate_scale(wmWidget *widget, const bContext *C);
diff --git a/source/blender/windowmanager/intern/widgets/wm_widgetgroup.cc b/source/blender/windowmanager/intern/widgets/wm_widgetgroup.cc
index 6af9fb9..09b2ab3 100644
--- a/source/blender/windowmanager/intern/widgets/wm_widgetgroup.cc
+++ b/source/blender/windowmanager/intern/widgets/wm_widgetgroup.cc
@@ -53,9 +53,11 @@ wmWidgetGroup::wmWidgetGroup()
 }
 #endif
 
-void widgetgroup_free(bContext *C, wmWidgetMap *wmap, wmWidgetGroup *wgroup)
+void widgetgroup_remove(bContext *C, wmWidgetMap *wmap, wmWidgetGroup *wgroup)
 {
-	for (wmWidget *widget = (wmWidget *)wgroup->widgets.first; widget;) {
+	wmWidget *widget = (wmWidget *)wgroup->widgets.first;
+
+	while (widget) {
 		wmWidget *widget_next = widget->next;
 		if (widget->flag & WM_WIDGET_HIGHLIGHT) {
 			wmap->set_highlighted_widget(C, NULL, 0);
@@ -63,10 +65,13 @@ void widgetgroup_free(bContext *C, wmWidgetMap *wmap, wmWidgetGroup *wgroup)
 		if (widget->flag & WM_WIDGET_ACTIVE) {
 			wmap->set_active_widget(C, NULL, NULL);
 		}
-		widget_delete(&wgroup->widgets, widget);
+
+		widget_remove(&wgroup->widgets, widget);
 		widget = widget_next;
 	}
 
+	BLI_remlink(&wmap->widgetgroups, wgroup);
+
 #ifdef WITH_PYTHON
 	if (wgroup->py_instance) {
 		/* do this first in case there are any __del__ functions or
@@ -80,7 +85,6 @@ void widgetgroup_free(bContext *C, wmWidgetMap *wmap, wmWidgetGroup *wgroup)
 		MEM_freeN(wgroup->reports);
 	}
 
-	BLI_remlink(&wmap->widgetgroups, wgroup);
-	MEM_freeN(wgroup);
+	delete wgroup;
 }
 
diff --git a/source/blender/windowmanager/intern/widgets/wm_widgetgroup.h b/source/blender/windowmanager/intern/widgets/wm_widgetgroup.h
index 8779ee5..3dc46b3 100644
--- a/source/blender/windowmanager/intern/widgets/wm_widgetgroup.h
+++ b/source/blender/windowmanager/intern/widgets/wm_widgetgroup.h
@@ -43,6 +43,6 @@ public:
 };
 #endif
 
-void widgetgroup_free(bContext *C, struct wmWidgetMap *wmap, wmWidgetGroup *wgroup);
+void widgetgroup_remove(bContext *C, struct wmWidgetMap *wmap, wmWidgetGroup *wgroup);
 
 #endif // __WM_WIDGETGROUP_H__
diff --git a/source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.cc b/source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.cc
index d20b61e..e61ae80 100644
--- a/source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.cc
+++ b/source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.cc
@@ -108,7 +108,14 @@ wmWidgetGroupType::wmWidgetGroupType(
 	}
 }
 
-void wmWidgetGroupType::free(bContext *C, Main *bmain)
+#if 0 /* not needed yet */
+wmWidgetGroupType::~wmWidgetGroupType()
+{
+	
+}
+#endif
+
+void wmWidgetGroupType::unregister(bContext *C, Main *bmain)
 {
 	for (bScreen *sc = (bScreen *)bmain->screen.first; sc; sc = (bScreen *)sc->id.next) {
 		for (ScrArea *sa = (ScrArea *)sc->areabase.first; sa; sa = sa->next) {
@@ -121,7 +128,7 @@ void wmWidgetGroupType::free(bContext *C, Main *bmain)
 						for (wgroup = (wmWidgetGroup *)wmap->widgetgroups.first; wgroup; wgroup = wgroup_next) {
 							wgroup_next = wgroup->next;
 							if (wgroup->type == this) {
-								widgetgroup_free(C, wmap, wgroup);
+								widgetgroup_remove(C, wmap, wgroup);
 								ED_region_tag_redraw(ar);
 							}
 						}
@@ -131,14 +138,10 @@ void wmWidgetGroupType::free(bContext *C, Main *bmain)
 		}
 	}
 
+
 	wmWidgetMapType *wmaptype = WM_widgetmaptype_find(mapidname, spaceid,
 	                                                  regionid, is_3d, false);
-
 	BLI_remlink(&wmaptype->widgetgrouptypes, this);
-	prev = next = NULL;
-
-	// yay, suicide
-	delete this;
 }
 
 void wmWidgetGroupType::keymap_init_do(wmKeyConfig *keyconf)
diff --git a/source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.h b/source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.h
index a839dae..df2e640 100644
--- a/source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.h
+++ b/source/blender/windowmanager/intern/widgets/wm_widgetgrouptype.h
@@ -49,9 +49,6 @@ class wmWidgetGroupType
 public:
 	wmWidgetGroupType *next, *prev;
 
-	/**
-	 * \brief wmWidgetGroupType Constructor
-	 */
 	wmWidgetGroupType(
 	        wmWidgetMapType *wmaptype,
 	        int (*poll)(const bContext *, wmWidgetGroupType *),
@@ -59,7 +56,7 @@ public:
 	        wmKeyMap *(*keymap_init)(wmKeyConfig *, const char *),
 	        const Main *bmain, const char *mapidname, const char *name,
 	        const short spaceid, const short regionid, const bool is_3d);
-	void free(bContext *C, Main *bmain);
+	void unregister(bContext *C, Main *bmain);
 
 	void keymap_init_do(wmKeyConfig *keyconf);
 	void attach_to_handler(bContext *C, struct wmEventHandler *handler, struct wmOperator *op_);
diff --git a/source/blender/windowmanager/intern/widgets/wm_widgetmap.cc b/source/blender/windowmanager/intern/widgets/wm_widgetmap.cc
index 2d5627d..e30fe91 100644
--- a/source/blender/windowmanager/intern/widgets/wm_widgetmap.cc
+++ b/source/blender/windowmanager/intern/widgets/wm_widgetmap.cc
@@ -79,19 +79,22 @@ wmWidgetMap::wmWidgetMap(const char *idname, const int spaceid, const int region
 	}
 }
 
+/**
+ * \brief wmWidgetMap Destructor
+ *
+ * \warning As it currently is, this may only be called on exit/startup. If called on runtime,
+ *          bContext * should be passed to #widgetgroup_remove so cursor can be reset.
+ */
 wmWidgetMap::~wmWidgetMap()
 {
-	for (wmWidgetGroup *wgroup = (wmWidgetGroup *)widgetgroups.first; wgroup;) {
-		wmWidgetGroup *wgroup_next = wgroup->next;
+	wmWidgetGroup *wgroup = (wmWidgetGroup *)widgetgroups.first;
 
-		for (wmWidget *widget = (wmWidget *)wgroup->widgets.first; widget;) {
-			wmWidget *widget_next = widget->next;
-			widget_delete(&wgroup->widgets, widget);
-			widget = widget_next;
-		}
+	while (wgroup) {
+		wmWidgetGroup *wgroup_next = wgroup->next;
 
-		/* XXX should actually share code with widgetgroup_free, but needs to be done carefully */
-		delete wgroup;
+		/* bContext * can be NULL since this destructor is only called
+		 * on exit and we don't need to change cursor state */
+		widgetgroup_remove(NULL, this, wgroup);
 		wgroup = wgroup_next;
 	}
 
@@ -99,15 +102,25 @@ wmWidgetMap::~wmWidgetMap()
 	MEM_SAFE_FREE(wmap_context.selected_widgets);
 }
 
-void WM_widgetmaps_delete(ListBase *widgetmaps)
+void wmWidgetMap::unregister(ListBase *widgetmaps)
+{
+	BLI_remlink(widgetmaps, this);
+}
+
+/**
+ * \brief Remove all widgetmaps of ListBase \a widgetmaps.
+ */
+void WM_widgetmaps_remove(ListBase *widgetmaps)
 {
 	wmWidgetMap *wmap = (wmWidgetMap *)widgetmaps->first;
 
 	while (wmap) {
 		wmWidgetMap *wmap_next = wmap->next;
-		WM_widgetmap_delete(wmap);
+		WM_widgetmap_remove(wmap, widgetmaps);
 		wmap = wmap_next;
 	}
+
+	BLI_assert(BLI_listbase_is_empty(widgetmaps));
 }
 
 static void widget_highlight_update(wmWidgetMap *wmap, const wmWidget *old_, wmWidget *new_)
@@ -152,7 +165,7 @@ void wmWidgetMap::update(const bContext *C)
 						widget->next = widget->prev = NULL;
 					}
 					else {
-						widget_delete(&wgroup->widgets, widget);
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list