diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index c65c510b1b..35b21220e1 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -361,6 +361,13 @@ Desktop::Init() // TODO: temporary workaround, fActiveScreen will be removed fActiveScreen = fVirtualScreen.ScreenAt(0); + SetCursor(NULL); + // this will set the default cursor + + fVirtualScreen.HWInterface()->MoveCursorTo(fVirtualScreen.Frame().Width() / 2, + fVirtualScreen.Frame().Height() / 2); + fVirtualScreen.HWInterface()->SetCursorVisible(true); + #if TEST_MODE gInputManager->AddStream(new InputServerStream); #endif @@ -370,13 +377,6 @@ Desktop::Init() fEventDispatcher.SetMouseFilter(new MouseFilter(this)); fEventDispatcher.SetKeyboardFilter(new KeyboardFilter(this)); - SetCursor(NULL); - // this will set the default cursor - - fVirtualScreen.HWInterface()->MoveCursorTo(fVirtualScreen.Frame().Width() / 2, - fVirtualScreen.Frame().Height() / 2); - fVirtualScreen.HWInterface()->SetCursorVisible(true); - // draw the background fScreenRegion = fVirtualScreen.Frame(); @@ -1083,7 +1083,7 @@ Desktop::_SendFakeMouseMoved(WindowLayer* window) EventDispatcher().GetMouse(where, buttons); int32 viewToken = B_NULL_TOKEN; - BMessenger target; + EventTarget* target = NULL; LockAllWindows(); @@ -1095,6 +1095,9 @@ Desktop::_SendFakeMouseMoved(WindowLayer* window) if (window != NULL) { BMessage message; window->MouseMoved(&message, where, &viewToken, true); + + if (viewToken != B_NULL_TOKEN) + target = &window->EventTarget(); } if (viewToken != B_NULL_TOKEN) @@ -1106,8 +1109,8 @@ Desktop::_SendFakeMouseMoved(WindowLayer* window) UnlockAllWindows(); - if (viewToken != B_NULL_TOKEN) - EventDispatcher().SendFakeMouseMoved(target, viewToken); + if (target != NULL) + EventDispatcher().SendFakeMouseMoved(*target, viewToken); } diff --git a/src/servers/app/EventDispatcher.cpp b/src/servers/app/EventDispatcher.cpp index 7e64142486..21cb0f3158 100644 --- a/src/servers/app/EventDispatcher.cpp +++ b/src/servers/app/EventDispatcher.cpp @@ -486,14 +486,13 @@ EventDispatcher::GetMouse(BPoint& where, int32& buttons) void -EventDispatcher::SendFakeMouseMoved(BMessenger& target, int32 viewToken) +EventDispatcher::SendFakeMouseMoved(EventTarget& target, int32 viewToken) { BAutolock _(this); BMessage moved(B_MOUSE_MOVED); moved.AddPoint("screen_where", fLastCursorPosition); moved.AddInt32("buttons", fLastButtons); - moved.AddInt32("_view_token", viewToken); if (fDraggingMessage) { /* moved.AddInt32("_msg_data", ); @@ -502,7 +501,20 @@ EventDispatcher::SendFakeMouseMoved(BMessenger& target, int32 viewToken) moved.AddMessage("be:drag_message", &fDragMessage); } - _SendMessage(target, &moved, kMouseTransitImportance); + if (fPreviousMouseTarget != NULL + && fPreviousMouseTarget != &target) { + _AddTokens(&moved, fPreviousMouseTarget, B_POINTER_EVENTS); + _SendMessage(fPreviousMouseTarget->Messenger(), &moved, + kMouseTransitImportance); + + _RemoveTokens(&moved); + } + + moved.AddInt32("_view_token", viewToken); + // this only belongs to the new target + + _SendMessage(target.Messenger(), &moved, kMouseTransitImportance); + fPreviousMouseTarget = ⌖ } @@ -523,6 +535,10 @@ EventDispatcher::SetHWInterface(HWInterface* interface) BAutolock _(fCursorLock); fHWInterface = interface; + + // adopt the cursor position of the new HW interface + if (interface != NULL) + fLastCursorPosition = interface->CursorPosition(); } diff --git a/src/servers/app/EventDispatcher.h b/src/servers/app/EventDispatcher.h index 0184194e13..0c45016bbf 100644 --- a/src/servers/app/EventDispatcher.h +++ b/src/servers/app/EventDispatcher.h @@ -81,7 +81,7 @@ class EventDispatcher : public BLocker { void SetKeyboardFilter(EventFilter* filter); void GetMouse(BPoint& where, int32& buttons); - void SendFakeMouseMoved(BMessenger& target, int32 viewToken); + void SendFakeMouseMoved(EventTarget& target, int32 viewToken); bool HasCursorThread(); void SetHWInterface(HWInterface* interface);