[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