* A double click on the window border now minimizes the window - has a fixed

double click time, though.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16631 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2006-03-07 15:23:35 +00:00
parent 9b9d1e82f4
commit 14fb2b690b
3 changed files with 105 additions and 95 deletions

View File

@ -39,8 +39,9 @@
DefaultDecorator::DefaultDecorator(DesktopSettings& settings, BRect rect,
window_look look, uint32 flags)
: Decorator(settings, rect, look, flags)
window_look look, uint32 flags)
: Decorator(settings, rect, look, flags),
fLastClicked(0)
{
DefaultDecorator::SetLook(settings, look);
@ -358,6 +359,13 @@ DefaultDecorator::Clicked(BPoint pt, int32 buttons, int32 modifiers)
printf("\tButtons: %ld, Modifiers: 0x%lx\n", buttons, modifiers);
#endif // DEBUG_DECORATOR
// TODO: have a real double-click mechanism, ie. take user settings into account
bigtime_t now = system_time();
if (buttons != 0) {
fWasDoubleClick = now - fLastClicked < 200000;
fLastClicked = now;
}
// In checking for hit test stuff, we start with the smallest rectangles the user might
// be clicking on and gradually work our way out into larger rectangles.
if (!(fFlags & B_NOT_CLOSABLE) && _closerect.Contains(pt))
@ -369,20 +377,19 @@ DefaultDecorator::Clicked(BPoint pt, int32 buttons, int32 modifiers)
if (fLook == B_DOCUMENT_WINDOW_LOOK && _resizerect.Contains(pt))
return DEC_RESIZE;
bool clicked = false;
// Clicking in the tab?
if (_tabrect.Contains(pt)) {
// tab sliding in any case if either shift key is held down
if (modifiers & B_SHIFT_KEY)
return DEC_SLIDETAB;
// Here's part of our window management stuff
if (buttons == B_SECONDARY_MOUSE_BUTTON)
return DEC_MOVETOBACK;
return DEC_DRAG;
}
// We got this far, so user is clicking on the border?
if (fLeftBorder.Contains(pt) || fRightBorder.Contains(pt)
clicked = true;
} else if (fLeftBorder.Contains(pt) || fRightBorder.Contains(pt)
|| fTopBorder.Contains(pt) || fBottomBorder.Contains(pt)) {
// Clicked on border
// check resize area
if (!(fFlags & B_NOT_RESIZABLE)
&& (fLook == B_TITLED_WINDOW_LOOK
@ -394,11 +401,18 @@ DefaultDecorator::Clicked(BPoint pt, int32 buttons, int32 modifiers)
return DEC_RESIZE;
}
// NOTE: On R5, windows are not moved to back if clicked inside the resize area with
// the second mouse button. So we check this after the check above
clicked = true;
}
if (clicked) {
// NOTE: On R5, windows are not moved to back if clicked inside the resize area
// with the second mouse button. So we check this after the check above
if (buttons == B_SECONDARY_MOUSE_BUTTON)
return DEC_MOVETOBACK;
if (fWasDoubleClick)
return DEC_MINIMIZE;
return DEC_DRAG;
}
@ -750,7 +764,7 @@ DefaultDecorator::_DrawClose(BRect r)
{
STRACE(("_DrawClose(%f,%f,%f,%f)\n", r.left, r.top, r.right, r.bottom));
// Just like DrawZoom, but for a close button
_DrawBlendedRect( r, GetClose());
_DrawBlendedRect(r, GetClose());
}
// _DrawTitle
@ -835,14 +849,14 @@ DefaultDecorator::_SetColors()
_SetFocus();
}
// _DrawBlendedRect
/*!
\brief Draws a framed rectangle with a gradient.
\param down The rectangle should be drawn recessed or not
*/
void
DefaultDecorator::_DrawBlendedRect(BRect r, bool down)
{
// This bad boy is used to draw a rectangle with a gradient.
// Note that it is not part of the Decorator API - it's specific
// to just the BeDecorator. Called by DrawZoom and DrawClose
// Actually just draws a blended square
int32 w = r.IntegerWidth();
int32 h = r.IntegerHeight();
@ -854,11 +868,11 @@ DefaultDecorator::_DrawBlendedRect(BRect r, bool down)
int steps = (w < h) ? w : h;
if (down) {
startcol = fButtonLowColor.GetColor32();
endcol = fButtonHighColor.GetColor32();
startcol = fButtonLowColor.GetColor32();
endcol = fButtonHighColor.GetColor32();
} else {
startcol = fButtonHighColor.GetColor32();
endcol = fButtonLowColor.GetColor32();
startcol = fButtonHighColor.GetColor32();
endcol = fButtonLowColor.GetColor32();
}
halfcol = MakeBlendColor(startcol,endcol,0.5);

View File

@ -1,5 +1,5 @@
/*
* Copyright 2001-2005, Haiku.
* Copyright 2001-2006, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
@ -17,72 +17,75 @@ class Desktop;
class DefaultDecorator: public Decorator {
public:
DefaultDecorator(DesktopSettings& settings, BRect frame,
window_look look, uint32 flags);
virtual ~DefaultDecorator();
public:
DefaultDecorator(DesktopSettings& settings, BRect frame,
window_look look, uint32 flags);
virtual ~DefaultDecorator();
virtual void SetTitle(const char* string, BRegion* updateRegion = NULL);
virtual void SetLook(DesktopSettings& settings,
window_look look, BRegion* updateRegion = NULL);
virtual void SetFlags(uint32 flags, BRegion* updateRegion = NULL);
virtual void SetTitle(const char* string, BRegion* updateRegion = NULL);
virtual void SetLook(DesktopSettings& settings,
window_look look, BRegion* updateRegion = NULL);
virtual void SetFlags(uint32 flags, BRegion* updateRegion = NULL);
virtual void MoveBy(BPoint pt);
virtual void ResizeBy(BPoint pt, BRegion* dirty);
virtual void MoveBy(BPoint pt);
virtual void ResizeBy(BPoint pt, BRegion* dirty);
virtual void Draw(BRect r);
virtual void Draw();
virtual void Draw(BRect r);
virtual void Draw();
virtual void GetSizeLimits(int32* minWidth, int32* minHeight,
int32* maxWidth, int32* maxHeight) const;
virtual void GetSizeLimits(int32* minWidth, int32* minHeight,
int32* maxWidth, int32* maxHeight) const;
virtual void GetFootprint(BRegion *region);
virtual void GetFootprint(BRegion *region);
virtual click_type Clicked(BPoint pt, int32 buttons,
int32 modifiers);
virtual click_type Clicked(BPoint pt, int32 buttons,
int32 modifiers);
protected:
virtual void _DoLayout();
protected:
virtual void _DoLayout();
virtual void _DrawFrame(BRect r);
virtual void _DrawTab(BRect r);
virtual void _DrawFrame(BRect r);
virtual void _DrawTab(BRect r);
virtual void _DrawClose(BRect r);
virtual void _DrawTitle(BRect r);
virtual void _DrawZoom(BRect r);
virtual void _DrawClose(BRect r);
virtual void _DrawTitle(BRect r);
virtual void _DrawZoom(BRect r);
virtual void _SetFocus();
virtual void _SetColors();
virtual void _SetFocus();
virtual void _SetColors();
private:
void _DrawBlendedRect(BRect r, bool down);
void _GetButtonSizeAndOffset(const BRect& tabRect,
private:
void _DrawBlendedRect(BRect r, bool down);
void _GetButtonSizeAndOffset(const BRect& tabRect,
float* offset, float*size) const;
void _LayoutTabItems(const BRect& tabRect);
void _LayoutTabItems(const BRect& tabRect);
RGBColor fButtonHighColor;
RGBColor fButtonLowColor;
RGBColor fTextColor;
RGBColor fTabColor;
RGBColor fButtonHighColor;
RGBColor fButtonLowColor;
RGBColor fTextColor;
RGBColor fTabColor;
RGBColor* fFrameColors;
// Individual rects for handling window frame
// rendering the proper way
BRect fRightBorder;
BRect fLeftBorder;
BRect fTopBorder;
BRect fBottomBorder;
RGBColor* fFrameColors;
int32 fBorderWidth;
// Individual rects for handling window frame
// rendering the proper way
BRect fRightBorder;
BRect fLeftBorder;
BRect fTopBorder;
BRect fBottomBorder;
uint32 fTabOffset;
float fTextOffset;
int32 fBorderWidth;
float fMinTabWidth;
float fMaxTabWidth;
BString fTruncatedTitle;
int32 fTruncatedTitleLength;
uint32 fTabOffset;
float fTextOffset;
float fMinTabWidth;
float fMaxTabWidth;
BString fTruncatedTitle;
int32 fTruncatedTitleLength;
bigtime_t fLastClicked;
bool fWasDoubleClick;
};
#endif /* DEFAULT_DECORATOR_H */

View File

@ -756,19 +756,16 @@ WindowLayer::MouseDown(BMessage* message, BPoint where, int32* _viewToken)
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;
@ -794,7 +791,7 @@ WindowLayer::MouseDown(BMessage* message, BPoint where, int32* _viewToken)
break;
}
// redraw decoratpr
// redraw decorator
BRegion visibleBorder;
GetBorderRegion(&visibleBorder);
visibleBorder.IntersectWith(&VisibleRegion());
@ -805,7 +802,7 @@ WindowLayer::MouseDown(BMessage* message, BPoint where, int32* _viewToken)
if (fIsZooming) {
fDecorator->SetZoom(true);
} else if (fIsClosing) {
fDecorator->SetClose(true);
//fDecorator->SetClose(true);
} else if (fIsMinimizing) {
fDecorator->SetMinimize(true);
}
@ -855,7 +852,7 @@ WindowLayer::MouseUp(BMessage* msg, BPoint where, int32* _viewToken)
if (fDecorator) {
click_type action = _ActionFor(msg);
// redraw decoratpr
// redraw decorator
BRegion visibleBorder;
GetBorderRegion(&visibleBorder);
visibleBorder.IntersectWith(&VisibleRegion());
@ -863,14 +860,6 @@ WindowLayer::MouseUp(BMessage* msg, BPoint where, int32* _viewToken)
fDrawingEngine->Lock();
fDrawingEngine->ConstrainClippingRegion(&visibleBorder);
if (fIsZooming) {
fDecorator->SetZoom(true);
} else if (fIsClosing) {
fDecorator->SetClose(true);
} else if (fIsMinimizing) {
fDecorator->SetMinimize(true);
}
if (fIsZooming) {
fIsZooming = false;
fDecorator->SetZoom(false);
@ -1853,21 +1842,25 @@ WindowLayer::_UpdateContentRegion()
click_type
WindowLayer::_ActionFor(const BMessage* msg) const
{
BPoint where(0, 0);
int32 buttons = 0;
int32 modifiers = 0;
if (fDecorator == NULL)
return DEC_NONE;
msg->FindPoint("where", &where);
msg->FindInt32("buttons", &buttons);
msg->FindInt32("modifiers", &modifiers);
BPoint where;
if (msg->FindPoint("where", &where) != B_OK)
return DEC_NONE;
if (fDecorator)
return fDecorator->Clicked(where, buttons, modifiers);
int32 buttons;
if (msg->FindInt32("buttons", &buttons) != B_OK)
buttons = 0;
return DEC_NONE;
int32 modifiers;
if (msg->FindInt32("modifiers", &modifiers) != B_OK)
modifiers = 0;
return fDecorator->Clicked(where, buttons, modifiers);
}
// _ObeySizeLimits
void
WindowLayer::_ObeySizeLimits()
{