[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26486] trunk/blender/source/blender: Fix #19888: tooltip would stay visible when starting e.g.

Brecht Van Lommel brecht at blender.org
Mon Feb 1 00:33:04 CET 2010


Revision: 26486
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26486
Author:   blendix
Date:     2010-02-01 00:33:04 +0100 (Mon, 01 Feb 2010)

Log Message:
-----------
Fix #19888: tooltip would stay visible when starting e.g. panning the
view, and be stuck there permantenly when leaving the region. Now the
button interaction is cancelled when starting a modal operator, not too
happy about this, but couldn't think of another way to detect this well.

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

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2010-01-31 23:27:40 UTC (rev 26485)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2010-01-31 23:33:04 UTC (rev 26486)
@@ -4204,7 +4204,6 @@
 {
 	uiBlock *block;
 	
-
 	/* check if the mouse is in the region */
 	if(!BLI_in_rcti(&ar->winrct, x, y)) {
 		for(block=ar->uiblocks.first; block; block=block->next)
@@ -4698,6 +4697,7 @@
 	if(data->state == BUTTON_STATE_HIGHLIGHT) {
 		switch(event->type) {
 			case WINDEACTIVATE:
+			case EVT_BUT_CANCEL:
 				data->cancel= 1;
 				button_activate_state(C, but, BUTTON_STATE_EXIT);
 				retval= WM_UI_HANDLER_CONTINUE;

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-01-31 23:27:40 UTC (rev 26485)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-01-31 23:33:04 UTC (rev 26486)
@@ -281,6 +281,61 @@
 	CTX_wm_window_set(C, NULL);
 }
 
+/* ********************* ui handler ******************* */
+
+static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *event, int always_pass)
+{
+	ScrArea *area= CTX_wm_area(C);
+	ARegion *region= CTX_wm_region(C);
+	ARegion *menu= CTX_wm_menu(C);
+	int retval;
+			
+	/* we set context to where ui handler came from */
+	if(handler->ui_area) CTX_wm_area_set(C, handler->ui_area);
+	if(handler->ui_region) CTX_wm_region_set(C, handler->ui_region);
+	if(handler->ui_menu) CTX_wm_menu_set(C, handler->ui_menu);
+
+	retval= handler->ui_handle(C, event, handler->ui_userdata);
+
+	/* putting back screen context */
+	if((retval != WM_UI_HANDLER_BREAK) || always_pass) {
+		CTX_wm_area_set(C, area);
+		CTX_wm_region_set(C, region);
+		CTX_wm_menu_set(C, menu);
+	}
+	else {
+		/* this special cases is for areas and regions that get removed */
+		CTX_wm_area_set(C, NULL);
+		CTX_wm_region_set(C, NULL);
+		CTX_wm_menu_set(C, NULL);
+	}
+
+	if(retval == WM_UI_HANDLER_BREAK)
+		return WM_HANDLER_BREAK;
+
+	return WM_HANDLER_CONTINUE;
+}
+
+static void wm_handler_ui_cancel(bContext *C)
+{
+	wmWindow *win= CTX_wm_window(C);
+	ARegion *ar= CTX_wm_region(C);
+	wmEventHandler *handler, *nexthandler;
+
+	if(!ar)
+		return;
+
+	for(handler= ar->handlers.first; handler; handler= nexthandler) {
+		nexthandler= handler->next;
+
+		if(handler->ui_handle) {
+			wmEvent event= *(win->eventstate);
+			event.type= EVT_BUT_CANCEL;
+			handler->ui_handle(C, &event, handler->ui_userdata);
+		}
+	}
+}
+
 /* ********************* operators ******************* */
 
 int WM_operator_poll(bContext *C, wmOperatorType *ot)
@@ -553,6 +608,12 @@
 
 				WM_cursor_grab(CTX_wm_window(C), wrap, FALSE, bounds);
 			}
+
+			/* cancel UI handlers, typically tooltips that can hang around
+			   while dragging the view or worse, that stay there permanently
+			   after the modal operator has swallowed all events and passed
+			   none to the UI handler */
+			wm_handler_ui_cancel(C);
 		}
 		else
 			WM_operator_free(op);
@@ -1040,42 +1101,6 @@
 	return WM_HANDLER_BREAK;
 }
 
-static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *event)
-{
-	ScrArea *area= CTX_wm_area(C);
-	ARegion *region= CTX_wm_region(C);
-	ARegion *menu= CTX_wm_menu(C);
-	int retval, always_pass;
-			
-	/* we set context to where ui handler came from */
-	if(handler->ui_area) CTX_wm_area_set(C, handler->ui_area);
-	if(handler->ui_region) CTX_wm_region_set(C, handler->ui_region);
-	if(handler->ui_menu) CTX_wm_menu_set(C, handler->ui_menu);
-
-	/* in advance to avoid access to freed event on window close */
-	always_pass= wm_event_always_pass(event);
-
-	retval= handler->ui_handle(C, event, handler->ui_userdata);
-
-	/* putting back screen context */
-	if((retval != WM_UI_HANDLER_BREAK) || always_pass) {
-		CTX_wm_area_set(C, area);
-		CTX_wm_region_set(C, region);
-		CTX_wm_menu_set(C, menu);
-	}
-	else {
-		/* this special cases is for areas and regions that get removed */
-		CTX_wm_area_set(C, NULL);
-		CTX_wm_region_set(C, NULL);
-		CTX_wm_menu_set(C, NULL);
-	}
-
-	if(retval == WM_UI_HANDLER_BREAK)
-		return WM_HANDLER_BREAK;
-
-	return WM_HANDLER_CONTINUE;
-}
-
 /* fileselect handlers are only in the window queue, so it's save to switch screens or area types */
 static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHandler *handler, wmEvent *event)
 {
@@ -1277,7 +1302,7 @@
 				}
 			}
 			else if(handler->ui_handle) {
-				action |= wm_handler_ui_call(C, handler, event);
+				action |= wm_handler_ui_call(C, handler, event, always_pass);
 			}
 			else if(handler->type==WM_HANDLER_FILESELECT) {
 				/* screen context changes here */

Modified: trunk/blender/source/blender/windowmanager/wm_event_types.h
===================================================================
--- trunk/blender/source/blender/windowmanager/wm_event_types.h	2010-01-31 23:27:40 UTC (rev 26485)
+++ trunk/blender/source/blender/windowmanager/wm_event_types.h	2010-01-31 23:33:04 UTC (rev 26486)
@@ -267,6 +267,7 @@
 #define EVT_BUT_OPEN	0x5021
 #define EVT_MODAL_MAP	0x5022
 #define EVT_DROP		0x5023
+#define EVT_BUT_CANCEL	0x5024
 
 /* NOTE: these defines are saved in keymap files, do not change values but just add new ones */
 #define GESTURE_MODAL_CANCEL		1





More information about the Bf-blender-cvs mailing list