From 15918e4fa5bcbea5fc7ed8c77b7858374621308f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 30 Nov 2005 10:45:01 +0000 Subject: [PATCH] * new windows now get a fake B_MOUSE_MOVED message in case they are opened directly under the mouse cursor. * Added Desktop::ShowWindow() and HideWindow(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15238 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/Desktop.cpp | 38 +++++++++++++++++++++++++++++ src/servers/app/Desktop.h | 3 +++ src/servers/app/EventDispatcher.cpp | 16 +++++++++++- src/servers/app/EventDispatcher.h | 1 + src/servers/app/RootLayer.cpp | 2 +- src/servers/app/ServerWindow.cpp | 12 ++++----- 6 files changed, 64 insertions(+), 8 deletions(-) diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index c425bed0d6..5dd1e69aa1 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -601,6 +601,44 @@ Desktop::SendBehindWindow(WindowLayer* windowLayer, WindowLayer* front) } +void +Desktop::ShowWindow(WindowLayer* window) +{ + if (!window->IsHidden()) + return; + + fRootLayer->ShowWindowLayer(window); + + // If the mouse cursor is directly over the newly visible window, + // we'll send a fake mouse moved message to the window, so that + // it knows the mouse is over it. + + BPoint where; + int32 buttons; + EventDispatcher().GetMouse(where, buttons); + + int32 viewToken = B_NULL_TOKEN; + + fRootLayer->Lock(); + if (fRootLayer->WindowAt(where) == window) { + Layer* layer = window->LayerAt(where); + if (layer != NULL && layer != window) + viewToken = layer->ViewToken(); + } + fRootLayer->Unlock(); + + if (viewToken != B_NULL_TOKEN) + EventDispatcher().SendFakeMouseMoved(window->Window()->EventTarget(), viewToken); +} + + +void +Desktop::HideWindow(WindowLayer* window) +{ + fRootLayer->HideWindowLayer(window); +} + + void Desktop::SetWindowWorkspaces(WindowLayer* windowLayer, uint32 workspaces) { diff --git a/src/servers/app/Desktop.h b/src/servers/app/Desktop.h index 6744570f31..48bd13d703 100644 --- a/src/servers/app/Desktop.h +++ b/src/servers/app/Desktop.h @@ -89,6 +89,9 @@ class Desktop : public MessageLooper, public ScreenOwner { void ActivateWindow(WindowLayer* window); void SendBehindWindow(WindowLayer* window, WindowLayer* front); + void ShowWindow(WindowLayer* window); + void HideWindow(WindowLayer* window); + void SetWindowWorkspaces(WindowLayer* window, uint32 workspaces); void AddWindowLayer(WindowLayer *windowLayer); diff --git a/src/servers/app/EventDispatcher.cpp b/src/servers/app/EventDispatcher.cpp index 5a91f4afbe..c05b4d92da 100644 --- a/src/servers/app/EventDispatcher.cpp +++ b/src/servers/app/EventDispatcher.cpp @@ -453,13 +453,27 @@ EventDispatcher::SetKeyboardFilter(EventFilter* filter) void EventDispatcher::GetMouse(BPoint& where, int32& buttons) { - //BAutolock _(this); + BAutolock _(this); where = fLastCursorPosition; buttons = fLastButtons; } +void +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); + + _SendMessage(target.Messenger(), &moved, kMouseTransitImportance); +} + + bool EventDispatcher::HasCursorThread() { diff --git a/src/servers/app/EventDispatcher.h b/src/servers/app/EventDispatcher.h index c0d78f97b4..678d1b33e9 100644 --- a/src/servers/app/EventDispatcher.h +++ b/src/servers/app/EventDispatcher.h @@ -78,6 +78,7 @@ class EventDispatcher : public BLocker { void SetKeyboardFilter(EventFilter* filter); void GetMouse(BPoint& where, int32& buttons); + void SendFakeMouseMoved(EventTarget& target, int32 viewToken); bool HasCursorThread(); void SetHWInterface(HWInterface* interface); diff --git a/src/servers/app/RootLayer.cpp b/src/servers/app/RootLayer.cpp index 69abfc8f55..033d668c87 100644 --- a/src/servers/app/RootLayer.cpp +++ b/src/servers/app/RootLayer.cpp @@ -41,7 +41,7 @@ static const float kGoldenProportion = (sqrtf(5.0) - 1.0) / 2.0; #endif -#define DEBUG_ROOT_LAYER +//#define DEBUG_ROOT_LAYER #define APPSERVER_ROOTLAYER_SHOW_WORKSPACE_NUMBER #ifdef DEBUG_ROOT_LAYER diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 871191ac66..3801f98585 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -295,9 +295,9 @@ ServerWindow::Show() if (fQuitting || !fWindowLayer->IsHidden()) return; - RootLayer* rootLayer = fWindowLayer->GetRootLayer(); - if (rootLayer) - rootLayer->ShowWindowLayer(fWindowLayer); + // TODO: that check is just there for offscreen-windows - this should be made better + if (fWindowLayer->GetRootLayer() != NULL) + fDesktop->ShowWindow(fWindowLayer); if (fDirectWindowData != NULL) HandleDirectConnection(B_DIRECT_START | B_BUFFER_RESET); @@ -317,9 +317,9 @@ ServerWindow::Hide() if (fDirectWindowData != NULL) HandleDirectConnection(B_DIRECT_STOP); - RootLayer* rootLayer = fWindowLayer->GetRootLayer(); - if (rootLayer) - rootLayer->HideWindowLayer(fWindowLayer); + // TODO: that check is just there for offscreen-windows - this should be made better + if (fWindowLayer->GetRootLayer() != NULL) + fDesktop->HideWindow(fWindowLayer); }