* If a window was hidden during resize/movement, it would still be in resizing

or moving mode when it was shown again. Added a test app HideAndShow which let
  you easily reproduce the faulty behaviour (with a previous version of the
  app_server, that is).
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28847 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2009-01-05 10:32:30 +00:00
parent 5ddb65f007
commit ea5c7202cb
5 changed files with 197 additions and 20 deletions
src
servers/app
tests/servers/app

@ -1,5 +1,5 @@
/*
* Copyright 2001-2008, Haiku.
* Copyright 2001-2009, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
@ -947,7 +947,8 @@ Desktop::_SetWorkspace(int32 index)
bool movedMouseEventWindow = false;
display_mode previousMode, newMode;
fVirtualScreen.ScreenAt(0)->GetMode(&previousMode);
fVirtualScreen.RestoreConfiguration(*this, fSettings->WorkspacesMessage(index));
fVirtualScreen.RestoreConfiguration(*this,
fSettings->WorkspacesMessage(index));
fVirtualScreen.ScreenAt(0)->GetMode(&newMode);
// We only need to invalidate the entire desktop if we changed display modes
if (memcmp(&previousMode, &newMode, sizeof(display_mode)))
@ -964,7 +965,8 @@ Desktop::_SetWorkspace(int32 index)
_Windows(index).AddWindow(fMouseEventWindow);
_Windows(previousIndex).RemoveWindow(fMouseEventWindow);
_UpdateSubsetWorkspaces(fMouseEventWindow, previousIndex, index);
_UpdateSubsetWorkspaces(fMouseEventWindow, previousIndex,
index);
movedMouseEventWindow = true;
// send B_WORKSPACES_CHANGED message
@ -974,11 +976,13 @@ Desktop::_SetWorkspace(int32 index)
// make sure it's frontmost
_Windows(index).RemoveWindow(fMouseEventWindow);
_Windows(index).AddWindow(fMouseEventWindow,
fMouseEventWindow->Frontmost(_Windows(index).FirstWindow(), index));
fMouseEventWindow->Frontmost(_Windows(index).FirstWindow(),
index));
}
}
fMouseEventWindow->Anchor(index).position = fMouseEventWindow->Frame().LeftTop();
fMouseEventWindow->Anchor(index).position
= fMouseEventWindow->Frame().LeftTop();
}
// build region of windows that are no longer visible in the new workspace
@ -1832,8 +1836,14 @@ Desktop::HideWindow(Window* window)
window->SetHidden(true);
fFocusList.RemoveWindow(window);
if (fMouseEventWindow == window)
if (fMouseEventWindow == window) {
// Make its decorator lose the current mouse action
BMessage message;
int32 viewToken;
window->MouseUp(&message, fLastMousePosition, &viewToken);
fMouseEventWindow = NULL;
}
if (window->InWorkspace(fCurrentWorkspace)) {
_UpdateSubsetWorkspaces(window);
@ -2235,7 +2245,8 @@ Desktop::AddWindowToSubset(Window* subset, Window* window)
if (!subset->AddToSubset(window))
return false;
_ChangeWindowWorkspaces(subset, subset->Workspaces(), subset->SubsetWorkspaces());
_ChangeWindowWorkspaces(subset, subset->Workspaces(),
subset->SubsetWorkspaces());
return true;
}
@ -2244,7 +2255,8 @@ void
Desktop::RemoveWindowFromSubset(Window* subset, Window* window)
{
subset->RemoveFromSubset(window);
_ChangeWindowWorkspaces(subset, subset->Workspaces(), subset->SubsetWorkspaces());
_ChangeWindowWorkspaces(subset, subset->Workspaces(),
subset->SubsetWorkspaces());
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001-2008, Haiku, Inc.
* Copyright (c) 2001-2009, Haiku, Inc.
* Distributed under the terms of the MIT license.
*
* Authors:
@ -62,7 +62,8 @@ public:
::Desktop* Desktop() const { return fDesktop; }
::Decorator* Decorator() const { return fDecorator; }
::ServerWindow* ServerWindow() const { return fWindow; }
::EventTarget& EventTarget() const { return fWindow->EventTarget(); }
::EventTarget& EventTarget() const
{ return fWindow->EventTarget(); }
// setting and getting the "hard" clipping, you need to have
// WriteLock()ed the clipping!
@ -78,7 +79,8 @@ public:
void GetContentRegion(BRegion* region);
void MoveBy(int32 x, int32 y);
void ResizeBy(int32 x, int32 y, BRegion* dirtyRegion);
void ResizeBy(int32 x, int32 y,
BRegion* dirtyRegion);
void ScrollViewBy(View* view, int32 dx, int32 dy);
@ -88,7 +90,8 @@ public:
virtual bool IsOffscreenWindow() const { return false; }
void GetEffectiveDrawingRegion(View* view, BRegion& region);
void GetEffectiveDrawingRegion(View* view,
BRegion& region);
bool DrawingRegionChanged(View* view) const;
// generic version, used by the Desktop
@ -131,15 +134,18 @@ public:
void CopyContents(BRegion* region,
int32 xOffset, int32 yOffset);
void MouseDown(BMessage* message, BPoint where, int32* _viewToken);
void MouseUp(BMessage* message, BPoint where, int32* _viewToken);
void MouseMoved(BMessage* message, BPoint where, int32* _viewToken,
bool isLatestMouseMoved);
void MouseDown(BMessage* message, BPoint where,
int32* _viewToken);
void MouseUp(BMessage* message, BPoint where,
int32* _viewToken);
void MouseMoved(BMessage* message, BPoint where,
int32* _viewToken, bool isLatestMouseMoved);
// some hooks to inform the client window
// TODO: move this to ServerWindow maybe?
void WorkspaceActivated(int32 index, bool active);
void WorkspacesChanged(uint32 oldWorkspaces, uint32 newWorkspaces);
void WorkspacesChanged(uint32 oldWorkspaces,
uint32 newWorkspaces);
void Activated(bool active);
// changing some properties
@ -179,7 +185,8 @@ public:
void FontsChanged(BRegion* updateRegion);
void SetLook(window_look look, BRegion* updateRegion);
void SetLook(window_look look,
BRegion* updateRegion);
void SetFeel(window_feel feel);
void SetFlags(uint32 flags, BRegion* updateRegion);
@ -243,12 +250,13 @@ protected:
void _DrawBorder();
// handling update sessions
void _TransferToUpdateSession(BRegion* contentDirtyRegion);
void _TransferToUpdateSession(
BRegion* contentDirtyRegion);
void _SendUpdateMessage();
void _UpdateContentRegion();
click_type _ActionFor(const BMessage* msg) const;
click_type _ActionFor(const BMessage* message) const;
void _ObeySizeLimits();
void _PropagatePosition();

@ -175,6 +175,7 @@ SubInclude HAIKU_TOP src tests servers app drawing_modes ;
SubInclude HAIKU_TOP src tests servers app event_mask ;
SubInclude HAIKU_TOP src tests servers app find_view ;
SubInclude HAIKU_TOP src tests servers app following ;
SubInclude HAIKU_TOP src tests servers app hide_and_show ;
SubInclude HAIKU_TOP src tests servers app idle_test ;
SubInclude HAIKU_TOP src tests servers app lagging_get_mouse ;
SubInclude HAIKU_TOP src tests servers app lock_focus ;

@ -0,0 +1,138 @@
/*
* Copyright 2005-2009, Haiku Inc.
* Distributed under the terms of the MIT License.
*
* Authors:
* Axel Dörfler, axeld@pinc-software.de
*/
#include <stdio.h>
#include <Application.h>
#include <MessageRunner.h>
#include <TextView.h>
#include <Window.h>
static const uint32 kMsgToggleShow = 'tgsh';
class Window : public BWindow {
public:
Window();
virtual ~Window();
virtual void MessageReceived(BMessage* message);
virtual void FrameResized(float width, float height);
virtual bool QuitRequested();
private:
BMessageRunner* fRunner;
};
Window::Window()
: BWindow(BRect(100, 100, 400, 400), "HideAndShow-Test",
B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS)
{
BRect rect(Bounds());
rect.left += 20;
rect.right -= 20;
rect.top = 100;
rect.bottom = 200;
BTextView* view = new BTextView(Bounds(), "", rect, B_FOLLOW_ALL,
B_FRAME_EVENTS | B_WILL_DRAW);
view->MakeEditable(false);
view->SetAlignment(B_ALIGN_CENTER);
view->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
view->SetText("The window will be hidden and shown every 2 seconds.");
AddChild(view);
BMessage showAndHide(kMsgToggleShow);
fRunner = new BMessageRunner(this, &showAndHide, 2000000);
}
Window::~Window()
{
delete fRunner;
}
void
Window::MessageReceived(BMessage* message)
{
switch (message->what) {
case kMsgToggleShow:
if (IsHidden())
Show();
else
Hide();
break;
default:
BWindow::MessageReceived(message);
break;
}
}
void
Window::FrameResized(float width, float height)
{
BTextView* view = dynamic_cast<BTextView*>(ChildAt(0));
if (view == NULL)
return;
BRect rect = Bounds();
rect.left += 20;
rect.right -= 20;
rect.top = 100;
rect.bottom = 200;
view->SetTextRect(rect);
}
bool
Window::QuitRequested()
{
be_app->PostMessage(B_QUIT_REQUESTED);
return true;
}
// #pragma mark -
class Application : public BApplication {
public:
Application();
virtual void ReadyToRun();
};
Application::Application()
: BApplication("application/x-vnd.haiku-hide_and_show")
{
}
void
Application::ReadyToRun(void)
{
Window* window = new Window();
window->Show();
}
// #pragma mark -
int
main(int argc, char** argv)
{
Application app;
app.Run();
return 0;
}

@ -0,0 +1,18 @@
SubDir HAIKU_TOP src tests servers app hide_and_show ;
SetSubDirSupportedPlatformsBeOSCompatible ;
AddSubDirSupportedPlatforms libbe_test ;
UseHeaders [ FDirName os app ] ;
UseHeaders [ FDirName os interface ] ;
Application HideAndShow :
HideAndShow.cpp
: be
;
if $(TARGET_PLATFORM) = libbe_test {
HaikuInstall install-test-apps : $(HAIKU_APP_TEST_DIR) : ViewState
: tests!apps ;
}