From 1e766d4688da9cbaea73b0f10564fb0b3d708806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 10 Mar 2006 13:03:41 +0000 Subject: [PATCH] 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 --- src/servers/app/Desktop.cpp | 26 ++++++++++++++++++++++++-- src/servers/app/Desktop.h | 6 ++++++ src/servers/app/EventDispatcher.cpp | 25 +++++-------------------- src/servers/app/EventDispatcher.h | 3 --- src/servers/app/ServerApp.cpp | 2 +- src/servers/app/ServerWindow.cpp | 6 +----- 6 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 7eb05eb054..8cc7559845 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -240,11 +240,15 @@ MouseFilter::Filter(BMessage* message, EventTarget** _target, int32* _viewToken, break; } - if (*_viewToken != B_NULL_TOKEN) + if (*_viewToken != B_NULL_TOKEN) { + fDesktop->SetViewUnderMouse(window, *_viewToken); *_target = &window->EventTarget(); - else + } else { + fDesktop->SetViewUnderMouse(NULL, B_NULL_TOKEN); *_target = NULL; + } } else { + fDesktop->SetViewUnderMouse(NULL, B_NULL_TOKEN); fDesktop->SetCursor(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 * Desktop::FindWindowLayerByClientToken(int32 token, team_id teamID) { diff --git a/src/servers/app/Desktop.h b/src/servers/app/Desktop.h index 72d1e3e1e3..9a331f7647 100644 --- a/src/servers/app/Desktop.h +++ b/src/servers/app/Desktop.h @@ -134,6 +134,9 @@ class Desktop : public MessageLooper, public ScreenOwner { WindowLayer* MouseEventWindow() const { return fMouseEventWindow; } void SetMouseEventWindow(WindowLayer* window); + void SetViewUnderMouse(const WindowLayer* window, int32 viewToken); + int32 ViewUnderMouse(const WindowLayer* window); + void SetFocusWindow(WindowLayer* window); WindowLayer* FindWindowLayerByClientToken(int32 token, team_id teamID); @@ -241,6 +244,9 @@ class Desktop : public MessageLooper, public ScreenOwner { bool fFocusFollowsMouse; WindowLayer* fMouseEventWindow; + const WindowLayer* fWindowUnderMouse; + int32 fViewUnderMouse; + WindowLayer* fFocus; WindowLayer* fFront; WindowLayer* fBack; diff --git a/src/servers/app/EventDispatcher.cpp b/src/servers/app/EventDispatcher.cpp index e3192e52b3..5826bbdb9d 100644 --- a/src/servers/app/EventDispatcher.cpp +++ b/src/servers/app/EventDispatcher.cpp @@ -219,7 +219,6 @@ EventDispatcher::EventDispatcher() fThread(-1), fCursorThread(-1), fPreviousMouseTarget(NULL), - fPreviousViewToken(B_NULL_TOKEN), fFocus(NULL), fSuspendFocus(false), 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 EventDispatcher::SetDragMessage(BMessage& message, - ServerBitmap* bitmap, - const BPoint& offsetFromCursor) + ServerBitmap* bitmap, const BPoint& offsetFromCursor) { -// printf("EventDispatcher::SetDragMessage()\n"); + ETRACE(("EventDispatcher::SetDragMessage()\n")); if (fDragBitmap != bitmap) { if (fDragBitmap) @@ -541,10 +527,10 @@ EventDispatcher::SetDragMessage(BMessage& message, BAutolock _(this); fDragMessage = message; - fDraggingMessage = true; } + // #pragma mark - Message methods @@ -641,9 +627,9 @@ EventDispatcher::_UnsetFeedFocus(BMessage* message) void EventDispatcher::_DeliverDragMessage() { -// printf("EventDispatcher::_DeliverDragMessage()\n"); + ETRACE(("EventDispatcher::_DeliverDragMessage()\n")); - if (fDraggingMessage && fPreviousMouseTarget) { + if (fDraggingMessage && fPreviousMouseTarget != NULL) { fDragMessage.RemoveName("_original_what"); fDragMessage.AddInt32("_original_what", fDragMessage.what); fDragMessage.what = _MESSAGE_DROPPED_; @@ -777,7 +763,6 @@ EventDispatcher::_EventLoop() } current = fPreviousMouseTarget = mouseTarget; - fPreviousViewToken = viewToken; if (current != NULL) { int32 focusView = viewToken; diff --git a/src/servers/app/EventDispatcher.h b/src/servers/app/EventDispatcher.h index cc7616d773..4f1c37c272 100644 --- a/src/servers/app/EventDispatcher.h +++ b/src/servers/app/EventDispatcher.h @@ -85,8 +85,6 @@ class EventDispatcher : public BLocker { bool HasCursorThread(); void SetHWInterface(HWInterface* interface); - int32 ViewUnderMouse(EventTarget& target); - void SetDragMessage(BMessage& message, ServerBitmap* bitmap, const BPoint& offsetFromCursor); // the message should be delivered on the next @@ -127,7 +125,6 @@ class EventDispatcher : public BLocker { thread_id fCursorThread; EventTarget* fPreviousMouseTarget; - int32 fPreviousViewToken; EventTarget* fFocus; bool fSuspendFocus; diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 9767f2d2ce..cc61d9f67b 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -273,7 +273,7 @@ ServerApp::_HasWindowUnderMouse() for (int32 i = fWindowList.CountItems(); i-- > 0;) { ServerWindow* window = fWindowList.ItemAt(i); - if (fDesktop->EventDispatcher().ViewUnderMouse(window->EventTarget()) != B_NULL_TOKEN) + if (fDesktop->ViewUnderMouse(window->Window()) != B_NULL_TOKEN) return true; } diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 268a84b239..2fc6bdba33 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -1246,12 +1246,8 @@ ServerWindow::_DispatchViewMessage(int32 code, if (fWindowLayer->IsFocus()) { // The cursor might need to be updated now - fDesktop->UnlockSingleWindow(); - - if (fDesktop->EventDispatcher().ViewUnderMouse(fEventTarget) == fCurrentLayer->Token()) + if (fDesktop->ViewUnderMouse(fWindowLayer) == fCurrentLayer->Token()) fServerApp->SetCurrentCursor(cursor); - - fDesktop->LockSingleWindow(); } break; }