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.
This commit is contained in:
@@ -509,7 +509,6 @@ TBarApp::MessageReceived(BMessage* message)
|
|||||||
fSettings.autoHide = !fSettings.autoHide;
|
fSettings.autoHide = !fSettings.autoHide;
|
||||||
|
|
||||||
fBarWindow->Lock();
|
fBarWindow->Lock();
|
||||||
fBarView->UpdateEventMask();
|
|
||||||
fBarView->HideDeskbar(fSettings.autoHide);
|
fBarView->HideDeskbar(fSettings.autoHide);
|
||||||
fBarWindow->Unlock();
|
fBarWindow->Unlock();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -70,6 +70,65 @@ const int32 kDefaultRecentAppCount = 10;
|
|||||||
const int32 kMenuTrackMargin = 20;
|
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,
|
TBarView::TBarView(BRect frame, bool vertical, bool left, bool top,
|
||||||
uint32 state, float)
|
uint32 state, float)
|
||||||
: BView(frame, "BarView", B_FOLLOW_ALL_SIDES, B_WILL_DRAW),
|
: BView(frame, "BarView", B_FOLLOW_ALL_SIDES, B_WILL_DRAW),
|
||||||
@@ -112,7 +171,8 @@ TBarView::AttachedToWindow()
|
|||||||
SetViewColor(ui_color(B_MENU_BACKGROUND_COLOR));
|
SetViewColor(ui_color(B_MENU_BACKGROUND_COLOR));
|
||||||
SetFont(be_plain_font);
|
SetFont(be_plain_font);
|
||||||
|
|
||||||
UpdateEventMask();
|
Window()->AddCommonFilter(new BarViewMessageFilter(this));
|
||||||
|
|
||||||
UpdatePlacement();
|
UpdatePlacement();
|
||||||
|
|
||||||
fTrackingHookData.fTrackingHook = MenuTrackingHook;
|
fTrackingHookData.fTrackingHook = MenuTrackingHook;
|
||||||
@@ -185,9 +245,6 @@ TBarView::MessageReceived(BMessage* message)
|
|||||||
void
|
void
|
||||||
TBarView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage)
|
TBarView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage)
|
||||||
{
|
{
|
||||||
if (Window() == NULL || EventMask() == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
desk_settings* settings = ((TBarApp*)be_app)->Settings();
|
desk_settings* settings = ((TBarApp*)be_app)->Settings();
|
||||||
bool alwaysOnTop = settings->alwaysOnTop;
|
bool alwaysOnTop = settings->alwaysOnTop;
|
||||||
bool autoRaise = settings->autoRaise;
|
bool autoRaise = settings->autoRaise;
|
||||||
@@ -209,12 +266,18 @@ TBarView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage)
|
|||||||
&& Window()->Frame().Contains(where)) {
|
&& Window()->Frame().Contains(where)) {
|
||||||
// cursor is on a screen edge within the window frame
|
// cursor is on a screen edge within the window frame
|
||||||
|
|
||||||
if (!alwaysOnTop && autoRaise && !isTopMost)
|
if (!alwaysOnTop && autoRaise && !isTopMost) {
|
||||||
RaiseDeskbar(true);
|
RaiseDeskbar(true);
|
||||||
|
SetEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY);
|
||||||
|
}
|
||||||
|
|
||||||
if (autoHide && IsHidden())
|
if (autoHide && IsHidden())
|
||||||
HideDeskbar(false);
|
HideDeskbar(false);
|
||||||
} else {
|
} else {
|
||||||
|
TBarWindow* window = (TBarWindow*)Window();
|
||||||
|
if (window->IsShowingMenu())
|
||||||
|
return;
|
||||||
|
|
||||||
// cursor is not on screen edge
|
// cursor is not on screen edge
|
||||||
BRect preventHideArea = Window()->Frame().InsetByCopy(
|
BRect preventHideArea = Window()->Frame().InsetByCopy(
|
||||||
-kMaxPreventHidingDist, -kMaxPreventHidingDist);
|
-kMaxPreventHidingDist, -kMaxPreventHidingDist);
|
||||||
@@ -223,8 +286,10 @@ TBarView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// cursor to bar distance above threshold
|
// cursor to bar distance above threshold
|
||||||
if (!alwaysOnTop && autoRaise && isTopMost)
|
if (!alwaysOnTop && autoRaise && isTopMost) {
|
||||||
RaiseDeskbar(false);
|
RaiseDeskbar(false);
|
||||||
|
SetEventMask(0);
|
||||||
|
}
|
||||||
|
|
||||||
if (autoHide && !IsHidden())
|
if (autoHide && !IsHidden())
|
||||||
HideDeskbar(true);
|
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
|
void
|
||||||
TBarView::UpdatePlacement()
|
TBarView::UpdatePlacement()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -89,7 +89,6 @@ class TBarView : public BView {
|
|||||||
virtual void MouseDown(BPoint where);
|
virtual void MouseDown(BPoint where);
|
||||||
|
|
||||||
void SaveSettings();
|
void SaveSettings();
|
||||||
void UpdateEventMask();
|
|
||||||
void UpdatePlacement();
|
void UpdatePlacement();
|
||||||
void ChangeState(int32 state, bool vertical, bool left, bool top);
|
void ChangeState(int32 state, bool vertical, bool left, bool top);
|
||||||
void RaiseDeskbar(bool raise);
|
void RaiseDeskbar(bool raise);
|
||||||
|
|||||||
@@ -90,7 +90,8 @@ TBarWindow::TBarWindow()
|
|||||||
B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
|
B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
|
||||||
| B_NOT_MINIMIZABLE | B_NOT_MOVABLE | B_NOT_RESIZABLE
|
| B_NOT_MINIMIZABLE | B_NOT_MOVABLE | B_NOT_RESIZABLE
|
||||||
| B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS,
|
| B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS,
|
||||||
B_ALL_WORKSPACES)
|
B_ALL_WORKSPACES),
|
||||||
|
fShowingMenu(false)
|
||||||
{
|
{
|
||||||
desk_settings* settings = ((TBarApp*)be_app)->Settings();
|
desk_settings* settings = ((TBarApp*)be_app)->Settings();
|
||||||
if (settings->alwaysOnTop)
|
if (settings->alwaysOnTop)
|
||||||
@@ -139,13 +140,7 @@ TBarWindow::MenusBeginning()
|
|||||||
sDeskbarMenu->NeedsToRebuild();
|
sDeskbarMenu->NeedsToRebuild();
|
||||||
sDeskbarMenu->ResetTargets();
|
sDeskbarMenu->ResetTargets();
|
||||||
|
|
||||||
fBarView->SetEventMask(0);
|
fShowingMenu = true;
|
||||||
// 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
|
|
||||||
|
|
||||||
BWindow::MenusBeginning();
|
BWindow::MenusBeginning();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,6 +148,7 @@ TBarWindow::MenusBeginning()
|
|||||||
void
|
void
|
||||||
TBarWindow::MenusEnded()
|
TBarWindow::MenusEnded()
|
||||||
{
|
{
|
||||||
|
fShowingMenu = false;
|
||||||
BWindow::MenusEnded();
|
BWindow::MenusEnded();
|
||||||
|
|
||||||
if (sDeskbarMenu->LockLooper()) {
|
if (sDeskbarMenu->LockLooper()) {
|
||||||
@@ -160,8 +156,6 @@ TBarWindow::MenusEnded()
|
|||||||
sDeskbarMenu->RemoveItems(0, sDeskbarMenu->CountItems(), true);
|
sDeskbarMenu->RemoveItems(0, sDeskbarMenu->CountItems(), true);
|
||||||
sDeskbarMenu->UnlockLooper();
|
sDeskbarMenu->UnlockLooper();
|
||||||
}
|
}
|
||||||
|
|
||||||
fBarView->UpdateEventMask();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -596,6 +590,13 @@ TBarWindow::GetIconFrame(BMessage* message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
TBarWindow::IsShowingMenu() const
|
||||||
|
{
|
||||||
|
return fShowingMenu;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TBarWindow::_IsFocusMessage(BMessage* message)
|
TBarWindow::_IsFocusMessage(BMessage* message)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -83,12 +83,15 @@ public:
|
|||||||
|
|
||||||
void GetIconFrame(BMessage* message);
|
void GetIconFrame(BMessage* message);
|
||||||
|
|
||||||
|
bool IsShowingMenu() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _IsFocusMessage(BMessage* message);
|
bool _IsFocusMessage(BMessage* message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static TDeskbarMenu* sDeskbarMenu;
|
static TDeskbarMenu* sDeskbarMenu;
|
||||||
TBarView* fBarView;
|
TBarView* fBarView;
|
||||||
|
bool fShowingMenu;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user