[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53980] trunk/blender/source/blender: fix [#33841] Disabling and re-enabling live addon crashes blender (modal/ draw handler)
Campbell Barton
ideasman42 at gmail.com
Tue Jan 22 07:16:53 CET 2013
Revision: 53980
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53980
Author: campbellbarton
Date: 2013-01-22 06:16:49 +0000 (Tue, 22 Jan 2013)
Log Message:
-----------
fix [#33841] Disabling and re-enabling live addon crashes blender (modal/draw handler)
Modified Paths:
--------------
trunk/blender/source/blender/makesrna/intern/rna_wm.c
trunk/blender/source/blender/windowmanager/WM_api.h
trunk/blender/source/blender/windowmanager/intern/wm.c
trunk/blender/source/blender/windowmanager/wm_event_system.h
Modified: trunk/blender/source/blender/makesrna/intern/rna_wm.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm.c 2013-01-22 04:54:31 UTC (rev 53979)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm.c 2013-01-22 06:16:49 UTC (rev 53980)
@@ -853,8 +853,11 @@
/* update while blender is running */
wm = bmain->wm.first;
- if (wm)
+ if (wm) {
WM_operator_stack_clear(wm);
+
+ WM_operator_handlers_clear(wm, ot);
+ }
WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
RNA_struct_free_extension(type, &ot->ext);
Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h 2013-01-22 04:54:31 UTC (rev 53979)
+++ trunk/blender/source/blender/windowmanager/WM_api.h 2013-01-22 06:16:49 UTC (rev 53980)
@@ -202,6 +202,7 @@
/* operator api */
void WM_operator_free (struct wmOperator *op);
void WM_operator_stack_clear(struct wmWindowManager *wm);
+void WM_operator_handlers_clear(wmWindowManager *wm, struct wmOperatorType *ot);
struct wmOperatorType *WM_operatortype_find(const char *idnamem, int quiet);
struct GHashIterator *WM_operatortype_iter(void);
Modified: trunk/blender/source/blender/windowmanager/intern/wm.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm.c 2013-01-22 04:54:31 UTC (rev 53979)
+++ trunk/blender/source/blender/windowmanager/intern/wm.c 2013-01-22 06:16:49 UTC (rev 53980)
@@ -149,7 +149,32 @@
WM_main_add_notifier(NC_WM | ND_HISTORY, NULL);
}
+/**
+ * This function is needed in the case when an addon id disabled
+ * while a modal operator it defined is running.
+ */
+void WM_operator_handlers_clear(wmWindowManager *wm, wmOperatorType *ot)
+{
+ wmWindow *win;
+ for (win = wm->windows.first; win; win = win->next) {
+ ListBase *lb[2] = {&win->handlers, &win->modalhandlers};
+ wmEventHandler *handler;
+ int i;
+ for (i = 0; i < 2; i++) {
+ for (handler = lb[i]->first; handler; handler = handler->next) {
+ if (handler->op && handler->op->type == ot) {
+ /* don't run op->cancel because it needs the context,
+ * assume whoever unregisters the operator will cleanup */
+ handler->flag |= WM_HANDLER_DO_FREE;
+ WM_operator_free(handler->op);
+ handler->op = NULL;
+ }
+ }
+ }
+ }
+}
+
/* ************ uiListType handling ************** */
static GHash *uilisttypes_hash = NULL;
Modified: trunk/blender/source/blender/windowmanager/wm_event_system.h
===================================================================
--- trunk/blender/source/blender/windowmanager/wm_event_system.h 2013-01-22 04:54:31 UTC (rev 53979)
+++ trunk/blender/source/blender/windowmanager/wm_event_system.h 2013-01-22 06:16:49 UTC (rev 53980)
@@ -45,7 +45,8 @@
typedef struct wmEventHandler {
struct wmEventHandler *next, *prev;
- int type, flag; /* type default=0, rest is custom */
+ int type; /* WM_HANDLER_DEFAULT, ... */
+ int flag; /* WM_HANDLER_BLOCKING, ... */
/* keymap handler */
wmKeyMap *keymap; /* pointer to builtin/custom keymaps */
@@ -72,21 +73,17 @@
} wmEventHandler;
-
-/* handler flag */
- /* after this handler all others are ignored */
-#define WM_HANDLER_BLOCKING 1
- /* handler tagged to be freed in wm_handlers_do() */
-#define WM_HANDLER_DO_FREE 2
-
-
-
/* custom types for handlers, for signalling, freeing */
enum {
WM_HANDLER_DEFAULT,
WM_HANDLER_FILESELECT
};
+/* handler flag */
+enum {
+ WM_HANDLER_BLOCKING = 1, /* after this handler all others are ignored */
+ WM_HANDLER_DO_FREE = 2 /* handler tagged to be freed in wm_handlers_do() */
+};
/* wm_event_system.c */
void wm_event_free_all (wmWindow *win);
More information about the Bf-blender-cvs
mailing list