[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56881] trunk/blender/source/blender: fix for crash with toggle-drag on a popup ( when the popup is closed while dragging).

Campbell Barton ideasman42 at gmail.com
Fri May 17 15:54:45 CEST 2013


Revision: 56881
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56881
Author:   campbellbarton
Date:     2013-05-17 13:54:44 +0000 (Fri, 17 May 2013)
Log Message:
-----------
fix for crash with toggle-drag on a popup (when the popup is closed while dragging).

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2013-05-17 13:15:43 UTC (rev 56880)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2013-05-17 13:54:44 UTC (rev 56881)
@@ -7606,6 +7606,14 @@
 		ui_popup_block_free(C, menu);
 		UI_remove_popup_handlers(&CTX_wm_window(C)->modalhandlers, menu);
 
+#ifdef USE_DRAG_TOGGLE
+		{
+			wmWindow *win = CTX_wm_window(C);
+			WM_event_free_ui_handler_all(C, &win->modalhandlers,
+			                             ui_handler_region_drag_toggle, ui_handler_region_drag_toggle_remove);
+		}
+#endif
+
 		if ((temp.menuretval & UI_RETURN_OK) || (temp.menuretval & UI_RETURN_POPUP_OK)) {
 			if (temp.popup_func)
 				temp.popup_func(C, temp.popup_arg, temp.retvalue);

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2013-05-17 13:15:43 UTC (rev 56880)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2013-05-17 13:54:44 UTC (rev 56881)
@@ -159,6 +159,9 @@
                                        void (*remove)(struct bContext *C, void *userdata),
                                        void *userdata, const bool postpone);
 void		WM_event_remove_area_handler(struct ListBase *handlers, void *area);
+void		WM_event_free_ui_handler_all(struct bContext *C, ListBase *handlers,
+                                         int (*func)(struct bContext *C, const struct wmEvent *event, void *userdata),
+                                         void (*remove)(struct bContext *C, void *userdata));
 
 struct wmEventHandler *WM_event_add_modal_handler(struct bContext *C, struct wmOperator *op);
 void		WM_event_remove_handlers(struct bContext *C, ListBase *handlers);

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2013-05-17 13:15:43 UTC (rev 56880)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2013-05-17 13:54:44 UTC (rev 56881)
@@ -2476,6 +2476,21 @@
 	}
 }
 
+void WM_event_free_ui_handler_all(bContext *C, ListBase *handlers,
+                                  wmUIHandlerFunc func, wmUIHandlerRemoveFunc remove)
+{
+	wmEventHandler *handler, *handler_next;
+
+	for (handler = handlers->first; handler; handler = handler_next) {
+		handler_next = handler->next;
+		if (handler->ui_handle == func && handler->ui_remove == remove) {
+			remove(C, handler->ui_userdata);
+			BLI_remlink(handlers, handler);
+			wm_event_free_handler(handler);
+		}
+	}
+}
+
 wmEventHandler *WM_event_add_dropbox_handler(ListBase *handlers, ListBase *dropboxes)
 {
 	wmEventHandler *handler;




More information about the Bf-blender-cvs mailing list