From a8d44b6feabf366f4c686b4db9924fe498462ea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 23 Nov 2005 21:52:36 +0000 Subject: [PATCH] Quick fix for the broken focus changing I introduced earlier. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15096 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/Layer.cpp | 8 +- src/servers/app/Layer.h | 8 +- src/servers/app/RootLayer.cpp | 97 ++++++------------- src/servers/app/RootLayer.h | 2 - src/servers/app/WinBorder.cpp | 169 +++++++++++++++++----------------- src/servers/app/WinBorder.h | 6 +- 6 files changed, 123 insertions(+), 167 deletions(-) diff --git a/src/servers/app/Layer.cpp b/src/servers/app/Layer.cpp index 6d06a60015..1bf3ef39b6 100644 --- a/src/servers/app/Layer.cpp +++ b/src/servers/app/Layer.cpp @@ -833,25 +833,25 @@ Layer::CopyBits(BRect& src, BRect& dst, int32 xOffset, int32 yOffset) void -Layer::MouseDown(const BMessage *msg) +Layer::MouseDown(BMessage *msg, BPoint where) { } void -Layer::MouseUp(const BMessage *msg) +Layer::MouseUp(BMessage *msg, BPoint where) { } void -Layer::MouseMoved(const BMessage *msg) +Layer::MouseMoved(BMessage *msg, BPoint where) { } void -Layer::MouseWheelChanged(const BMessage *msg) +Layer::MouseWheelChanged(BMessage *msg, BPoint where) { } diff --git a/src/servers/app/Layer.h b/src/servers/app/Layer.h index da93ba5315..76c7cc7ac8 100644 --- a/src/servers/app/Layer.h +++ b/src/servers/app/Layer.h @@ -154,10 +154,10 @@ class Layer { int32 xOffset, int32 yOffset); // input handling - virtual void MouseDown(const BMessage *msg); - virtual void MouseUp(const BMessage *msg); - virtual void MouseMoved(const BMessage *msg); - virtual void MouseWheelChanged(const BMessage *msg); + virtual void MouseDown(BMessage *msg, BPoint where); + virtual void MouseUp(BMessage *msg, BPoint where); + virtual void MouseMoved(BMessage *msg, BPoint where); + virtual void MouseWheelChanged(BMessage *msg, BPoint where); virtual void WorkspaceActivated(int32 index, bool active); virtual void WorkspacesChanged(uint32 oldWorkspaces, uint32 newWorkspaces); diff --git a/src/servers/app/RootLayer.cpp b/src/servers/app/RootLayer.cpp index 751b139daa..85bd2f5e12 100644 --- a/src/servers/app/RootLayer.cpp +++ b/src/servers/app/RootLayer.cpp @@ -13,19 +13,11 @@ /** Class used for the top layer of each workspace's Layer tree */ -#include - -#include -#include -#include -//#include -#include -#include - #include "Decorator.h" #include "DrawingEngine.h" #include "HWInterface.h" #include "Layer.h" +#include "RootLayer.h" #include "ServerApp.h" #include "ServerConfig.h" #include "ServerProtocol.h" @@ -35,7 +27,13 @@ #include "Workspace.h" #include "WorkspacesLayer.h" -#include "RootLayer.h" +#include +#include +#include +#include +#include + +#include #if DISPLAY_HAIKU_LOGO #include "ServerBitmap.h" @@ -234,20 +232,15 @@ RootLayer::AddWinBorder(WinBorder* winBorder) // Subset modals also need to have a main window before appearing in workspace list. int32 feel = winBorder->Feel(); - if (feel != B_FLOATING_SUBSET_WINDOW_FEEL && feel != B_MODAL_SUBSET_WINDOW_FEEL) - { - uint32 wks = winBorder->Workspaces(); + if (feel != B_FLOATING_SUBSET_WINDOW_FEEL && feel != B_MODAL_SUBSET_WINDOW_FEEL) { + uint32 workspaces = winBorder->Workspaces(); // add to current workspace - if (wks == 0) - { + if (workspaces == 0) fWorkspace[fActiveWksIndex]->AddWinBorder(winBorder); - } - // add to desired workspaces - else - { - for (int32 i = 0; i < fWsCount; i++) - { - if (fWorkspace[i] && (wks & (0x00000001UL << i))) + else { + // add to desired workspaces + for (int32 i = 0; i < fWsCount; i++) { + if (fWorkspace[i] && (workspaces & (0x00000001UL << i))) fWorkspace[i]->AddWinBorder(winBorder); } } @@ -850,29 +843,6 @@ RootLayer::SetActive(WinBorder* newActive, bool activate) // #pragma mark - Input related methods -void -RootLayer::_ProcessMouseMovedEvent(BMessage *msg, BPoint where, Layer* target) -{ - // change focus in FFM mode - WinBorder* winBorderTarget = dynamic_cast(target); - if (winBorderTarget) { - DesktopSettings desktopSettings(fDesktop); - // TODO: Focus should be a RootLayer option/feature, NOT a Workspace one!!! - WinBorder* exFocus = Focus(); - if (desktopSettings.MouseMode() != B_NORMAL_MOUSE && exFocus != winBorderTarget) { - ActiveWorkspace()->AttemptToSetFocus(winBorderTarget); - // Workspace::SetFocus() *attempts* to set a new focus WinBorder, it may not succeed - if (exFocus != Focus()) { - // TODO: invalidate border area and send message to client for the widgets to light up - // What message? Is there a message on Focus change? - } - } - } - - target->MouseMoved(msg); -} - - void RootLayer::MouseEventHandler(BMessage *event) { @@ -882,30 +852,23 @@ RootLayer::MouseEventHandler(BMessage *event) Layer* layer = fMouseEventLayer; if (layer == NULL) { - if (fWMState.Focus != NULL) { - layer = fWMState.Focus->LayerAt(where); - if (layer != NULL) - event->AddInt32("_view_token", layer->ViewToken()); - } - if (layer == NULL) { - layer = LayerAt(where); - if (layer == NULL) - return; - } + layer = LayerAt(where, false); + if (layer == NULL) + return; } switch (event->what) { case B_MOUSE_DOWN: - layer->MouseDown(event); + layer->MouseDown(event, where); break; case B_MOUSE_UP: - layer->MouseUp(event); + layer->MouseUp(event, where); SetMouseEventLayer(NULL); break; case B_MOUSE_MOVED: - _ProcessMouseMovedEvent(event, where, layer); + layer->MouseMoved(event, where); break; } } @@ -961,15 +924,15 @@ RootLayer::show_winBorder(WinBorder *winBorder) for (int32 i = 0; i < fWsCount; i++) { invalid = false; - if (fWorkspace[i] && - (fWorkspace[i]->HasWinBorder(winBorder) || - // subset modals are a bit like floating windows, they are being added - // and removed from workspace when there's at least a normal window - // that uses them. - winBorder->Feel() == B_MODAL_SUBSET_WINDOW_FEEL || - // floating windows are inserted/removed on-the-fly so this window, - // although needed may not be in workspace's list. - winBorder->Level() == B_FLOATING_APP)) + if (fWorkspace[i] + && (fWorkspace[i]->HasWinBorder(winBorder) + || winBorder->Feel() == B_MODAL_SUBSET_WINDOW_FEEL + // subset modals are a bit like floating windows, they are being added + // and removed from workspace when there's at least a normal window + // that uses them. + || winBorder->Level() == B_FLOATING_APP)) + // floating windows are inserted/removed on-the-fly so this window, + // although needed may not be in workspace's list. { invalid = fWorkspace[i]->ShowWinBorder(winBorder); diff --git a/src/servers/app/RootLayer.h b/src/servers/app/RootLayer.h index a5eaaaba66..208b49a559 100644 --- a/src/servers/app/RootLayer.h +++ b/src/servers/app/RootLayer.h @@ -132,9 +132,7 @@ friend class Desktop; void change_winBorder_feel(WinBorder *winBorder, int32 newFeel); - // Input related methods void MouseEventHandler(BMessage *msg); - void _ProcessMouseMovedEvent(BMessage *msg, BPoint where, Layer* target); Desktop* fDesktop; BMessage* fDragMessage; diff --git a/src/servers/app/WinBorder.cpp b/src/servers/app/WinBorder.cpp index 648868bec2..cb273b322e 100644 --- a/src/servers/app/WinBorder.cpp +++ b/src/servers/app/WinBorder.cpp @@ -410,107 +410,93 @@ WinBorder::GetSizeLimits(float* minWidth, float* maxWidth, void -WinBorder::MouseDown(const BMessage *msg) +WinBorder::MouseDown(BMessage *msg, BPoint where) { - DesktopSettings desktopSettings(GetRootLayer()->GetDesktop()); - BPoint where(0, 0); + // default action is to drag the WinBorder + Layer *target = LayerAt(where); + if (target == this) { + // clicking WinBorder visible area - msg->FindPoint("where", &where); + click_type action = DEC_DRAG; - // not in FFM mode? - if (desktopSettings.MouseMode() == B_NORMAL_MOUSE) { - // default action is to drag the WinBorder - Layer *target = LayerAt(where); - if (target == this) { - // clicking WinBorder visible area - winBorderAreaHandle: + if (fDecorator) + action = _ActionFor(msg); - click_type action = DEC_DRAG; + // deactivate border buttons on first click(select) + if (GetRootLayer()->Focus() != this && action != DEC_MOVETOBACK + && action != DEC_RESIZE && action != DEC_SLIDETAB) + action = DEC_DRAG; - if (fDecorator) - action = _ActionFor(msg); + // set decorator internals + switch (action) { + case DEC_CLOSE: + fIsClosing = true; + fDecorator->SetClose(true); + STRACE_CLICK(("===> DEC_CLOSE\n")); + break; - // deactivate border buttons on first click(select) - if (GetRootLayer()->Focus() != this && action != DEC_MOVETOBACK - && action != DEC_RESIZE && action != DEC_SLIDETAB) - action = DEC_DRAG; + case DEC_ZOOM: + fIsZooming = true; + fDecorator->SetZoom(true); + STRACE_CLICK(("===> DEC_ZOOM\n")); + break; - // set decorator internals - switch (action) { - case DEC_CLOSE: - fIsClosing = true; - fDecorator->SetClose(true); - STRACE_CLICK(("===> DEC_CLOSE\n")); - break; - - case DEC_ZOOM: - fIsZooming = true; - fDecorator->SetZoom(true); - STRACE_CLICK(("===> DEC_ZOOM\n")); - break; - - case DEC_MINIMIZE: - fIsMinimizing = true; - fDecorator->SetMinimize(true); - STRACE_CLICK(("===> DEC_MINIMIZE\n")); - break; + case DEC_MINIMIZE: + fIsMinimizing = true; + fDecorator->SetMinimize(true); + STRACE_CLICK(("===> DEC_MINIMIZE\n")); + break; - case DEC_DRAG: - fIsDragging = true; - fLastMousePosition = where; - STRACE_CLICK(("===> DEC_DRAG\n")); - break; + case DEC_DRAG: + fIsDragging = true; + fLastMousePosition = where; + STRACE_CLICK(("===> DEC_DRAG\n")); + break; - case DEC_RESIZE: - fIsResizing = true; - fLastMousePosition = where; - STRACE_CLICK(("===> DEC_RESIZE\n")); - break; + case DEC_RESIZE: + fIsResizing = true; + fLastMousePosition = where; + STRACE_CLICK(("===> DEC_RESIZE\n")); + break; - case DEC_SLIDETAB: - fIsSlidingTab = true; - fLastMousePosition = where; - STRACE_CLICK(("===> DEC_SLIDETAB\n")); - break; + case DEC_SLIDETAB: + fIsSlidingTab = true; + fLastMousePosition = where; + STRACE_CLICK(("===> DEC_SLIDETAB\n")); + break; - default: - break; - } + default: + break; + } - // based on what the Decorator returned, properly place this window. - if (action == DEC_MOVETOBACK) { - GetRootLayer()->SetActive(this, false); - } else { - GetRootLayer()->SetMouseEventLayer(this); + // based on what the Decorator returned, properly place this window. + if (action == DEC_MOVETOBACK) { + GetRootLayer()->SetActive(this, false); + } else { + GetRootLayer()->SetMouseEventLayer(this); + GetRootLayer()->SetActive(this); + } + } else if (target != NULL) { + // clicking a simple Layer. + if (GetRootLayer()->ActiveWorkspace()->Active() != this) { + DesktopSettings desktopSettings(GetRootLayer()->GetDesktop()); + + // not in FFM mode? + if (desktopSettings.MouseMode() == B_NORMAL_MOUSE) GetRootLayer()->SetActive(this); - } - } else if (target != NULL) { - // clicking a simple Layer. - if (GetRootLayer()->ActiveWorkspace()->Active() == this) { - target->MouseDown(msg); - } else { - if (WindowFlags() & B_WILL_ACCEPT_FIRST_CLICK) - target->MouseDown(msg); - else - GetRootLayer()->SetActive(this); - } - } - } else { - // in FFM mode - Layer *target = LayerAt(where); - if (target == this) { - // clicking inside our visible area. - goto winBorderAreaHandle; - } else if (target != NULL) { - // clicking a simple Layer; forward event. - target->MouseDown(msg); + + if ((WindowFlags() & B_WILL_ACCEPT_FIRST_CLICK) == 0) + return; } + + msg->AddInt32("_view_token", target->ViewToken()); + target->MouseDown(msg, where); } } void -WinBorder::MouseUp(const BMessage *msg) +WinBorder::MouseUp(BMessage *msg, BPoint where) { bool invalidate = false; if (fDecorator) { @@ -552,12 +538,8 @@ WinBorder::MouseUp(const BMessage *msg) void -WinBorder::MouseMoved(const BMessage *msg) +WinBorder::MouseMoved(BMessage *msg, BPoint where) { - BPoint where(0,0); - - msg->FindPoint("where", &where); - if (fDecorator) { // TODO: present behavior is not fine! // Decorator's Set*() methods _actualy draw_! on screen, not @@ -586,6 +568,19 @@ WinBorder::MouseMoved(const BMessage *msg) } fLastMousePosition = where; + + // change focus in FFM mode + DesktopSettings desktopSettings(GetRootLayer()->GetDesktop()); + // TODO: Focus should be a RootLayer option/feature, NOT a Workspace one!!! + WinBorder* exFocus = GetRootLayer()->Focus(); + if (desktopSettings.MouseMode() != B_NORMAL_MOUSE && exFocus != this) { + GetRootLayer()->ActiveWorkspace()->AttemptToSetFocus(this); + // Workspace::SetFocus() *attempts* to set a new focus WinBorder, it may not succeed +// if (exFocus != Focus()) { + // TODO: invalidate border area and send message to client for the widgets to light up + // What message? Is there a message on Focus change? +// } + } } diff --git a/src/servers/app/WinBorder.h b/src/servers/app/WinBorder.h index d48557c886..08cf6629d2 100644 --- a/src/servers/app/WinBorder.h +++ b/src/servers/app/WinBorder.h @@ -81,9 +81,9 @@ class WinBorder : public Layer { float* minHeight, float* maxHeight) const; - virtual void MouseDown(const BMessage *msg); - virtual void MouseUp(const BMessage *msg); - virtual void MouseMoved(const BMessage *msg); + virtual void MouseDown(BMessage *msg, BPoint where); + virtual void MouseUp(BMessage *msg, BPoint where); + virtual void MouseMoved(BMessage *msg, BPoint where); // click_type ActionFor(const BMessage *msg) // { return _ActionFor(evt); }