* 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
This commit is contained in:
@@ -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
|
void
|
||||||
Desktop::SetWindowWorkspaces(WindowLayer* windowLayer, uint32 workspaces)
|
Desktop::SetWindowWorkspaces(WindowLayer* windowLayer, uint32 workspaces)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -89,6 +89,9 @@ class Desktop : public MessageLooper, public ScreenOwner {
|
|||||||
void ActivateWindow(WindowLayer* window);
|
void ActivateWindow(WindowLayer* window);
|
||||||
void SendBehindWindow(WindowLayer* window, WindowLayer* front);
|
void SendBehindWindow(WindowLayer* window, WindowLayer* front);
|
||||||
|
|
||||||
|
void ShowWindow(WindowLayer* window);
|
||||||
|
void HideWindow(WindowLayer* window);
|
||||||
|
|
||||||
void SetWindowWorkspaces(WindowLayer* window, uint32 workspaces);
|
void SetWindowWorkspaces(WindowLayer* window, uint32 workspaces);
|
||||||
|
|
||||||
void AddWindowLayer(WindowLayer *windowLayer);
|
void AddWindowLayer(WindowLayer *windowLayer);
|
||||||
|
|||||||
@@ -453,13 +453,27 @@ EventDispatcher::SetKeyboardFilter(EventFilter* filter)
|
|||||||
void
|
void
|
||||||
EventDispatcher::GetMouse(BPoint& where, int32& buttons)
|
EventDispatcher::GetMouse(BPoint& where, int32& buttons)
|
||||||
{
|
{
|
||||||
//BAutolock _(this);
|
BAutolock _(this);
|
||||||
|
|
||||||
where = fLastCursorPosition;
|
where = fLastCursorPosition;
|
||||||
buttons = fLastButtons;
|
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
|
bool
|
||||||
EventDispatcher::HasCursorThread()
|
EventDispatcher::HasCursorThread()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ class EventDispatcher : public BLocker {
|
|||||||
void SetKeyboardFilter(EventFilter* filter);
|
void SetKeyboardFilter(EventFilter* filter);
|
||||||
|
|
||||||
void GetMouse(BPoint& where, int32& buttons);
|
void GetMouse(BPoint& where, int32& buttons);
|
||||||
|
void SendFakeMouseMoved(EventTarget& target, int32 viewToken);
|
||||||
|
|
||||||
bool HasCursorThread();
|
bool HasCursorThread();
|
||||||
void SetHWInterface(HWInterface* interface);
|
void SetHWInterface(HWInterface* interface);
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
static const float kGoldenProportion = (sqrtf(5.0) - 1.0) / 2.0;
|
static const float kGoldenProportion = (sqrtf(5.0) - 1.0) / 2.0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DEBUG_ROOT_LAYER
|
//#define DEBUG_ROOT_LAYER
|
||||||
#define APPSERVER_ROOTLAYER_SHOW_WORKSPACE_NUMBER
|
#define APPSERVER_ROOTLAYER_SHOW_WORKSPACE_NUMBER
|
||||||
|
|
||||||
#ifdef DEBUG_ROOT_LAYER
|
#ifdef DEBUG_ROOT_LAYER
|
||||||
|
|||||||
@@ -295,9 +295,9 @@ ServerWindow::Show()
|
|||||||
if (fQuitting || !fWindowLayer->IsHidden())
|
if (fQuitting || !fWindowLayer->IsHidden())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
RootLayer* rootLayer = fWindowLayer->GetRootLayer();
|
// TODO: that check is just there for offscreen-windows - this should be made better
|
||||||
if (rootLayer)
|
if (fWindowLayer->GetRootLayer() != NULL)
|
||||||
rootLayer->ShowWindowLayer(fWindowLayer);
|
fDesktop->ShowWindow(fWindowLayer);
|
||||||
|
|
||||||
if (fDirectWindowData != NULL)
|
if (fDirectWindowData != NULL)
|
||||||
HandleDirectConnection(B_DIRECT_START | B_BUFFER_RESET);
|
HandleDirectConnection(B_DIRECT_START | B_BUFFER_RESET);
|
||||||
@@ -317,9 +317,9 @@ ServerWindow::Hide()
|
|||||||
if (fDirectWindowData != NULL)
|
if (fDirectWindowData != NULL)
|
||||||
HandleDirectConnection(B_DIRECT_STOP);
|
HandleDirectConnection(B_DIRECT_STOP);
|
||||||
|
|
||||||
RootLayer* rootLayer = fWindowLayer->GetRootLayer();
|
// TODO: that check is just there for offscreen-windows - this should be made better
|
||||||
if (rootLayer)
|
if (fWindowLayer->GetRootLayer() != NULL)
|
||||||
rootLayer->HideWindowLayer(fWindowLayer);
|
fDesktop->HideWindow(fWindowLayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user