diff --git a/gfx/public/nsITheme.h b/gfx/public/nsITheme.h index cf3ca7448712..b5455d884d01 100644 --- a/gfx/public/nsITheme.h +++ b/gfx/public/nsITheme.h @@ -57,14 +57,20 @@ class nsIContent; class nsIAtom; // IID for the nsITheme interface -// {df8baf21-5ea7-49eb-a2bc-f2fd4a9fd896} +// {f5eb2e02-ed3f-4340-82fc-22f55bb556f9} #define NS_ITHEME_IID \ -{ 0xdf8baf21, 0x5ea7, 0x49eb, { 0xa2, 0xbc, 0xf2, 0xfd, 0x4a, 0x9f, 0xd8, 0x96 } } +{ 0xf5eb2e02, 0xed3f, 0x4340, { 0x82, 0xfc, 0x22, 0xf5, 0x5b, 0xb5, 0x56, 0xf9 } } // {D930E29B-6909-44e5-AB4B-AF10D6923705} #define NS_THEMERENDERER_CID \ { 0xd930e29b, 0x6909, 0x44e5, { 0xab, 0x4b, 0xaf, 0x10, 0xd6, 0x92, 0x37, 0x5 } } +enum nsTransparencyMode { + eTransparencyOpaque = 0, // Fully opaque + eTransparencyTransparent, // Parts of the window may be transparent + eTransparencyGlass // Transparent parts of the window have Vista AeroGlass effect applied +}; + /** * nsITheme is a service that provides platform-specific native * rendering for widgets. In other words, it provides the necessary @@ -133,6 +139,8 @@ public: nsSize* aResult, PRBool* aIsOverridable)=0; + virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType)=0; + NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType, nsIAtom* aAttribute, PRBool* aShouldRepaint)=0; diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index a94b7d37040b..7b1a3447da5d 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -2948,8 +2948,9 @@ nsLayoutUtils::GetFrameTransparency(nsIFrame* aFrame) { if (HasNonZeroCorner(aFrame->GetStyleContext()->GetStyleBorder()->mBorderRadius)) return eTransparencyTransparent; - if (aFrame->IsThemed()) - return eTransparencyOpaque; + nsTransparencyMode transparency; + if (aFrame->IsThemed(&transparency)) + return transparency; if (aFrame->GetStyleDisplay()->mAppearance == NS_THEME_WIN_GLASS) return eTransparencyGlass; diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index dd8335fe9234..d9f2b5398d48 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -842,15 +842,20 @@ public: const nsRect& aDirtyRect, const nsDisplayListSet& aLists); - PRBool IsThemed() { - return IsThemed(GetStyleDisplay()); + PRBool IsThemed(nsTransparencyMode* aTransparencyMode = nsnull) { + return IsThemed(GetStyleDisplay(), aTransparencyMode); } - PRBool IsThemed(const nsStyleDisplay* aDisp) { + PRBool IsThemed(const nsStyleDisplay* aDisp, + nsTransparencyMode* aTransparencyMode = nsnull) { if (!aDisp->mAppearance) return PR_FALSE; nsPresContext* pc = PresContext(); nsITheme *theme = pc->GetTheme(); - return theme && theme->ThemeSupportsWidget(pc, this, aDisp->mAppearance); + if(!theme || !theme->ThemeSupportsWidget(pc, this, aDisp->mAppearance)) + return PR_FALSE; + if (aTransparencyMode) + *aTransparencyMode = theme->GetWidgetTransparency(aDisp->mAppearance); + return PR_TRUE; } /** diff --git a/widget/public/nsIWidget.h b/widget/public/nsIWidget.h index ea61dc8bd777..24640007b9cc 100644 --- a/widget/public/nsIWidget.h +++ b/widget/public/nsIWidget.h @@ -46,6 +46,7 @@ #include "prthread.h" #include "nsEvent.h" #include "nsCOMPtr.h" +#include "nsITheme.h" // forward declarations class nsIAppShell; @@ -237,12 +238,6 @@ enum nsTopLevelWidgetZPlacement { // for PlaceBehind() eZPlacementTop // top of the window stack }; -enum nsTransparencyMode { - eTransparencyOpaque = 0, // Fully opaque - eTransparencyTransparent, // Parts of the window may be transparent - eTransparencyGlass // Transparent parts of the window have Vista AeroGlass effect applied -}; - /** * Basic struct for widget initialization data. * @see Create member function of nsIWidget diff --git a/widget/src/cocoa/nsChildView.mm b/widget/src/cocoa/nsChildView.mm index eaf4e4f6f543..b30bec48f0e1 100644 --- a/widget/src/cocoa/nsChildView.mm +++ b/widget/src/cocoa/nsChildView.mm @@ -2933,7 +2933,7 @@ NSEvent* gLastDragEvent = nil; static const PRInt32 sShadowInvalidationInterval = 100; - (void)maybeInvalidateShadow { - if (!mIsTransparent || ![mWindow hasShadow]) + if ([mWindow isOpaque] || ![mWindow hasShadow]) return; PRIntervalTime now = PR_IntervalNow(); diff --git a/widget/src/cocoa/nsNativeThemeCocoa.h b/widget/src/cocoa/nsNativeThemeCocoa.h index fb18cdf9bf23..10ef79f8ef0d 100644 --- a/widget/src/cocoa/nsNativeThemeCocoa.h +++ b/widget/src/cocoa/nsNativeThemeCocoa.h @@ -88,6 +88,7 @@ public: PRBool WidgetIsContainer(PRUint8 aWidgetType); PRBool ThemeDrawsFocusForWidget(nsPresContext* aPresContext, nsIFrame* aFrame, PRUint8 aWidgetType); PRBool ThemeNeedsComboboxDropmarker(); + virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType); protected: diff --git a/widget/src/cocoa/nsNativeThemeCocoa.mm b/widget/src/cocoa/nsNativeThemeCocoa.mm index 9e70dabdc82d..a51d5b955b49 100644 --- a/widget/src/cocoa/nsNativeThemeCocoa.mm +++ b/widget/src/cocoa/nsNativeThemeCocoa.mm @@ -1439,8 +1439,10 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsIRenderingContext* aContext, nsIFrame version: 0, menuType: IsDisabled(aFrame) ? kThemeMenuTypeInactive : kThemeMenuTypePopUp }; - - HIThemeDrawMenuBackground(&macRect, &mdi, cgContext, HITHEME_ORIENTATION); + // The rounded corners draw outside the frame. + CGRect deflatedRect = CGRectMake(macRect.origin.x, macRect.origin.y + 4, + macRect.size.width, macRect.size.height - 8); + HIThemeDrawMenuBackground(&deflatedRect, &mdi, cgContext, HITHEME_ORIENTATION); } break; @@ -2288,3 +2290,12 @@ nsNativeThemeCocoa::ThemeNeedsComboboxDropmarker() { return PR_FALSE; } + +nsTransparencyMode +nsNativeThemeCocoa::GetWidgetTransparency(PRUint8 aWidgetType) +{ + if (aWidgetType == NS_THEME_MENUPOPUP) + return eTransparencyTransparent; + + return eTransparencyOpaque; +} diff --git a/widget/src/gtk2/nsNativeThemeGTK.cpp b/widget/src/gtk2/nsNativeThemeGTK.cpp index c335d4854c65..b837bb9742c9 100644 --- a/widget/src/gtk2/nsNativeThemeGTK.cpp +++ b/widget/src/gtk2/nsNativeThemeGTK.cpp @@ -1314,3 +1314,9 @@ nsNativeThemeGTK::ThemeNeedsComboboxDropmarker() { return PR_FALSE; } + +nsTransparencyMode +nsNativeThemeGTK::GetWidgetTransparency(PRUint8 aWidgetType) +{ + return eTransparencyOpaque; +} diff --git a/widget/src/gtk2/nsNativeThemeGTK.h b/widget/src/gtk2/nsNativeThemeGTK.h index 291b0bc651da..eb3658d30668 100644 --- a/widget/src/gtk2/nsNativeThemeGTK.h +++ b/widget/src/gtk2/nsNativeThemeGTK.h @@ -92,6 +92,8 @@ public: PRBool ThemeNeedsComboboxDropmarker(); + virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType); + nsNativeThemeGTK(); virtual ~nsNativeThemeGTK(); diff --git a/widget/src/qt/nsNativeThemeQt.cpp b/widget/src/qt/nsNativeThemeQt.cpp index d0d8624e7078..ca35aa4081bc 100644 --- a/widget/src/qt/nsNativeThemeQt.cpp +++ b/widget/src/qt/nsNativeThemeQt.cpp @@ -563,6 +563,12 @@ nsNativeThemeQt::ThemeNeedsComboboxDropmarker() return PR_TRUE; } +nsTransparencyMode +nsNativeThemeQt::GetWidgetTransparency(PRUint8 aWidgetType) +{ + return eTransparencyOpaque; +} + void nsNativeThemeQt::InitButtonStyle(PRUint8 aWidgetType, nsIFrame* aFrame, diff --git a/widget/src/qt/nsNativeThemeQt.h b/widget/src/qt/nsNativeThemeQt.h index 49cfe96957ce..a513184f281c 100644 --- a/widget/src/qt/nsNativeThemeQt.h +++ b/widget/src/qt/nsNativeThemeQt.h @@ -99,6 +99,8 @@ public: PRBool ThemeNeedsComboboxDropmarker(); + virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType); + nsNativeThemeQt(); virtual ~nsNativeThemeQt(); diff --git a/widget/src/windows/nsNativeThemeWin.cpp b/widget/src/windows/nsNativeThemeWin.cpp index 3a8e41f3acbe..91c518c6403a 100644 --- a/widget/src/windows/nsNativeThemeWin.cpp +++ b/widget/src/windows/nsNativeThemeWin.cpp @@ -1650,6 +1650,12 @@ nsNativeThemeWin::ThemeNeedsComboboxDropmarker() return PR_TRUE; } +nsTransparencyMode +nsNativeThemeWin::GetWidgetTransparency(PRUint8 aWidgetType) +{ + return eTransparencyOpaque; +} + /* Windows 9x/NT/2000/Classic XP Theme Support */ PRBool diff --git a/widget/src/windows/nsNativeThemeWin.h b/widget/src/windows/nsNativeThemeWin.h index b0e7993af3ba..b02e9ad93129 100644 --- a/widget/src/windows/nsNativeThemeWin.h +++ b/widget/src/windows/nsNativeThemeWin.h @@ -75,6 +75,8 @@ public: nsSize* aResult, PRBool* aIsOverridable); + virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType); + NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType, nsIAtom* aAttribute, PRBool* aShouldRepaint);