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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to