The WinDecorator crashed when trying to draw a menu.
Clean it up, and try to fix other things. It is now opening menus, but crashes when opening windows... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36130 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -30,21 +30,29 @@
|
|||||||
WinDecorator::WinDecorator(DesktopSettings& settings, BRect rect,
|
WinDecorator::WinDecorator(DesktopSettings& settings, BRect rect,
|
||||||
window_look look, uint32 flags)
|
window_look look, uint32 flags)
|
||||||
:
|
:
|
||||||
Decorator(settings, rect, look, flags)
|
Decorator(settings, rect, look, flags),
|
||||||
|
taboffset(0)
|
||||||
{
|
{
|
||||||
taboffset=0;
|
|
||||||
|
|
||||||
|
_UpdateFont(settings);
|
||||||
|
|
||||||
|
// common colors to both focus and non focus state
|
||||||
frame_highcol = (rgb_color){ 255, 255, 255, 255 };
|
frame_highcol = (rgb_color){ 255, 255, 255, 255 };
|
||||||
frame_midcol = (rgb_color){ 216, 216, 216, 255 };
|
frame_midcol = (rgb_color){ 216, 216, 216, 255 };
|
||||||
frame_lowcol = (rgb_color){ 110, 110, 110, 255 };
|
frame_lowcol = (rgb_color){ 110, 110, 110, 255 };
|
||||||
frame_lowercol = (rgb_color){ 0, 0, 0, 255 };
|
frame_lowercol = (rgb_color){ 0, 0, 0, 255 };
|
||||||
|
|
||||||
|
// state based colors
|
||||||
fFocusTabColor = settings.UIColor(B_WINDOW_TAB_COLOR);
|
fFocusTabColor = settings.UIColor(B_WINDOW_TAB_COLOR);
|
||||||
fFocusTextColor = settings.UIColor(B_WINDOW_TEXT_COLOR);
|
fFocusTextColor = settings.UIColor(B_WINDOW_TEXT_COLOR);
|
||||||
fNonFocusTabColor = settings.UIColor(B_WINDOW_INACTIVE_TAB_COLOR);
|
fNonFocusTabColor = settings.UIColor(B_WINDOW_INACTIVE_TAB_COLOR);
|
||||||
fNonFocusTextColor = settings.UIColor(B_WINDOW_INACTIVE_TEXT_COLOR);
|
fNonFocusTextColor = settings.UIColor(B_WINDOW_INACTIVE_TEXT_COLOR);
|
||||||
|
|
||||||
_UpdateFont(settings);
|
// Set appropriate colors based on the current focus value. In this case,
|
||||||
|
// each decorator defaults to not having the focus.
|
||||||
|
_SetFocus();
|
||||||
|
|
||||||
|
// Do initial decorator setup
|
||||||
_DoLayout();
|
_DoLayout();
|
||||||
|
|
||||||
textoffset=5;
|
textoffset=5;
|
||||||
@@ -102,6 +110,55 @@ WinDecorator::FontsChanged(DesktopSettings& settings, BRegion* updateRegion)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WinDecorator::SetLook(DesktopSettings& settings, window_look look,
|
||||||
|
BRegion* updateRegion)
|
||||||
|
{
|
||||||
|
// TODO: we could be much smarter about the update region
|
||||||
|
|
||||||
|
// get previous extent
|
||||||
|
if (updateRegion != NULL) {
|
||||||
|
BRegion extent;
|
||||||
|
GetFootprint(&extent);
|
||||||
|
updateRegion->Include(&extent);
|
||||||
|
}
|
||||||
|
|
||||||
|
fLook = look;
|
||||||
|
|
||||||
|
_UpdateFont(settings);
|
||||||
|
_DoLayout();
|
||||||
|
|
||||||
|
if (updateRegion != NULL) {
|
||||||
|
BRegion extent;
|
||||||
|
GetFootprint(&extent);
|
||||||
|
updateRegion->Include(&extent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WinDecorator::SetFlags(uint32 flags, BRegion* updateRegion)
|
||||||
|
{
|
||||||
|
// TODO: we could be much smarter about the update region
|
||||||
|
|
||||||
|
// get previous extent
|
||||||
|
if (updateRegion != NULL) {
|
||||||
|
BRegion extent;
|
||||||
|
GetFootprint(&extent);
|
||||||
|
updateRegion->Include(&extent);
|
||||||
|
}
|
||||||
|
|
||||||
|
Decorator::SetFlags(flags, updateRegion);
|
||||||
|
_DoLayout();
|
||||||
|
|
||||||
|
if (updateRegion != NULL) {
|
||||||
|
BRegion extent;
|
||||||
|
GetFootprint(&extent);
|
||||||
|
updateRegion->Include(&extent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
WinDecorator::MoveBy(BPoint pt)
|
WinDecorator::MoveBy(BPoint pt)
|
||||||
{
|
{
|
||||||
@@ -138,6 +195,33 @@ WinDecorator::ResizeBy(BPoint offset, BRegion* dirty)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WinDecorator::Draw(BRect update)
|
||||||
|
{
|
||||||
|
STRACE(("WinDecorator::Draw(): ")); update.PrintToStream();
|
||||||
|
|
||||||
|
fDrawingEngine->SetDrawState(&fDrawState);
|
||||||
|
|
||||||
|
_DrawFrame(update);
|
||||||
|
_DrawTab(update);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
WinDecorator::Draw(void)
|
||||||
|
{
|
||||||
|
STRACE(("WinDecorator::Draw()\n"));
|
||||||
|
|
||||||
|
fDrawingEngine->SetDrawState(&fDrawState);
|
||||||
|
|
||||||
|
_DrawFrame(fBorderRect);
|
||||||
|
_DrawTab(fTabRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO : GetSizeLimits
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
WinDecorator::GetFootprint(BRegion* region)
|
WinDecorator::GetFootprint(BRegion* region)
|
||||||
{
|
{
|
||||||
@@ -159,20 +243,16 @@ WinDecorator::GetFootprint(BRegion* region)
|
|||||||
|
|
||||||
|
|
||||||
click_type
|
click_type
|
||||||
WinDecorator::Clicked(BPoint pt, int32 buttons, int32 modifiers)
|
WinDecorator::Clicked(BPoint where, int32 buttons, int32 modifiers)
|
||||||
{
|
{
|
||||||
if (fCloseRect.Contains(pt)) {
|
if (!(fFlags & B_NOT_CLOSABLE) && fCloseRect.Contains(where))
|
||||||
STRACE(("WinDecorator():Clicked() - Close\n"));
|
|
||||||
return CLICK_CLOSE;
|
return CLICK_CLOSE;
|
||||||
}
|
|
||||||
|
|
||||||
if (fZoomRect.Contains(pt)) {
|
if (!(fFlags & B_NOT_ZOOMABLE) && fZoomRect.Contains(where))
|
||||||
STRACE(("WinDecorator():Clicked() - Zoom\n"));
|
|
||||||
return CLICK_ZOOM;
|
return CLICK_ZOOM;
|
||||||
}
|
|
||||||
|
|
||||||
// Clicking in the tab?
|
// Clicking in the tab?
|
||||||
if (fTabRect.Contains(pt)) {
|
if (fTabRect.Contains(where)) {
|
||||||
// Here's part of our window management stuff
|
// Here's part of our window management stuff
|
||||||
/* TODO This is missing CLICK_MOVETOFRONT
|
/* TODO This is missing CLICK_MOVETOFRONT
|
||||||
if(buttons==B_PRIMARY_MOUSE_BUTTON && !IsFocus())
|
if(buttons==B_PRIMARY_MOUSE_BUTTON && !IsFocus())
|
||||||
@@ -182,9 +262,14 @@ WinDecorator::Clicked(BPoint pt, int32 buttons, int32 modifiers)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We got this far, so user is clicking on the border?
|
// We got this far, so user is clicking on the border?
|
||||||
if (fBorderRect.Contains(pt) && !fFrame.Contains(pt)) {
|
if (fBorderRect.Contains(where) && !fFrame.Contains(where)) {
|
||||||
STRACE(("WinDecorator():Clicked() - Resize\n"));
|
STRACE(("WinDecorator():Clicked() - Resize\n"));
|
||||||
return CLICK_RESIZE;
|
if (!(fFlags & B_NOT_RESIZABLE)
|
||||||
|
&& (fLook == B_TITLED_WINDOW_LOOK
|
||||||
|
|| fLook == B_FLOATING_WINDOW_LOOK
|
||||||
|
|| fLook == B_MODAL_WINDOW_LOOK)) {
|
||||||
|
return CLICK_RESIZE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Guess user didn't click anything
|
// Guess user didn't click anything
|
||||||
@@ -242,6 +327,11 @@ WinDecorator::_DoLayout()
|
|||||||
|
|
||||||
fMinimizeRect=fZoomRect;
|
fMinimizeRect=fZoomRect;
|
||||||
fMinimizeRect.OffsetBy(0-fZoomRect.Width()-1,0);
|
fMinimizeRect.OffsetBy(0-fZoomRect.Width()-1,0);
|
||||||
|
} else {
|
||||||
|
fTabRect.Set(0.0, 0.0, -1.0, -1.0);
|
||||||
|
fCloseRect.Set(0.0, 0.0, -1.0, -1.0);
|
||||||
|
fZoomRect.Set(0.0, 0.0, -1.0, -1.0);
|
||||||
|
fMinimizeRect.Set(0.0, 0.0, -1.0, -1.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,17 +339,22 @@ WinDecorator::_DoLayout()
|
|||||||
void
|
void
|
||||||
WinDecorator::_DrawTitle(BRect r)
|
WinDecorator::_DrawTitle(BRect r)
|
||||||
{
|
{
|
||||||
|
//fDrawingEngine->SetDrawingMode(B_OP_OVER);
|
||||||
fDrawingEngine->SetHighColor(textcol);
|
fDrawingEngine->SetHighColor(textcol);
|
||||||
fDrawingEngine->SetLowColor(IsFocus()?fFocusTabColor:fNonFocusTabColor);
|
fDrawingEngine->SetLowColor(IsFocus()?fFocusTabColor:fNonFocusTabColor);
|
||||||
|
|
||||||
fTruncatedTitle = Title();
|
fTruncatedTitle = Title();
|
||||||
fDrawState.Font().TruncateString(&fTruncatedTitle, B_TRUNCATE_END,
|
fDrawState.Font().TruncateString(&fTruncatedTitle, B_TRUNCATE_END,
|
||||||
(fTabRect.left + textoffset) - (fZoomRect.left - 5));
|
((fZoomRect.IsValid() ? fZoomRect.left :
|
||||||
|
fCloseRect.IsValid() ? fCloseRect.left : fTabRect.right) - 5)
|
||||||
|
- (fTabRect.left + textoffset));
|
||||||
fTruncatedTitleLength = fTruncatedTitle.Length();
|
fTruncatedTitleLength = fTruncatedTitle.Length();
|
||||||
fDrawingEngine->SetFont(fDrawState.Font());
|
|
||||||
|
|
||||||
|
//fDrawingEngine->SetFont(fDrawState.Font());
|
||||||
fDrawingEngine->DrawString(fTruncatedTitle,fTruncatedTitleLength,
|
fDrawingEngine->DrawString(fTruncatedTitle,fTruncatedTitleLength,
|
||||||
BPoint(fTabRect.left+textoffset,fCloseRect.bottom-1));
|
BPoint(fTabRect.left+textoffset,fCloseRect.bottom-1));
|
||||||
|
|
||||||
|
//fDrawingEngine->SetDrawingMode(B_OP_COPY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -283,30 +378,6 @@ WinDecorator::_SetFocus(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
WinDecorator::Draw(BRect update)
|
|
||||||
{
|
|
||||||
STRACE(("WinDecorator::Draw(): ")); update.PrintToStream();
|
|
||||||
|
|
||||||
fDrawingEngine->SetDrawState(&fDrawState);
|
|
||||||
|
|
||||||
_DrawFrame(update);
|
|
||||||
_DrawTab(update);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
WinDecorator::Draw(void)
|
|
||||||
{
|
|
||||||
STRACE(("WinDecorator::Draw()\n"));
|
|
||||||
|
|
||||||
fDrawingEngine->SetDrawState(&fDrawState);
|
|
||||||
|
|
||||||
_DrawFrame(fBorderRect);
|
|
||||||
_DrawTab(fTabRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
WinDecorator::_DrawZoom(BRect r)
|
WinDecorator::_DrawZoom(BRect r)
|
||||||
{
|
{
|
||||||
@@ -372,22 +443,22 @@ WinDecorator::_DrawMinimize(BRect r)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
WinDecorator::_DrawTab(BRect r)
|
WinDecorator::_DrawTab(BRect invalid)
|
||||||
{
|
{
|
||||||
// If a window has a tab, this will draw it and any buttons which are
|
// If a window has a tab, this will draw it and any buttons which are
|
||||||
// in it.
|
// in it.
|
||||||
if(fLook==B_NO_BORDER_WINDOW_LOOK)
|
if (!fTabRect.IsValid() || !invalid.Intersects(fTabRect) || fLook==B_NO_BORDER_WINDOW_LOOK)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
fDrawingEngine->FillRect(fTabRect,tab_highcol);
|
fDrawingEngine->FillRect(fTabRect,tab_highcol);
|
||||||
|
|
||||||
_DrawTitle(r);
|
_DrawTitle(fTabRect);
|
||||||
|
|
||||||
// Draw the buttons if we're supposed to
|
// Draw the buttons if we're supposed to
|
||||||
if(!(fFlags & B_NOT_CLOSABLE))
|
// TODO : we should still draw the buttons if they are disabled, but grey them out
|
||||||
|
if (!(fFlags & B_NOT_CLOSABLE) && invalid.Intersects(fCloseRect))
|
||||||
_DrawClose(fCloseRect);
|
_DrawClose(fCloseRect);
|
||||||
if(!(fFlags & B_NOT_ZOOMABLE))
|
if (!(fFlags & B_NOT_ZOOMABLE) && invalid.Intersects(fZoomRect))
|
||||||
_DrawZoom(fZoomRect);
|
_DrawZoom(fZoomRect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,15 +6,20 @@
|
|||||||
class WinDecorator: public Decorator
|
class WinDecorator: public Decorator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WinDecorator(DesktopSettings& settings,
|
WinDecorator(DesktopSettings& settings,
|
||||||
BRect frame, window_look wlook,
|
BRect frame, window_look wlook,
|
||||||
uint32 wflags);
|
uint32 wflags);
|
||||||
~WinDecorator(void);
|
~WinDecorator(void);
|
||||||
|
|
||||||
void SetTitle(const char* string,
|
void SetTitle(const char* string,
|
||||||
BRegion* updateRegion = NULL);
|
BRegion* updateRegion = NULL);
|
||||||
void FontsChanged(DesktopSettings& settings,
|
void FontsChanged(DesktopSettings& settings,
|
||||||
BRegion* updateRegion);
|
BRegion* updateRegion);
|
||||||
|
virtual void SetLook(DesktopSettings& settings,
|
||||||
|
window_look look,
|
||||||
|
BRegion* updateRegion = NULL);
|
||||||
|
virtual void SetFlags(uint32 flags,
|
||||||
|
BRegion* updateRegion = NULL);
|
||||||
|
|
||||||
void MoveBy(BPoint pt);
|
void MoveBy(BPoint pt);
|
||||||
void ResizeBy(BPoint pt, BRegion* dirty);
|
void ResizeBy(BPoint pt, BRegion* dirty);
|
||||||
|
|||||||
Reference in New Issue
Block a user