зеркало из https://github.com/mozilla/gecko-dev.git
Adding view manager API for specifying background color for the document. Fix for bug 75591. r=waterson,sr=attinasi,a=blizzard
This commit is contained in:
Родитель
043d570472
Коммит
8b1b9bad9d
|
@ -511,6 +511,21 @@ public:
|
|||
NS_IMETHOD FlushPendingInvalidates()=0;
|
||||
|
||||
|
||||
/**
|
||||
* Set the default background color that the view manager should use
|
||||
* to paint otherwise unowned areas. If the color isn't known, just set
|
||||
* it to zero (which means 'transparent' since the color is RGBA).
|
||||
*
|
||||
* @param aColor the default background color
|
||||
*/
|
||||
NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor)=0;
|
||||
|
||||
/**
|
||||
* Retrieve the default background color.
|
||||
*
|
||||
* @param aColor the default background color
|
||||
*/
|
||||
NS_IMETHOD GetDefaultBackgroundColor(nscolor* aColor)=0;
|
||||
};
|
||||
|
||||
//when the refresh happens, should it be double buffered?
|
||||
|
|
|
@ -423,6 +423,7 @@ nsViewManager::nsViewManager()
|
|||
mX = 0;
|
||||
mY = 0;
|
||||
mCachingWidgetChanges = 0;
|
||||
mDefaultBackgroundColor = NS_RGBA(0, 0, 0, 0);
|
||||
mAllowDoubleBuffering = PR_TRUE;
|
||||
mHasPendingInvalidates = PR_FALSE;
|
||||
mPendingInvalidateEvent = PR_FALSE;
|
||||
|
@ -947,6 +948,35 @@ void nsViewManager::Refresh(nsIView *aView, nsIRenderingContext *aContext, const
|
|||
#endif
|
||||
}
|
||||
|
||||
void nsViewManager::DefaultRefresh(nsIView* aView, const nsRect* aRect)
|
||||
{
|
||||
nsCOMPtr<nsIWidget> widget;
|
||||
GetWidgetForView(aView, getter_AddRefs(widget));
|
||||
if (! widget)
|
||||
return;
|
||||
|
||||
nsCOMPtr<nsIRenderingContext> context
|
||||
= getter_AddRefs(CreateRenderingContext(*aView));
|
||||
|
||||
if (! context)
|
||||
return;
|
||||
|
||||
nscolor bgcolor = mDefaultBackgroundColor;
|
||||
|
||||
if (NS_GET_A(mDefaultBackgroundColor) == 0) {
|
||||
// If we haven't been given a default bgcolor, then use the
|
||||
// widget's bgcolor.
|
||||
nsCOMPtr<nsIWidget> widget;
|
||||
GetWidgetForView(aView, getter_AddRefs(widget));
|
||||
|
||||
if (widget)
|
||||
bgcolor = widget->GetBackgroundColor();
|
||||
}
|
||||
|
||||
context->SetColor(bgcolor);
|
||||
context->FillRect(*aRect);
|
||||
}
|
||||
|
||||
// Perform a *stable* sort of the buffer by increasing Z-index. The common case is
|
||||
// when many or all z-indices are equal and the list is mostly sorted; make sure
|
||||
// that's fast (should be linear time if all z-indices are equal).
|
||||
|
@ -1930,28 +1960,14 @@ NS_IMETHODIMP nsViewManager::DispatchEvent(nsGUIEvent *aEvent, nsEventStatus *aS
|
|||
Refresh(view, ((nsPaintEvent*)aEvent)->renderingContext, &damrect, updateFlags);
|
||||
}
|
||||
else {
|
||||
// since we got an NS_PAINT event we need to draw something so we don't get blank areas.
|
||||
nsCOMPtr<nsIWidget> widget;
|
||||
GetWidgetForView(view, getter_AddRefs(widget));
|
||||
if (widget) {
|
||||
nsCOMPtr<nsIRenderingContext> context;
|
||||
context = getter_AddRefs(CreateRenderingContext(*view));
|
||||
if (context) {
|
||||
nscolor bgColor = 0;
|
||||
SystemAttrStruct info;
|
||||
info.mColor = &bgColor;
|
||||
mContext->GetSystemAttribute(eSystemAttr_Color_WindowBackground, &info);
|
||||
context->SetColor(bgColor);
|
||||
context->FillRect(damrect);
|
||||
}
|
||||
// since we got an NS_PAINT event, we need to
|
||||
// draw something so we don't get blank areas.
|
||||
DefaultRefresh(view, &damrect);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*aStatus = nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -3833,4 +3849,16 @@ nsViewManager::ProcessWidgetChanges(nsIView* aView)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsViewManager::SetDefaultBackgroundColor(nscolor aColor)
|
||||
{
|
||||
mDefaultBackgroundColor = aColor;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsViewManager::GetDefaultBackgroundColor(nscolor* aColor)
|
||||
{
|
||||
*aColor = mDefaultBackgroundColor;
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -154,6 +154,8 @@ public:
|
|||
NS_IMETHOD AllowDoubleBuffering(PRBool aDoubleBuffer);
|
||||
NS_IMETHOD IsPainting(PRBool& aIsPainting);
|
||||
NS_IMETHOD FlushPendingInvalidates();
|
||||
NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor);
|
||||
NS_IMETHOD GetDefaultBackgroundColor(nscolor* aColor);
|
||||
nsresult ProcessInvalidateEvent();
|
||||
static PRInt32 GetViewManagerCount();
|
||||
static const nsVoidArray* GetViewManagerArray();
|
||||
|
@ -175,6 +177,7 @@ private:
|
|||
nsIRegion *region, PRUint32 aUpdateFlags);
|
||||
void Refresh(nsIView* aView, nsIRenderingContext *aContext,
|
||||
const nsRect *rect, PRUint32 aUpdateFlags);
|
||||
void DefaultRefresh(nsIView* aView, const nsRect* aRect);
|
||||
void RenderViews(nsIView *aRootView, nsIRenderingContext& aRC, const nsRect& aRect,
|
||||
PRBool &aResult);
|
||||
|
||||
|
@ -327,6 +330,7 @@ private:
|
|||
nsRect mTranslucentArea; // bounding box of all translucent views.
|
||||
nsIScrollableView *mRootScrollable;
|
||||
PRInt32 mCachingWidgetChanges;
|
||||
nscolor mDefaultBackgroundColor;
|
||||
|
||||
nsHashtable mMapPlaceholderViewToZTreeNode;
|
||||
|
||||
|
|
|
@ -2967,4 +2967,15 @@ nsViewManager2::ProcessWidgetChanges(nsIView* aView)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsViewManager2::SetDefaultBackgroundColor(nscolor aColor)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsViewManager2::GetDefaultBackgroundColor(nscolor* aColor)
|
||||
{
|
||||
*aColor = 0;
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -151,6 +151,8 @@ public:
|
|||
NS_IMETHOD AllowDoubleBuffering(PRBool aDoubleBuffer);
|
||||
NS_IMETHOD IsPainting(PRBool& aIsPainting);
|
||||
NS_IMETHOD FlushPendingInvalidates();
|
||||
NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor);
|
||||
NS_IMETHOD GetDefaultBackgroundColor(nscolor* aColor);
|
||||
nsresult ProcessInvalidateEvent();
|
||||
static PRInt32 GetViewManagerCount();
|
||||
static const nsVoidArray* GetViewManagerArray();
|
||||
|
|
Загрузка…
Ссылка в новой задаче