mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-22 02:09:28 +00:00
Bug 601603. Part 5 - Ensure that the layer that holds the window background is never opaque for glass windows. r=roc a=beta8
This commit is contained in:
parent
d51ae139e7
commit
82fe7096ba
@ -162,7 +162,8 @@ protected:
|
||||
ThebesLayerData() :
|
||||
mActiveScrolledRoot(nsnull), mLayer(nsnull),
|
||||
mIsSolidColorInVisibleRegion(PR_FALSE),
|
||||
mHasText(PR_FALSE), mHasTextOverTransparent(PR_FALSE) {}
|
||||
mHasText(PR_FALSE), mHasTextOverTransparent(PR_FALSE),
|
||||
mForceTransparentSurface(PR_FALSE) {}
|
||||
/**
|
||||
* Record that an item has been added to the ThebesLayer, so we
|
||||
* need to update our regions.
|
||||
@ -240,6 +241,13 @@ protected:
|
||||
* transparent pixels in the layer.
|
||||
*/
|
||||
PRPackedBool mHasTextOverTransparent;
|
||||
/**
|
||||
* Set if the layer should be treated as transparent, even if its entire
|
||||
* area is covered by opaque display items. For example, this needs to
|
||||
* be set if something is going to "punch holes" in the layer by clearing
|
||||
* part of its surface.
|
||||
*/
|
||||
PRPackedBool mForceTransparentSurface;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -861,7 +869,7 @@ ContainerState::PopThebesLayerData()
|
||||
userData->mForcedBackgroundColor = backgroundColor;
|
||||
}
|
||||
PRUint32 flags =
|
||||
(isOpaque ? Layer::CONTENT_OPAQUE : 0) |
|
||||
((isOpaque && !data->mForceTransparentSurface) ? Layer::CONTENT_OPAQUE : 0) |
|
||||
(data->mHasText ? 0 : Layer::CONTENT_NO_TEXT) |
|
||||
(data->mHasTextOverTransparent ? 0 : Layer::CONTENT_NO_TEXT_OVER_TRANSPARENT);
|
||||
layer->SetContentFlags(flags);
|
||||
@ -912,7 +920,8 @@ ContainerState::ThebesLayerData::Accumulate(nsDisplayListBuilder* aBuilder,
|
||||
mDrawRegion.Or(mDrawRegion, aDrawRect);
|
||||
mDrawRegion.SimplifyOutward(4);
|
||||
|
||||
if (aItem->IsOpaque(aBuilder)) {
|
||||
PRBool forceTransparentSurface = PR_FALSE;
|
||||
if (aItem->IsOpaque(aBuilder, &forceTransparentSurface)) {
|
||||
// We don't use SimplifyInward here since it's not defined exactly
|
||||
// what it will discard. For our purposes the most important case
|
||||
// is a large opaque background at the bottom of z-order (e.g.,
|
||||
@ -929,6 +938,7 @@ ContainerState::ThebesLayerData::Accumulate(nsDisplayListBuilder* aBuilder,
|
||||
mHasTextOverTransparent = PR_TRUE;
|
||||
}
|
||||
}
|
||||
mForceTransparentSurface = mForceTransparentSurface || forceTransparentSurface;
|
||||
}
|
||||
|
||||
already_AddRefed<ThebesLayer>
|
||||
@ -1392,7 +1402,8 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
|
||||
state.ProcessDisplayItems(aChildren, clip);
|
||||
state.Finish();
|
||||
|
||||
PRUint32 flags = aChildren.IsOpaque() ? Layer::CONTENT_OPAQUE : 0;
|
||||
PRUint32 flags = aChildren.IsOpaque() &&
|
||||
!aChildren.NeedsTransparentSurface() ? Layer::CONTENT_OPAQUE : 0;
|
||||
containerLayer->SetContentFlags(flags);
|
||||
return containerLayer.forget();
|
||||
}
|
||||
|
@ -320,6 +320,8 @@ nsDisplayList::ComputeVisibilityForSublist(nsDisplayListBuilder* aBuilder,
|
||||
nsAutoTArray<nsDisplayItem*, 512> elements;
|
||||
FlattenTo(&elements);
|
||||
|
||||
PRBool forceTransparentSurface = PR_FALSE;
|
||||
|
||||
for (PRInt32 i = elements.Length() - 1; i >= 0; --i) {
|
||||
nsDisplayItem* item = elements[i];
|
||||
nsDisplayItem* belowItem = i < 1 ? nsnull : elements[i - 1];
|
||||
@ -339,15 +341,18 @@ nsDisplayList::ComputeVisibilityForSublist(nsDisplayListBuilder* aBuilder,
|
||||
if (item->ComputeVisibility(aBuilder, aVisibleRegion)) {
|
||||
anyVisible = PR_TRUE;
|
||||
nsIFrame* f = item->GetUnderlyingFrame();
|
||||
if (item->IsOpaque(aBuilder) && f) {
|
||||
PRBool transparentBackground = PR_FALSE;
|
||||
if (item->IsOpaque(aBuilder, &transparentBackground) && f) {
|
||||
// Subtract opaque item from the visible region
|
||||
aBuilder->SubtractFromVisibleRegion(aVisibleRegion, nsRegion(bounds));
|
||||
}
|
||||
forceTransparentSurface = forceTransparentSurface || transparentBackground;
|
||||
}
|
||||
AppendToBottom(item);
|
||||
}
|
||||
|
||||
mIsOpaque = !aVisibleRegion->Intersects(mVisibleRect);
|
||||
mForceTransparentSurface = forceTransparentSurface;
|
||||
#ifdef DEBUG
|
||||
mDidComputeVisibility = PR_TRUE;
|
||||
#endif
|
||||
@ -845,10 +850,20 @@ nsDisplayBackground::ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsDisplayBackground::IsOpaque(nsDisplayListBuilder* aBuilder) {
|
||||
nsDisplayBackground::IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface) {
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
// theme background overrides any other background
|
||||
if (mIsThemed)
|
||||
if (mIsThemed) {
|
||||
if (aForceTransparentSurface) {
|
||||
const nsStyleDisplay* disp = mFrame->GetStyleDisplay();
|
||||
*aForceTransparentSurface = disp->mAppearance == NS_THEME_WIN_BORDERLESS_GLASS ||
|
||||
disp->mAppearance == NS_THEME_WIN_GLASS;
|
||||
}
|
||||
return mThemeTransparency == nsITheme::eOpaque;
|
||||
}
|
||||
|
||||
nsStyleContext* bgSC;
|
||||
if (!nsCSSRendering::FindBackground(mFrame->PresContext(), mFrame, &bgSC))
|
||||
@ -1230,7 +1245,11 @@ nsDisplayWrapList::ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsDisplayWrapList::IsOpaque(nsDisplayListBuilder* aBuilder) {
|
||||
nsDisplayWrapList::IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface) {
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
return mList.IsOpaque();
|
||||
}
|
||||
|
||||
@ -1369,7 +1388,11 @@ nsDisplayOpacity::~nsDisplayOpacity() {
|
||||
}
|
||||
#endif
|
||||
|
||||
PRBool nsDisplayOpacity::IsOpaque(nsDisplayListBuilder* aBuilder) {
|
||||
PRBool nsDisplayOpacity::IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface) {
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
// We are never opaque, if our opacity was < 1 then we wouldn't have
|
||||
// been created.
|
||||
return PR_FALSE;
|
||||
@ -1539,8 +1562,12 @@ nsDisplayClipRoundedRect::~nsDisplayClipRoundedRect()
|
||||
}
|
||||
#endif
|
||||
|
||||
PRBool nsDisplayClipRoundedRect::IsOpaque(nsDisplayListBuilder* aBuilder)
|
||||
PRBool nsDisplayClipRoundedRect::IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface)
|
||||
{
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
@ -1948,8 +1975,12 @@ nsRect nsDisplayTransform::GetBounds(nsDisplayListBuilder *aBuilder)
|
||||
*
|
||||
* We need b and c to be zero.
|
||||
*/
|
||||
PRBool nsDisplayTransform::IsOpaque(nsDisplayListBuilder *aBuilder)
|
||||
PRBool nsDisplayTransform::IsOpaque(nsDisplayListBuilder *aBuilder,
|
||||
PRBool* aForceTransparentSurface)
|
||||
{
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
const nsStyleDisplay* disp = mFrame->GetStyleDisplay();
|
||||
return disp->mTransform.GetMainMatrixEntry(1) == 0.0f &&
|
||||
disp->mTransform.GetMainMatrixEntry(2) == 0.0f &&
|
||||
@ -2078,8 +2109,12 @@ nsDisplaySVGEffects::~nsDisplaySVGEffects()
|
||||
}
|
||||
#endif
|
||||
|
||||
PRBool nsDisplaySVGEffects::IsOpaque(nsDisplayListBuilder* aBuilder)
|
||||
PRBool nsDisplaySVGEffects::IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface)
|
||||
{
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
|
@ -55,6 +55,7 @@
|
||||
#include "Layers.h"
|
||||
#include "nsRegion.h"
|
||||
#include "FrameLayerBuilder.h"
|
||||
#include "nsThemeConstants.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
@ -517,7 +518,14 @@ public:
|
||||
* @return PR_TRUE if the item is definitely opaque --- i.e., paints
|
||||
* every pixel within its bounds opaquely
|
||||
*/
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder) { return PR_FALSE; }
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull)
|
||||
{
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
return PR_FALSE;
|
||||
}
|
||||
/**
|
||||
* If this returns true, then aColor is set to the uniform color
|
||||
* @return PR_TRUE if the item is guaranteed to paint every pixel in its
|
||||
@ -894,6 +902,15 @@ public:
|
||||
NS_ASSERTION(mDidComputeVisibility, "Need to have called ComputeVisibility");
|
||||
return mIsOpaque;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if during ComputeVisibility any display item
|
||||
* set the surface to be transparent.
|
||||
*/
|
||||
PRBool NeedsTransparentSurface() const {
|
||||
NS_ASSERTION(mDidComputeVisibility, "Need to have called ComputeVisibility");
|
||||
return mForceTransparentSurface;
|
||||
}
|
||||
/**
|
||||
* Paint the list to the rendering context. We assume that (0,0) in aCtx
|
||||
* corresponds to the origin of the reference frame. For best results,
|
||||
@ -964,6 +981,10 @@ private:
|
||||
// is empty (i.e. everything that was visible is covered by some
|
||||
// opaque content in this list).
|
||||
PRPackedBool mIsOpaque;
|
||||
// This is set to true by ComputeVisibility if any display item in this
|
||||
// list needs to force the surface to be transparent (e.g. if the
|
||||
// item "punch holes" on the surface by clearing part of its area).
|
||||
PRPackedBool mForceTransparentSurface;
|
||||
#ifdef DEBUG
|
||||
PRPackedBool mDidComputeVisibility;
|
||||
#endif
|
||||
@ -1291,7 +1312,11 @@ public:
|
||||
|
||||
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder) { return mBounds; }
|
||||
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder) {
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aOutTransparentBackground = nsnull) {
|
||||
if (aOutTransparentBackground) {
|
||||
*aOutTransparentBackground = PR_FALSE;
|
||||
}
|
||||
return (NS_GET_A(mColor) == 255);
|
||||
}
|
||||
|
||||
@ -1308,6 +1333,7 @@ public:
|
||||
private:
|
||||
nsRect mBounds;
|
||||
nscolor mColor;
|
||||
PRBool mTransparentBackground;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1326,7 +1352,8 @@ public:
|
||||
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames);
|
||||
virtual PRBool ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
||||
nsRegion* aVisibleRegion);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull);
|
||||
virtual PRBool IsVaryingRelativeToMovingFrame(nsDisplayListBuilder* aBuilder,
|
||||
nsIFrame* aFrame);
|
||||
virtual PRBool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor);
|
||||
@ -1461,7 +1488,8 @@ public:
|
||||
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
||||
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames);
|
||||
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull);
|
||||
virtual PRBool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor);
|
||||
virtual PRBool IsVaryingRelativeToMovingFrame(nsDisplayListBuilder* aBuilder,
|
||||
nsIFrame* aFrame);
|
||||
@ -1544,7 +1572,8 @@ public:
|
||||
virtual ~nsDisplayOpacity();
|
||||
#endif
|
||||
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull);
|
||||
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
|
||||
LayerManager* aManager);
|
||||
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
|
||||
@ -1641,7 +1670,8 @@ public:
|
||||
virtual ~nsDisplayClipRoundedRect();
|
||||
#endif
|
||||
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull);
|
||||
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
||||
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames);
|
||||
virtual PRBool ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
||||
@ -1710,7 +1740,8 @@ public:
|
||||
virtual ~nsDisplaySVGEffects();
|
||||
#endif
|
||||
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull);
|
||||
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
||||
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames);
|
||||
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder) {
|
||||
@ -1768,7 +1799,8 @@ public:
|
||||
virtual void HitTest(nsDisplayListBuilder *aBuilder, const nsRect& aRect,
|
||||
HitTestState *aState, nsTArray<nsIFrame*> *aOutFrames);
|
||||
virtual nsRect GetBounds(nsDisplayListBuilder *aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder *aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder *aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull);
|
||||
virtual PRBool IsUniform(nsDisplayListBuilder *aBuilder, nscolor* aColor);
|
||||
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
|
||||
LayerManager* aManager);
|
||||
|
@ -3362,18 +3362,18 @@ nsLayoutUtils::GetFrameTransparency(nsIFrame* aBackgroundFrame,
|
||||
if (HasNonZeroCorner(aCSSRootFrame->GetStyleContext()->GetStyleBorder()->mBorderRadius))
|
||||
return eTransparencyTransparent;
|
||||
|
||||
nsITheme::Transparency transparency;
|
||||
if (aCSSRootFrame->IsThemed(&transparency))
|
||||
return transparency == nsITheme::eTransparent
|
||||
? eTransparencyTransparent
|
||||
: eTransparencyOpaque;
|
||||
|
||||
if (aCSSRootFrame->GetStyleDisplay()->mAppearance == NS_THEME_WIN_GLASS)
|
||||
return eTransparencyGlass;
|
||||
|
||||
if (aCSSRootFrame->GetStyleDisplay()->mAppearance == NS_THEME_WIN_BORDERLESS_GLASS)
|
||||
return eTransparencyBorderlessGlass;
|
||||
|
||||
nsITheme::Transparency transparency;
|
||||
if (aCSSRootFrame->IsThemed(&transparency))
|
||||
return transparency == nsITheme::eTransparent
|
||||
? eTransparencyTransparent
|
||||
: eTransparencyOpaque;
|
||||
|
||||
// We need an uninitialized window to be treated as opaque because
|
||||
// doing otherwise breaks window display effects on some platforms,
|
||||
// specifically Vista. (bug 450322)
|
||||
|
@ -177,8 +177,12 @@ public:
|
||||
return NS_GET_A(mExtraBackgroundColor) > 0 ||
|
||||
nsDisplayBackground::ComputeVisibility(aBuilder, aVisibleRegion);
|
||||
}
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder)
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull)
|
||||
{
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
return NS_GET_A(mExtraBackgroundColor) == 255 ||
|
||||
nsDisplayBackground::IsOpaque(aBuilder);
|
||||
}
|
||||
|
@ -77,7 +77,11 @@ public:
|
||||
|
||||
NS_DISPLAY_DECL_NAME("nsDisplayCanvas", TYPE_CANVAS)
|
||||
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder) {
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull) {
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
nsIFrame* f = GetUnderlyingFrame();
|
||||
nsHTMLCanvasElement *canvas = CanvasElementFromContent(f->GetContent());
|
||||
return canvas->GetIsOpaque();
|
||||
|
@ -1267,8 +1267,12 @@ nsDisplayPlugin::ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsDisplayPlugin::IsOpaque(nsDisplayListBuilder* aBuilder)
|
||||
nsDisplayPlugin::IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface)
|
||||
{
|
||||
if (aForceTransparentSurface) {
|
||||
*aForceTransparentSurface = PR_FALSE;
|
||||
}
|
||||
nsObjectFrame* f = static_cast<nsObjectFrame*>(mFrame);
|
||||
return f->IsOpaque();
|
||||
}
|
||||
|
@ -315,7 +315,8 @@ public:
|
||||
#endif
|
||||
|
||||
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
|
||||
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
|
||||
PRBool* aForceTransparentSurface = nsnull);
|
||||
virtual void Paint(nsDisplayListBuilder* aBuilder,
|
||||
nsIRenderingContext* aCtx);
|
||||
virtual PRBool ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
||||
|
@ -429,6 +429,8 @@ nsNativeThemeWin::GetTheme(PRUint8 aWidgetType)
|
||||
case NS_THEME_WINDOW_BUTTON_RESTORE:
|
||||
case NS_THEME_WINDOW_BUTTON_BOX:
|
||||
case NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED:
|
||||
case NS_THEME_WIN_GLASS:
|
||||
case NS_THEME_WIN_BORDERLESS_GLASS:
|
||||
return nsUXThemeData::GetTheme(eUXWindowFrame);
|
||||
}
|
||||
return NULL;
|
||||
@ -1090,6 +1092,8 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
|
||||
return NS_OK;
|
||||
case NS_THEME_WINDOW_BUTTON_BOX:
|
||||
case NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED:
|
||||
case NS_THEME_WIN_GLASS:
|
||||
case NS_THEME_WIN_BORDERLESS_GLASS:
|
||||
aPart = -1;
|
||||
aState = 0;
|
||||
return NS_OK;
|
||||
@ -1114,6 +1118,37 @@ nsNativeThemeWin::DrawWidgetBackground(nsIRenderingContext* aContext,
|
||||
if (!nsUXThemeData::drawThemeBG)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
#if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
|
||||
// ^^ without the right sdk, assume xp theming and fall through.
|
||||
if (nsUXThemeData::CheckForCompositor()) {
|
||||
switch (aWidgetType) {
|
||||
case NS_THEME_WINDOW_TITLEBAR:
|
||||
case NS_THEME_WINDOW_TITLEBAR_MAXIMIZED:
|
||||
case NS_THEME_WINDOW_FRAME_LEFT:
|
||||
case NS_THEME_WINDOW_FRAME_RIGHT:
|
||||
case NS_THEME_WINDOW_FRAME_BOTTOM:
|
||||
// Nothing to draw, these areas are glass. Minimum dimensions
|
||||
// should be set, so xul content should be layed out correctly.
|
||||
return NS_OK;
|
||||
break;
|
||||
case NS_THEME_WINDOW_BUTTON_CLOSE:
|
||||
case NS_THEME_WINDOW_BUTTON_MINIMIZE:
|
||||
case NS_THEME_WINDOW_BUTTON_MAXIMIZE:
|
||||
case NS_THEME_WINDOW_BUTTON_RESTORE:
|
||||
// Not conventional bitmaps, can't be retrieved. If we fall
|
||||
// through here and call the theme library we'll get aero
|
||||
// basic bitmaps.
|
||||
return NS_OK;
|
||||
break;
|
||||
case NS_THEME_WIN_GLASS:
|
||||
case NS_THEME_WIN_BORDERLESS_GLASS:
|
||||
// Nothing to draw, this is the glass background.
|
||||
return NS_OK;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif // MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
|
||||
|
||||
PRInt32 part, state;
|
||||
nsresult rv = GetThemePartAndState(aFrame, aWidgetType, part, state);
|
||||
if (NS_FAILED(rv))
|
||||
@ -1143,32 +1178,6 @@ nsNativeThemeWin::DrawWidgetBackground(nsIRenderingContext* aContext,
|
||||
dr.size.height += 2.0;
|
||||
}
|
||||
|
||||
#if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
|
||||
// ^^ without the right sdk, assume xp theming and fall through.
|
||||
if (nsUXThemeData::CheckForCompositor()) {
|
||||
switch (aWidgetType) {
|
||||
case NS_THEME_WINDOW_TITLEBAR:
|
||||
case NS_THEME_WINDOW_TITLEBAR_MAXIMIZED:
|
||||
case NS_THEME_WINDOW_FRAME_LEFT:
|
||||
case NS_THEME_WINDOW_FRAME_RIGHT:
|
||||
case NS_THEME_WINDOW_FRAME_BOTTOM:
|
||||
// Nothing to draw, these areas are glass. Minimum dimensions
|
||||
// should be set, so xul content should be layed out correctly.
|
||||
return NS_OK;
|
||||
break;
|
||||
case NS_THEME_WINDOW_BUTTON_CLOSE:
|
||||
case NS_THEME_WINDOW_BUTTON_MINIMIZE:
|
||||
case NS_THEME_WINDOW_BUTTON_MAXIMIZE:
|
||||
case NS_THEME_WINDOW_BUTTON_RESTORE:
|
||||
// Not conventional bitmaps, can't be retrieved. If we fall
|
||||
// through here and call the theme library we'll get aero
|
||||
// basic bitmaps.
|
||||
return NS_OK;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif // MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
|
||||
|
||||
nsRefPtr<gfxContext> ctx = aContext->ThebesContext();
|
||||
|
||||
gfxWindowsNativeDrawing nativeDrawing(ctx, dr, GetWidgetNativeDrawingFlags(aWidgetType));
|
||||
@ -1489,7 +1498,8 @@ nsNativeThemeWin::GetWidgetBorder(nsIDeviceContext* aContext,
|
||||
aWidgetType == NS_THEME_MENUITEM || aWidgetType == NS_THEME_CHECKMENUITEM ||
|
||||
aWidgetType == NS_THEME_RADIOMENUITEM || aWidgetType == NS_THEME_MENUPOPUP ||
|
||||
aWidgetType == NS_THEME_MENUIMAGE || aWidgetType == NS_THEME_MENUITEMTEXT ||
|
||||
aWidgetType == NS_THEME_TOOLBAR_SEPARATOR)
|
||||
aWidgetType == NS_THEME_TOOLBAR_SEPARATOR ||
|
||||
aWidgetType == NS_THEME_WIN_GLASS || aWidgetType == NS_THEME_WIN_BORDERLESS_GLASS)
|
||||
return NS_OK; // Don't worry about it.
|
||||
|
||||
if (!nsUXThemeData::getThemeContentRect)
|
||||
@ -1769,6 +1779,8 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsIRenderingContext* aContext, nsIFrame*
|
||||
case NS_THEME_LISTBOX:
|
||||
case NS_THEME_TREEVIEW:
|
||||
case NS_THEME_MENUITEMTEXT:
|
||||
case NS_THEME_WIN_GLASS:
|
||||
case NS_THEME_WIN_BORDERLESS_GLASS:
|
||||
return NS_OK; // Don't worry about it.
|
||||
}
|
||||
|
||||
@ -1990,7 +2002,9 @@ nsNativeThemeWin::WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType,
|
||||
aWidgetType == NS_THEME_TOOLTIP ||
|
||||
aWidgetType == NS_THEME_TAB_PANELS ||
|
||||
aWidgetType == NS_THEME_TAB_PANEL ||
|
||||
aWidgetType == NS_THEME_TOOLBAR_SEPARATOR) {
|
||||
aWidgetType == NS_THEME_TOOLBAR_SEPARATOR ||
|
||||
aWidgetType == NS_THEME_WIN_GLASS ||
|
||||
aWidgetType == NS_THEME_WIN_BORDERLESS_GLASS) {
|
||||
*aShouldRepaint = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
@ -2118,6 +2132,9 @@ nsNativeThemeWin::GetWidgetTransparency(nsIFrame* aFrame, PRUint8 aWidgetType)
|
||||
// true across all Windows themes! If it's not true, we should
|
||||
// paint an opaque background for them to make it true!
|
||||
return eOpaque;
|
||||
case NS_THEME_WIN_GLASS:
|
||||
case NS_THEME_WIN_BORDERLESS_GLASS:
|
||||
return eTransparent;
|
||||
}
|
||||
|
||||
HANDLE theme = GetTheme(aWidgetType);
|
||||
|
Loading…
x
Reference in New Issue
Block a user