From 22812ba24ffdc5c1a1f30257bc01ce9b4b211d47 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 5 May 2012 14:43:41 -0400 Subject: [PATCH] Fix ticket #8497. - Rework Deskbar's handling for the autoraise/autohide cases to not need event masks. This prevents various problems that would occur if one happened to be working in another window that overlapped part of Deskbar, as reported in #8497. Instead, we now use a message filter to redirect the messages as needed. --- src/apps/deskbar/BarApp.cpp | 1 - src/apps/deskbar/BarView.cpp | 92 ++++++++++++++++++++++++++-------- src/apps/deskbar/BarView.h | 1 - src/apps/deskbar/BarWindow.cpp | 23 +++++---- src/apps/deskbar/BarWindow.h | 3 ++ 5 files changed, 86 insertions(+), 34 deletions(-) diff --git a/src/apps/deskbar/BarApp.cpp b/src/apps/deskbar/BarApp.cpp index a12cf60d8f..91f2ce88af 100644 --- a/src/apps/deskbar/BarApp.cpp +++ b/src/apps/deskbar/BarApp.cpp @@ -509,7 +509,6 @@ TBarApp::MessageReceived(BMessage* message) fSettings.autoHide = !fSettings.autoHide; fBarWindow->Lock(); - fBarView->UpdateEventMask(); fBarView->HideDeskbar(fSettings.autoHide); fBarWindow->Unlock(); break; diff --git a/src/apps/deskbar/BarView.cpp b/src/apps/deskbar/BarView.cpp index 4e5e49919f..823860dbdb 100644 --- a/src/apps/deskbar/BarView.cpp +++ b/src/apps/deskbar/BarView.cpp @@ -70,6 +70,65 @@ const int32 kDefaultRecentAppCount = 10; const int32 kMenuTrackMargin = 20; +class BarViewMessageFilter : public BMessageFilter +{ + public: + BarViewMessageFilter(TBarView* barView); + virtual ~BarViewMessageFilter(); + + virtual filter_result Filter(BMessage* message, BHandler** target); + + private: + TBarView* fBarView; +}; + + +BarViewMessageFilter::BarViewMessageFilter(TBarView* barView) + : + BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE), + fBarView(barView) +{ +} + + +BarViewMessageFilter::~BarViewMessageFilter() +{ +} + + +filter_result +BarViewMessageFilter::Filter(BMessage* message, BHandler** target) +{ + if (message->what == B_MOUSE_DOWN || message->what == B_MOUSE_MOVED) { + BPoint where = message->FindPoint("be:view_where"); + uint32 transit = message->FindInt32("be:transit"); + BMessage *dragMessage = NULL; + if (message->HasMessage("be:drag_message")) { + dragMessage = new BMessage(); + message->FindMessage("be:drag_message", dragMessage); + } + switch (message->what) + { + case B_MOUSE_DOWN: + { + fBarView->MouseDown(where); + } + break; + + case B_MOUSE_MOVED: + { + fBarView->MouseMoved(where, transit, dragMessage); + } + break; + } + + delete dragMessage; + } + + return B_DISPATCH_MESSAGE; +} + + TBarView::TBarView(BRect frame, bool vertical, bool left, bool top, uint32 state, float) : BView(frame, "BarView", B_FOLLOW_ALL_SIDES, B_WILL_DRAW), @@ -112,7 +171,8 @@ TBarView::AttachedToWindow() SetViewColor(ui_color(B_MENU_BACKGROUND_COLOR)); SetFont(be_plain_font); - UpdateEventMask(); + Window()->AddCommonFilter(new BarViewMessageFilter(this)); + UpdatePlacement(); fTrackingHookData.fTrackingHook = MenuTrackingHook; @@ -185,9 +245,6 @@ TBarView::MessageReceived(BMessage* message) void TBarView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage) { - if (Window() == NULL || EventMask() == 0) - return; - desk_settings* settings = ((TBarApp*)be_app)->Settings(); bool alwaysOnTop = settings->alwaysOnTop; bool autoRaise = settings->autoRaise; @@ -209,12 +266,18 @@ TBarView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage) && Window()->Frame().Contains(where)) { // cursor is on a screen edge within the window frame - if (!alwaysOnTop && autoRaise && !isTopMost) + if (!alwaysOnTop && autoRaise && !isTopMost) { RaiseDeskbar(true); + SetEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY); + } if (autoHide && IsHidden()) HideDeskbar(false); } else { + TBarWindow* window = (TBarWindow*)Window(); + if (window->IsShowingMenu()) + return; + // cursor is not on screen edge BRect preventHideArea = Window()->Frame().InsetByCopy( -kMaxPreventHidingDist, -kMaxPreventHidingDist); @@ -223,8 +286,10 @@ TBarView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage) return; // cursor to bar distance above threshold - if (!alwaysOnTop && autoRaise && isTopMost) + if (!alwaysOnTop && autoRaise && isTopMost) { RaiseDeskbar(false); + SetEventMask(0); + } if (autoHide && !IsHidden()) HideDeskbar(true); @@ -512,21 +577,6 @@ TBarView::SaveSettings() } -void -TBarView::UpdateEventMask() -{ - SetEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY); - -#if 0 - desk_settings* settings = ((TBarApp*)be_app)->Settings(); - if (settings->autoRaise || settings->autoHide) - SetEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY); - else - SetEventMask(0); -#endif -} - - void TBarView::UpdatePlacement() { diff --git a/src/apps/deskbar/BarView.h b/src/apps/deskbar/BarView.h index 71da63b39c..293bed7ea5 100644 --- a/src/apps/deskbar/BarView.h +++ b/src/apps/deskbar/BarView.h @@ -89,7 +89,6 @@ class TBarView : public BView { virtual void MouseDown(BPoint where); void SaveSettings(); - void UpdateEventMask(); void UpdatePlacement(); void ChangeState(int32 state, bool vertical, bool left, bool top); void RaiseDeskbar(bool raise); diff --git a/src/apps/deskbar/BarWindow.cpp b/src/apps/deskbar/BarWindow.cpp index 0b05dbbaf4..b691f06ae9 100644 --- a/src/apps/deskbar/BarWindow.cpp +++ b/src/apps/deskbar/BarWindow.cpp @@ -90,7 +90,8 @@ TBarWindow::TBarWindow() B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE | B_NOT_MINIMIZABLE | B_NOT_MOVABLE | B_NOT_RESIZABLE | B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS, - B_ALL_WORKSPACES) + B_ALL_WORKSPACES), + fShowingMenu(false) { desk_settings* settings = ((TBarApp*)be_app)->Settings(); if (settings->alwaysOnTop) @@ -139,13 +140,7 @@ TBarWindow::MenusBeginning() sDeskbarMenu->NeedsToRebuild(); sDeskbarMenu->ResetTargets(); - fBarView->SetEventMask(0); - // This works around a BeOS bug - the menu is quit with every - // B_MOUSE_DOWN the window receives. - // - // Is this bug still here? I commented this line out and didn't - // notice anything different - + fShowingMenu = true; BWindow::MenusBeginning(); } @@ -153,6 +148,7 @@ TBarWindow::MenusBeginning() void TBarWindow::MenusEnded() { + fShowingMenu = false; BWindow::MenusEnded(); if (sDeskbarMenu->LockLooper()) { @@ -160,8 +156,6 @@ TBarWindow::MenusEnded() sDeskbarMenu->RemoveItems(0, sDeskbarMenu->CountItems(), true); sDeskbarMenu->UnlockLooper(); } - - fBarView->UpdateEventMask(); } @@ -520,7 +514,7 @@ TBarWindow::CountItems(BMessage* message) void TBarWindow::AddItem(BMessage* message) { - DeskbarShelf shelf = B_DESKBAR_TRAY; + DeskbarShelf shelf = B_DESKBAR_TRAY; entry_ref ref; int32 id = 999; BMessage reply; @@ -596,6 +590,13 @@ TBarWindow::GetIconFrame(BMessage* message) } +bool +TBarWindow::IsShowingMenu() const +{ + return fShowingMenu; +} + + bool TBarWindow::_IsFocusMessage(BMessage* message) { diff --git a/src/apps/deskbar/BarWindow.h b/src/apps/deskbar/BarWindow.h index 170b40cbb6..85ea6fd1fb 100644 --- a/src/apps/deskbar/BarWindow.h +++ b/src/apps/deskbar/BarWindow.h @@ -83,12 +83,15 @@ public: void GetIconFrame(BMessage* message); + bool IsShowingMenu() const; + private: bool _IsFocusMessage(BMessage* message); private: static TDeskbarMenu* sDeskbarMenu; TBarView* fBarView; + bool fShowingMenu; };