Moved the ViewUnderMouse() functionality from the EventDispatcher to the Desktop;

this saves us some locking headaches and solves a possible deadlock in
ServerApp::Activate().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16688 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-03-10 13:03:41 +00:00
parent e0e1c52865
commit 1e766d4688
6 changed files with 37 additions and 31 deletions
+24 -2
View File
@@ -240,11 +240,15 @@ MouseFilter::Filter(BMessage* message, EventTarget** _target, int32* _viewToken,
break; break;
} }
if (*_viewToken != B_NULL_TOKEN) if (*_viewToken != B_NULL_TOKEN) {
fDesktop->SetViewUnderMouse(window, *_viewToken);
*_target = &window->EventTarget(); *_target = &window->EventTarget();
else } else {
fDesktop->SetViewUnderMouse(NULL, B_NULL_TOKEN);
*_target = NULL; *_target = NULL;
}
} else { } else {
fDesktop->SetViewUnderMouse(NULL, B_NULL_TOKEN);
fDesktop->SetCursor(NULL); fDesktop->SetCursor(NULL);
*_target = NULL; *_target = NULL;
} }
@@ -1756,6 +1760,24 @@ Desktop::SetMouseEventWindow(WindowLayer* window)
} }
void
Desktop::SetViewUnderMouse(const WindowLayer* window, int32 viewToken)
{
fWindowUnderMouse = window;
fViewUnderMouse = viewToken;
}
int32
Desktop::ViewUnderMouse(const WindowLayer* window)
{
if (fWindowUnderMouse == window)
return fViewUnderMouse;
return B_NULL_TOKEN;
}
WindowLayer * WindowLayer *
Desktop::FindWindowLayerByClientToken(int32 token, team_id teamID) Desktop::FindWindowLayerByClientToken(int32 token, team_id teamID)
{ {
+6
View File
@@ -134,6 +134,9 @@ class Desktop : public MessageLooper, public ScreenOwner {
WindowLayer* MouseEventWindow() const { return fMouseEventWindow; } WindowLayer* MouseEventWindow() const { return fMouseEventWindow; }
void SetMouseEventWindow(WindowLayer* window); void SetMouseEventWindow(WindowLayer* window);
void SetViewUnderMouse(const WindowLayer* window, int32 viewToken);
int32 ViewUnderMouse(const WindowLayer* window);
void SetFocusWindow(WindowLayer* window); void SetFocusWindow(WindowLayer* window);
WindowLayer* FindWindowLayerByClientToken(int32 token, team_id teamID); WindowLayer* FindWindowLayerByClientToken(int32 token, team_id teamID);
@@ -241,6 +244,9 @@ class Desktop : public MessageLooper, public ScreenOwner {
bool fFocusFollowsMouse; bool fFocusFollowsMouse;
WindowLayer* fMouseEventWindow; WindowLayer* fMouseEventWindow;
const WindowLayer* fWindowUnderMouse;
int32 fViewUnderMouse;
WindowLayer* fFocus; WindowLayer* fFocus;
WindowLayer* fFront; WindowLayer* fFront;
WindowLayer* fBack; WindowLayer* fBack;
+5 -20
View File
@@ -219,7 +219,6 @@ EventDispatcher::EventDispatcher()
fThread(-1), fThread(-1),
fCursorThread(-1), fCursorThread(-1),
fPreviousMouseTarget(NULL), fPreviousMouseTarget(NULL),
fPreviousViewToken(B_NULL_TOKEN),
fFocus(NULL), fFocus(NULL),
fSuspendFocus(false), fSuspendFocus(false),
fMouseFilter(NULL), fMouseFilter(NULL),
@@ -507,24 +506,11 @@ EventDispatcher::SetHWInterface(HWInterface* interface)
} }
int32
EventDispatcher::ViewUnderMouse(EventTarget& target)
{
BAutolock _(this);
if (&target == fPreviousMouseTarget)
return fPreviousViewToken;
return B_NULL_TOKEN;
}
void void
EventDispatcher::SetDragMessage(BMessage& message, EventDispatcher::SetDragMessage(BMessage& message,
ServerBitmap* bitmap, ServerBitmap* bitmap, const BPoint& offsetFromCursor)
const BPoint& offsetFromCursor)
{ {
// printf("EventDispatcher::SetDragMessage()\n"); ETRACE(("EventDispatcher::SetDragMessage()\n"));
if (fDragBitmap != bitmap) { if (fDragBitmap != bitmap) {
if (fDragBitmap) if (fDragBitmap)
@@ -541,10 +527,10 @@ EventDispatcher::SetDragMessage(BMessage& message,
BAutolock _(this); BAutolock _(this);
fDragMessage = message; fDragMessage = message;
fDraggingMessage = true; fDraggingMessage = true;
} }
// #pragma mark - Message methods // #pragma mark - Message methods
@@ -641,9 +627,9 @@ EventDispatcher::_UnsetFeedFocus(BMessage* message)
void void
EventDispatcher::_DeliverDragMessage() EventDispatcher::_DeliverDragMessage()
{ {
// printf("EventDispatcher::_DeliverDragMessage()\n"); ETRACE(("EventDispatcher::_DeliverDragMessage()\n"));
if (fDraggingMessage && fPreviousMouseTarget) { if (fDraggingMessage && fPreviousMouseTarget != NULL) {
fDragMessage.RemoveName("_original_what"); fDragMessage.RemoveName("_original_what");
fDragMessage.AddInt32("_original_what", fDragMessage.what); fDragMessage.AddInt32("_original_what", fDragMessage.what);
fDragMessage.what = _MESSAGE_DROPPED_; fDragMessage.what = _MESSAGE_DROPPED_;
@@ -777,7 +763,6 @@ EventDispatcher::_EventLoop()
} }
current = fPreviousMouseTarget = mouseTarget; current = fPreviousMouseTarget = mouseTarget;
fPreviousViewToken = viewToken;
if (current != NULL) { if (current != NULL) {
int32 focusView = viewToken; int32 focusView = viewToken;
-3
View File
@@ -85,8 +85,6 @@ class EventDispatcher : public BLocker {
bool HasCursorThread(); bool HasCursorThread();
void SetHWInterface(HWInterface* interface); void SetHWInterface(HWInterface* interface);
int32 ViewUnderMouse(EventTarget& target);
void SetDragMessage(BMessage& message, ServerBitmap* bitmap, void SetDragMessage(BMessage& message, ServerBitmap* bitmap,
const BPoint& offsetFromCursor); const BPoint& offsetFromCursor);
// the message should be delivered on the next // the message should be delivered on the next
@@ -127,7 +125,6 @@ class EventDispatcher : public BLocker {
thread_id fCursorThread; thread_id fCursorThread;
EventTarget* fPreviousMouseTarget; EventTarget* fPreviousMouseTarget;
int32 fPreviousViewToken;
EventTarget* fFocus; EventTarget* fFocus;
bool fSuspendFocus; bool fSuspendFocus;
+1 -1
View File
@@ -273,7 +273,7 @@ ServerApp::_HasWindowUnderMouse()
for (int32 i = fWindowList.CountItems(); i-- > 0;) { for (int32 i = fWindowList.CountItems(); i-- > 0;) {
ServerWindow* window = fWindowList.ItemAt(i); ServerWindow* window = fWindowList.ItemAt(i);
if (fDesktop->EventDispatcher().ViewUnderMouse(window->EventTarget()) != B_NULL_TOKEN) if (fDesktop->ViewUnderMouse(window->Window()) != B_NULL_TOKEN)
return true; return true;
} }
+1 -5
View File
@@ -1246,12 +1246,8 @@ ServerWindow::_DispatchViewMessage(int32 code,
if (fWindowLayer->IsFocus()) { if (fWindowLayer->IsFocus()) {
// The cursor might need to be updated now // The cursor might need to be updated now
fDesktop->UnlockSingleWindow(); if (fDesktop->ViewUnderMouse(fWindowLayer) == fCurrentLayer->Token())
if (fDesktop->EventDispatcher().ViewUnderMouse(fEventTarget) == fCurrentLayer->Token())
fServerApp->SetCurrentCursor(cursor); fServerApp->SetCurrentCursor(cursor);
fDesktop->LockSingleWindow();
} }
break; break;
} }