* In normal mouse mode, the focus list is no longer used to find the

next window to get focus after the current one is gone. This fixes the
  strange behaviour when using right-click to send the current window to
  the back.
* When FFM is active, Desktop::SendWindowBehind() will now choose the 
  new focus window to be the one under the mouse, overriding the focus 
  list.
* Desktop::SendWindowBehind() will now also call _SendFakeMouseMoved()
  if necessary.
* Removed Desktop::fFocusFollowsMouse; it was not used or 
  maintained anywhere.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24269 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2008-03-06 12:55:41 +00:00
parent fee1aa056c
commit 6ec72e838c
3 changed files with 40 additions and 21 deletions

View File

@ -322,8 +322,6 @@ Desktop::Desktop(uid_t userID)
fWindowLock("window lock"),
fFocusFollowsMouse(false),
fMouseEventWindow(NULL),
fWindowUnderMouse(NULL),
fViewUnderMouse(B_NULL_TOKEN),
@ -1316,7 +1314,7 @@ Desktop::SetFocusWindow(WindowLayer* focus)
bool hasModal = _WindowHasModal(focus);
// TODO: test for FFM and B_LOCK_WINDOW_FOCUS
// TODO: test for B_LOCK_WINDOW_FOCUS
if (focus == fFocus && focus != NULL && !focus->IsHidden()
&& (focus->Flags() & B_AVOID_FOCUS) == 0 && !hasModal) {
@ -1325,8 +1323,22 @@ Desktop::SetFocusWindow(WindowLayer* focus)
return;
}
if (focus == NULL || hasModal)
focus = fFocusList.LastWindow();
uint32 list = fCurrentWorkspace;
if (fSettings->FocusFollowsMouse())
list = kFocusList;
if (focus == NULL || hasModal) {
if (!fSettings->FocusFollowsMouse()) {
focus = FrontWindow();
if (focus == NULL) {
// there might be no front window in case of only a single
// window with B_FLOATING_ALL_WINDOW_FEEL
focus = _CurrentWindows().LastWindow();
}
} else
focus = fFocusList.LastWindow();
}
// make sure no window is chosen that doesn't want focus or cannot have it
while (focus != NULL
@ -1334,7 +1346,7 @@ Desktop::SetFocusWindow(WindowLayer* focus)
|| (focus->Flags() & B_AVOID_FOCUS) != 0
|| _WindowHasModal(focus)
|| focus->IsHidden())) {
focus = focus->PreviousWindow(kFocusList);
focus = focus->PreviousWindow(list);
}
if (fFocus == focus) {
@ -1571,10 +1583,19 @@ Desktop::SendWindowBehind(WindowLayer* window, WindowLayer* behindOf)
MarkDirty(dirty);
_UpdateFronts();
SetFocusWindow();
SetFocusWindow(fSettings->FocusFollowsMouse() ?
WindowAt(fLastMousePosition) : NULL);
bool sendFakeMouseMoved = false;
if (FocusWindow() != window)
sendFakeMouseMoved = true;
_WindowChanged(window);
UnlockAllWindows();
if (sendFakeMouseMoved)
_SendFakeMouseMoved();
}

View File

@ -269,8 +269,6 @@ class Desktop : public MessageLooper, public ScreenOwner {
BRegion fBackgroundRegion;
BRegion fScreenRegion;
bool fFocusFollowsMouse;
WindowLayer* fMouseEventWindow;
const WindowLayer* fWindowUnderMouse;
int32 fViewUnderMouse;

View File

@ -128,7 +128,7 @@ WindowLayer::WindowLayer(const BRect& frame, const char *name,
fMinHeight(1),
fMaxHeight(32768)
{
// make sure our arguments are valid
// make sure our arguments are valid
if (!IsValidLook(fLook))
fLook = B_TITLED_WINDOW_LOOK;
if (!IsValidFeel(fFeel))
@ -432,7 +432,7 @@ WindowLayer::CopyContents(BRegion* region, int32 xOffset, int32 yOffset)
region->OffsetBy(-xOffset, -yOffset);
// the part which we can copy is not dirty
newDirty->Exclude(region);
fDrawingEngine->CopyRegion(region, xOffset, yOffset);
// move along the already dirty regions that are common
@ -485,22 +485,22 @@ void
WindowLayer::SetTopLayer(ViewLayer* topLayer)
{
fTopLayer = topLayer;
if (fTopLayer) {
// the top layer is special, it has a coordinate system
// as if it was attached directly to the desktop, therefor,
// the coordinate conversion through the layer tree works
// as expected, since the top layer has no "parent" but has
// fFrame as if it had
// make sure the location of the top layer on screen matches ours
fTopLayer->MoveBy(fFrame.left - fTopLayer->Frame().left,
fFrame.top - fTopLayer->Frame().top, NULL);
// make sure the size of the top layer matches ours
fTopLayer->ResizeBy(fFrame.Width() - fTopLayer->Frame().Width(),
fFrame.Height() - fTopLayer->Frame().Height(), NULL);
fTopLayer->AttachedToWindow(this);
}
}
@ -592,7 +592,7 @@ WindowLayer::ProcessDirtyRegion(BRegion& region)
// when the dirty region was empty.
// NOTE: when the window thread has processed
// the dirty region in MessageReceived(),
// it will make the region empty again,
// it will make the region empty again,
// when it is empty here, we need to send
// the message to initiate the next update round.
// Until the message is processed in the window
@ -614,7 +614,7 @@ WindowLayer::RedrawDirtyRegion()
if (IsVisible()) {
_DrawBorder();
BRegion* dirtyContentRegion =
BRegion* dirtyContentRegion =
fRegionPool.GetRegion(VisibleContentRegion());
dirtyContentRegion->IntersectWith(&fDirtyRegion);
@ -812,7 +812,7 @@ WindowLayer::MouseDown(BMessage* message, BPoint where, int32* _viewToken)
// activate window if not in FFM mode
DesktopSettings desktopSettings(fDesktop);
if (desktopSettings.MouseMode() == B_NORMAL_MOUSE) {
if (!desktopSettings.FocusFollowsMouse()) {
fDesktop->ActivateWindow(this);
} else {
// actually, the window should already be
@ -838,7 +838,7 @@ WindowLayer::MouseDown(BMessage* message, BPoint where, int32* _viewToken)
// Activate window in case it doesn't accept first click, and
// we're not in FFM mode
if ((Flags() & B_WILL_ACCEPT_FIRST_CLICK) == 0
&& desktopSettings.MouseMode() == B_NORMAL_MOUSE)
&& !desktopSettings.FocusFollowsMouse())
fDesktop->ActivateWindow(this);
// Eat the click if we don't accept first click
@ -1046,7 +1046,7 @@ WindowLayer::MouseMoved(BMessage *message, BPoint where, int32* _viewToken,
// change focus in FFM mode
DesktopSettings desktopSettings(fDesktop);
if (desktopSettings.MouseMode() != B_NORMAL_MOUSE
if (desktopSettings.FocusFollowsMouse()
&& !IsFocus() && !(Flags() & B_AVOID_FOCUS)) {
fDesktop->SetFocusWindow(this);
}
@ -1078,7 +1078,7 @@ WindowLayer::WorkspaceActivated(int32 index, bool active)
activatedMsg.AddBool("active", active);
ServerWindow()->SendMessageToClient(&activatedMsg);
if (active)
fWindow->HandleDirectConnection(B_DIRECT_START | B_BUFFER_RESET);
}