* Use _FindView() where possible instead of using BTokenSpace::GetToken() directly.
* Fixed some issues in _UnpackMessage():
- The focus view could have been removed before its turn which was ignored
(and could led to a crash, for example when moving the Deskbar around).
It's now tested if it's still valid (can't use _FindView() here, as the
the preferred handler of a window could be any BHandler).
- fLastMouseMovedView could have been NULL in which case there is no
need to let the message be processed (was harmless, though).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16010 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -2533,14 +2533,9 @@ BWindow::_DetermineTarget(BMessage *message, BHandler *target)
|
|||||||
// is there a token of the view that is currently under the mouse?
|
// is there a token of the view that is currently under the mouse?
|
||||||
int32 token;
|
int32 token;
|
||||||
if (message->FindInt32("_view_token", &token) == B_OK) {
|
if (message->FindInt32("_view_token", &token) == B_OK) {
|
||||||
BHandler* handler;
|
BView* view = _FindView(token);
|
||||||
if (gDefaultTokens.GetToken(token, B_HANDLER_TOKEN,
|
if (view != NULL)
|
||||||
(void**)&handler) == B_OK
|
return view;
|
||||||
&& handler->Looper() == this) {
|
|
||||||
BView* view = dynamic_cast<BView*>(handler);
|
|
||||||
if (view != NULL)
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if there is no valid token in the message, we try our
|
// if there is no valid token in the message, we try our
|
||||||
@@ -2626,23 +2621,35 @@ BWindow::_UnpackMessage(unpack_cookie& cookie, BMessage** _message, BHandler** _
|
|||||||
// if there is a last mouse moved view, and the new focus is
|
// if there is a last mouse moved view, and the new focus is
|
||||||
// different, the previous view wants to get its B_EXITED_VIEW
|
// different, the previous view wants to get its B_EXITED_VIEW
|
||||||
// message
|
// message
|
||||||
if (cookie.last_view_token != B_NULL_TOKEN && fLastMouseMovedView != cookie.focus) {
|
if (cookie.last_view_token != B_NULL_TOKEN && fLastMouseMovedView != NULL
|
||||||
|
&& fLastMouseMovedView != cookie.focus) {
|
||||||
*_message = new BMessage(*cookie.message);
|
*_message = new BMessage(*cookie.message);
|
||||||
*_target = fLastMouseMovedView;
|
*_target = fLastMouseMovedView;
|
||||||
cookie.last_view_token = B_NULL_TOKEN;
|
cookie.last_view_token = B_NULL_TOKEN;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cookie.index > 0) {
|
bool dispatchToFocus = true;
|
||||||
|
|
||||||
|
// check if the focus token is still valid (could have been removed in the mean time)
|
||||||
|
BHandler* handler;
|
||||||
|
if (gDefaultTokens.GetToken(cookie.focus_token, B_HANDLER_TOKEN, (void**)&handler) != B_OK
|
||||||
|
|| handler->Looper() != this)
|
||||||
|
dispatchToFocus = false;
|
||||||
|
|
||||||
|
if (dispatchToFocus && cookie.index > 0) {
|
||||||
// should this message still be dispatched by the focus view?
|
// should this message still be dispatched by the focus view?
|
||||||
bool feedFocus;
|
bool feedFocus;
|
||||||
if (!cookie.found_focus
|
if (!cookie.found_focus
|
||||||
&& (cookie.message->FindBool("_feed_focus", &feedFocus) != B_OK
|
&& (cookie.message->FindBool("_feed_focus", &feedFocus) != B_OK
|
||||||
|| feedFocus == false)) {
|
|| feedFocus == false))
|
||||||
delete cookie.message;
|
dispatchToFocus = false;
|
||||||
cookie.message = NULL;
|
}
|
||||||
return false;
|
|
||||||
}
|
if (!dispatchToFocus) {
|
||||||
|
delete cookie.message;
|
||||||
|
cookie.message = NULL;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*_message = cookie.message;
|
*_message = cookie.message;
|
||||||
@@ -2679,13 +2686,8 @@ BWindow::_SanitizeMessage(BMessage* message, BHandler* target, bool usePreferred
|
|||||||
// is there a token of the view that is currently under the mouse?
|
// is there a token of the view that is currently under the mouse?
|
||||||
BView* viewUnderMouse = NULL;
|
BView* viewUnderMouse = NULL;
|
||||||
int32 token;
|
int32 token;
|
||||||
if (message->FindInt32("_view_token", &token) == B_OK) {
|
if (message->FindInt32("_view_token", &token) == B_OK)
|
||||||
BHandler* handler;
|
viewUnderMouse = _FindView(token);
|
||||||
if (gDefaultTokens.GetToken(token, B_HANDLER_TOKEN,
|
|
||||||
(void**)&handler) == B_OK
|
|
||||||
&& handler->Looper() == this)
|
|
||||||
viewUnderMouse = dynamic_cast<BView*>(handler);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add transit information
|
// add transit information
|
||||||
int32 transit;
|
int32 transit;
|
||||||
|
|||||||
Reference in New Issue
Block a user