From 8b1b9bad9de7e39d777f4d825a05bc458e243612 Mon Sep 17 00:00:00 2001 From: "roc+%cs.cmu.edu" Date: Mon, 23 Apr 2001 18:14:46 +0000 Subject: [PATCH] Adding view manager API for specifying background color for the document. Fix for bug 75591. r=waterson,sr=attinasi,a=blizzard --- view/public/nsIViewManager.h | 15 +++++++++ view/src/nsViewManager.cpp | 62 ++++++++++++++++++++++++++---------- view/src/nsViewManager.h | 4 +++ view/src/nsViewManager2.cpp | 11 +++++++ view/src/nsViewManager2.h | 2 ++ 5 files changed, 77 insertions(+), 17 deletions(-) diff --git a/view/public/nsIViewManager.h b/view/public/nsIViewManager.h index a2cffb9a4f28..dc55eb127084 100644 --- a/view/public/nsIViewManager.h +++ b/view/public/nsIViewManager.h @@ -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? diff --git a/view/src/nsViewManager.cpp b/view/src/nsViewManager.cpp index c3cf00e76574..4cb2928844ef 100644 --- a/view/src/nsViewManager.cpp +++ b/view/src/nsViewManager.cpp @@ -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 widget; + GetWidgetForView(aView, getter_AddRefs(widget)); + if (! widget) + return; + + nsCOMPtr 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 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 widget; - GetWidgetForView(view, getter_AddRefs(widget)); - if (widget) { - nsCOMPtr 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; +} diff --git a/view/src/nsViewManager.h b/view/src/nsViewManager.h index 4a6498959bb5..85050c0fbee8 100644 --- a/view/src/nsViewManager.h +++ b/view/src/nsViewManager.h @@ -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; diff --git a/view/src/nsViewManager2.cpp b/view/src/nsViewManager2.cpp index 8a901a1096f8..6516839e2bb2 100755 --- a/view/src/nsViewManager2.cpp +++ b/view/src/nsViewManager2.cpp @@ -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; +} diff --git a/view/src/nsViewManager2.h b/view/src/nsViewManager2.h index 1ea50abe6557..9e9d0100a139 100755 --- a/view/src/nsViewManager2.h +++ b/view/src/nsViewManager2.h @@ -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();