зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1045213 - Add nsITheme::ThemeGeometryTypeForWidget. r=roc
This commit is contained in:
Родитель
fd3d5eb0f0
Коммит
2f12e52126
|
@ -28,10 +28,10 @@ class nsIAtom;
|
|||
class nsIWidget;
|
||||
|
||||
// IID for the nsITheme interface
|
||||
// {cc3a6c72-50c2-414d-b9f2-b778a5e0f136}
|
||||
// {a21dd936-5960-46da-a724-7c114e421b41}
|
||||
#define NS_ITHEME_IID \
|
||||
{ 0xcc3a6c72, 0x50c2, 0x414d, \
|
||||
{ 0xb9, 0xf2, 0xb7, 0x78, 0xa5, 0xe0, 0xf1, 0x36 } }
|
||||
{ 0xa21dd936, 0x5960, 0x46da, \
|
||||
{ 0xa7, 0x24, 0x7c, 0x11, 0x4e, 0x42, 0x1b, 0x41 } }
|
||||
// {0ae05515-cf7a-45a8-9e02-6556de7685b1}
|
||||
#define NS_THEMERENDERER_CID \
|
||||
{ 0x0ae05515, 0xcf7a, 0x45a8, \
|
||||
|
@ -147,6 +147,33 @@ public:
|
|||
uint8_t aWidgetType, nscolor* aColor)
|
||||
{ return false; }
|
||||
|
||||
/**
|
||||
* ThemeGeometryType values are used for describing themed nsIFrames in
|
||||
* calls to nsIWidget::UpdateThemeGeometries. We don't simply pass the
|
||||
* -moz-appearance value ("widget type") of the frame because the widget may
|
||||
* want to treat different frames with the same -moz-appearance differently
|
||||
* based on other properties of the frame. So we give the theme a first look
|
||||
* at the frame in nsITheme::ThemeGeometryTypeForWidget and pass the
|
||||
* returned ThemeGeometryType along to the widget.
|
||||
* Each theme backend defines the ThemeGeometryType values it needs in its
|
||||
* own nsITheme subclass. eThemeGeometryTypeUnknown is the only value that's
|
||||
* shared between backends.
|
||||
*/
|
||||
typedef uint8_t ThemeGeometryType;
|
||||
enum {
|
||||
eThemeGeometryTypeUnknown = 0
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the theme geometry type that should be used in the ThemeGeometry
|
||||
* array that's passed to the widget using nsIWidget::UpdateThemeGeometries.
|
||||
* A return value of eThemeGeometryTypeUnknown means that this frame will
|
||||
* not be included in the ThemeGeometry array.
|
||||
*/
|
||||
virtual ThemeGeometryType ThemeGeometryTypeForWidget(nsIFrame* aFrame,
|
||||
uint8_t aWidgetType)
|
||||
{ return eThemeGeometryTypeUnknown; }
|
||||
|
||||
/**
|
||||
* Can the nsITheme implementation handle this widget?
|
||||
*/
|
||||
|
|
|
@ -2114,12 +2114,13 @@ nsDisplaySolidColor::WriteDebugInfo(std::stringstream& aStream)
|
|||
}
|
||||
|
||||
static void
|
||||
RegisterThemeGeometry(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame)
|
||||
RegisterThemeGeometry(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
|
||||
nsITheme::ThemeGeometryType aType)
|
||||
{
|
||||
if (aBuilder->IsInRootChromeDocument() && !aBuilder->IsInTransform()) {
|
||||
nsIFrame* displayRoot = nsLayoutUtils::GetDisplayRootFrame(aFrame);
|
||||
nsRect borderBox(aFrame->GetOffsetTo(displayRoot), aFrame->GetSize());
|
||||
aBuilder->RegisterThemeGeometry(aFrame->StyleDisplay()->mAppearance,
|
||||
aBuilder->RegisterThemeGeometry(aType,
|
||||
borderBox.ToNearestPixels(aFrame->PresContext()->AppUnitsPerDevPixel()));
|
||||
}
|
||||
}
|
||||
|
@ -2792,25 +2793,16 @@ nsDisplayThemedBackground::nsDisplayThemedBackground(nsDisplayListBuilder* aBuil
|
|||
mFrame->IsThemed(disp, &mThemeTransparency);
|
||||
|
||||
// Perform necessary RegisterThemeGeometry
|
||||
switch (disp->mAppearance) {
|
||||
case NS_THEME_MOZ_MAC_UNIFIED_TOOLBAR:
|
||||
case NS_THEME_TOOLBAR:
|
||||
case NS_THEME_TOOLTIP:
|
||||
case NS_THEME_MENUPOPUP:
|
||||
case NS_THEME_MENUITEM:
|
||||
case NS_THEME_CHECKMENUITEM:
|
||||
case NS_THEME_WINDOW_TITLEBAR:
|
||||
case NS_THEME_WINDOW_BUTTON_BOX:
|
||||
case NS_THEME_MOZ_MAC_FULLSCREEN_BUTTON:
|
||||
case NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED:
|
||||
case NS_THEME_MAC_VIBRANCY_LIGHT:
|
||||
case NS_THEME_MAC_VIBRANCY_DARK:
|
||||
RegisterThemeGeometry(aBuilder, aFrame);
|
||||
break;
|
||||
case NS_THEME_WIN_BORDERLESS_GLASS:
|
||||
case NS_THEME_WIN_GLASS:
|
||||
aBuilder->SetGlassDisplayItem(this);
|
||||
break;
|
||||
nsITheme* theme = mFrame->PresContext()->GetTheme();
|
||||
nsITheme::ThemeGeometryType type =
|
||||
theme->ThemeGeometryTypeForWidget(mFrame, disp->mAppearance);
|
||||
if (type != nsITheme::eThemeGeometryTypeUnknown) {
|
||||
RegisterThemeGeometry(aBuilder, aFrame, type);
|
||||
}
|
||||
|
||||
if (disp->mAppearance == NS_THEME_WIN_BORDERLESS_GLASS ||
|
||||
disp->mAppearance == NS_THEME_WIN_GLASS) {
|
||||
aBuilder->SetGlassDisplayItem(this);
|
||||
}
|
||||
|
||||
mBounds = GetBoundsInternal();
|
||||
|
|
|
@ -277,8 +277,8 @@ typedef NSInteger NSEventGestureAxis;
|
|||
|
||||
- (BOOL)isCoveringTitlebar;
|
||||
|
||||
- (NSColor*)vibrancyFillColorForWidgetType:(uint8_t)aWidgetType;
|
||||
- (NSColor*)vibrancyFontSmoothingBackgroundColorForWidgetType:(uint8_t)aWidgetType;
|
||||
- (NSColor*)vibrancyFillColorForThemeGeometryType:(nsITheme::ThemeGeometryType)aThemeGeometryType;
|
||||
- (NSColor*)vibrancyFontSmoothingBackgroundColorForThemeGeometryType:(nsITheme::ThemeGeometryType)aThemeGeometryType;
|
||||
|
||||
// Simple gestures support
|
||||
//
|
||||
|
@ -502,8 +502,8 @@ public:
|
|||
}
|
||||
|
||||
void ClearVibrantAreas();
|
||||
NSColor* VibrancyFillColorForWidgetType(uint8_t aWidgetType);
|
||||
NSColor* VibrancyFontSmoothingBackgroundColorForWidgetType(uint8_t aWidgetType);
|
||||
NSColor* VibrancyFillColorForThemeGeometryType(nsITheme::ThemeGeometryType aThemeGeometryType);
|
||||
NSColor* VibrancyFontSmoothingBackgroundColorForThemeGeometryType(nsITheme::ThemeGeometryType aThemeGeometryType);
|
||||
|
||||
// unit conversion convenience functions
|
||||
int32_t CocoaPointsToDevPixels(CGFloat aPts) const {
|
||||
|
|
|
@ -88,6 +88,7 @@
|
|||
#include "nsLayoutUtils.h"
|
||||
#include "InputData.h"
|
||||
#include "VibrancyManager.h"
|
||||
#include "nsNativeThemeCocoa.h"
|
||||
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::layers;
|
||||
|
@ -2276,7 +2277,7 @@ FindTitlebarBottom(const nsTArray<nsIWidget::ThemeGeometry>& aThemeGeometries,
|
|||
int32_t titlebarBottom = 0;
|
||||
for (uint32_t i = 0; i < aThemeGeometries.Length(); ++i) {
|
||||
const nsIWidget::ThemeGeometry& g = aThemeGeometries[i];
|
||||
if ((g.mWidgetType == NS_THEME_WINDOW_TITLEBAR) &&
|
||||
if ((g.mType == nsNativeThemeCocoa::eThemeGeometryTypeTitlebar) &&
|
||||
g.mRect.X() <= 0 &&
|
||||
g.mRect.XMost() >= aWindowWidth &&
|
||||
g.mRect.Y() <= 0) {
|
||||
|
@ -2293,8 +2294,7 @@ FindUnifiedToolbarBottom(const nsTArray<nsIWidget::ThemeGeometry>& aThemeGeometr
|
|||
int32_t unifiedToolbarBottom = aTitlebarBottom;
|
||||
for (uint32_t i = 0; i < aThemeGeometries.Length(); ++i) {
|
||||
const nsIWidget::ThemeGeometry& g = aThemeGeometries[i];
|
||||
if ((g.mWidgetType == NS_THEME_MOZ_MAC_UNIFIED_TOOLBAR ||
|
||||
g.mWidgetType == NS_THEME_TOOLBAR) &&
|
||||
if ((g.mType == nsNativeThemeCocoa::eThemeGeometryTypeToolbar) &&
|
||||
g.mRect.X() <= 0 &&
|
||||
g.mRect.XMost() >= aWindowWidth &&
|
||||
g.mRect.Y() <= aTitlebarBottom) {
|
||||
|
@ -2306,11 +2306,11 @@ FindUnifiedToolbarBottom(const nsTArray<nsIWidget::ThemeGeometry>& aThemeGeometr
|
|||
|
||||
static nsIntRect
|
||||
FindFirstRectOfType(const nsTArray<nsIWidget::ThemeGeometry>& aThemeGeometries,
|
||||
uint8_t aWidgetType)
|
||||
nsITheme::ThemeGeometryType aThemeGeometryType)
|
||||
{
|
||||
for (uint32_t i = 0; i < aThemeGeometries.Length(); ++i) {
|
||||
const nsIWidget::ThemeGeometry& g = aThemeGeometries[i];
|
||||
if (g.mWidgetType == aWidgetType) {
|
||||
if (g.mType == aThemeGeometryType) {
|
||||
return g.mRect;
|
||||
}
|
||||
}
|
||||
|
@ -2342,20 +2342,20 @@ nsChildView::UpdateThemeGeometries(const nsTArray<ThemeGeometry>& aThemeGeometri
|
|||
[win setUnifiedToolbarHeight:DevPixelsToCocoaPoints(devUnifiedHeight)];
|
||||
|
||||
// Update titlebar control offsets.
|
||||
nsIntRect windowButtonRect = FindFirstRectOfType(aThemeGeometries, NS_THEME_WINDOW_BUTTON_BOX);
|
||||
nsIntRect windowButtonRect = FindFirstRectOfType(aThemeGeometries, nsNativeThemeCocoa::eThemeGeometryTypeWindowButtons);
|
||||
[win placeWindowButtons:[mView convertRect:DevPixelsToCocoaPoints(windowButtonRect) toView:nil]];
|
||||
nsIntRect fullScreenButtonRect = FindFirstRectOfType(aThemeGeometries, NS_THEME_MOZ_MAC_FULLSCREEN_BUTTON);
|
||||
nsIntRect fullScreenButtonRect = FindFirstRectOfType(aThemeGeometries, nsNativeThemeCocoa::eThemeGeometryTypeFullscreenButton);
|
||||
[win placeFullScreenButton:[mView convertRect:DevPixelsToCocoaPoints(fullScreenButtonRect) toView:nil]];
|
||||
}
|
||||
|
||||
static nsIntRegion
|
||||
GatherThemeGeometryRegion(const nsTArray<nsIWidget::ThemeGeometry>& aThemeGeometries,
|
||||
uint8_t aWidgetType)
|
||||
nsITheme::ThemeGeometryType aThemeGeometryType)
|
||||
{
|
||||
nsIntRegion region;
|
||||
for (size_t i = 0; i < aThemeGeometries.Length(); ++i) {
|
||||
const nsIWidget::ThemeGeometry& g = aThemeGeometries[i];
|
||||
if (g.mWidgetType == aWidgetType) {
|
||||
if (g.mType == aThemeGeometryType) {
|
||||
region.OrWith(g.mRect);
|
||||
}
|
||||
}
|
||||
|
@ -2370,15 +2370,13 @@ nsChildView::UpdateVibrancy(const nsTArray<ThemeGeometry>& aThemeGeometries)
|
|||
}
|
||||
|
||||
nsIntRegion vibrantLightRegion =
|
||||
GatherThemeGeometryRegion(aThemeGeometries, NS_THEME_MAC_VIBRANCY_LIGHT);
|
||||
GatherThemeGeometryRegion(aThemeGeometries, nsNativeThemeCocoa::eThemeGeometryTypeVibrancyLight);
|
||||
nsIntRegion vibrantDarkRegion =
|
||||
GatherThemeGeometryRegion(aThemeGeometries, NS_THEME_MAC_VIBRANCY_DARK);
|
||||
GatherThemeGeometryRegion(aThemeGeometries, nsNativeThemeCocoa::eThemeGeometryTypeVibrancyDark);
|
||||
nsIntRegion menuRegion =
|
||||
GatherThemeGeometryRegion(aThemeGeometries, NS_THEME_MENUPOPUP).OrWith(
|
||||
GatherThemeGeometryRegion(aThemeGeometries, NS_THEME_MENUITEM).OrWith(
|
||||
GatherThemeGeometryRegion(aThemeGeometries, NS_THEME_CHECKMENUITEM)));
|
||||
GatherThemeGeometryRegion(aThemeGeometries, nsNativeThemeCocoa::eThemeGeometryTypeMenu);
|
||||
nsIntRegion tooltipRegion =
|
||||
GatherThemeGeometryRegion(aThemeGeometries, NS_THEME_TOOLTIP);
|
||||
GatherThemeGeometryRegion(aThemeGeometries, nsNativeThemeCocoa::eThemeGeometryTypeTooltip);
|
||||
|
||||
vibrantDarkRegion.SubOut(vibrantLightRegion);
|
||||
vibrantDarkRegion.SubOut(menuRegion);
|
||||
|
@ -2403,18 +2401,16 @@ nsChildView::ClearVibrantAreas()
|
|||
}
|
||||
|
||||
static VibrancyType
|
||||
WidgetTypeToVibrancyType(uint8_t aWidgetType)
|
||||
ThemeGeometryTypeToVibrancyType(nsITheme::ThemeGeometryType aThemeGeometryType)
|
||||
{
|
||||
switch (aWidgetType) {
|
||||
case NS_THEME_MAC_VIBRANCY_LIGHT:
|
||||
switch (aThemeGeometryType) {
|
||||
case nsNativeThemeCocoa::eThemeGeometryTypeVibrancyLight:
|
||||
return VibrancyType::LIGHT;
|
||||
case NS_THEME_MAC_VIBRANCY_DARK:
|
||||
case nsNativeThemeCocoa::eThemeGeometryTypeVibrancyDark:
|
||||
return VibrancyType::DARK;
|
||||
case NS_THEME_TOOLTIP:
|
||||
case nsNativeThemeCocoa::eThemeGeometryTypeTooltip:
|
||||
return VibrancyType::TOOLTIP;
|
||||
case NS_THEME_MENUPOPUP:
|
||||
case NS_THEME_MENUITEM:
|
||||
case NS_THEME_CHECKMENUITEM:
|
||||
case nsNativeThemeCocoa::eThemeGeometryTypeMenu:
|
||||
return VibrancyType::MENU;
|
||||
default:
|
||||
MOZ_CRASH();
|
||||
|
@ -2422,21 +2418,21 @@ WidgetTypeToVibrancyType(uint8_t aWidgetType)
|
|||
}
|
||||
|
||||
NSColor*
|
||||
nsChildView::VibrancyFillColorForWidgetType(uint8_t aWidgetType)
|
||||
nsChildView::VibrancyFillColorForThemeGeometryType(nsITheme::ThemeGeometryType aThemeGeometryType)
|
||||
{
|
||||
if (VibrancyManager::SystemSupportsVibrancy()) {
|
||||
return EnsureVibrancyManager().VibrancyFillColorForType(
|
||||
WidgetTypeToVibrancyType(aWidgetType));
|
||||
ThemeGeometryTypeToVibrancyType(aThemeGeometryType));
|
||||
}
|
||||
return [NSColor whiteColor];
|
||||
}
|
||||
|
||||
NSColor*
|
||||
nsChildView::VibrancyFontSmoothingBackgroundColorForWidgetType(uint8_t aWidgetType)
|
||||
nsChildView::VibrancyFontSmoothingBackgroundColorForThemeGeometryType(nsITheme::ThemeGeometryType aThemeGeometryType)
|
||||
{
|
||||
if (VibrancyManager::SystemSupportsVibrancy()) {
|
||||
return EnsureVibrancyManager().VibrancyFontSmoothingBackgroundColorForType(
|
||||
WidgetTypeToVibrancyType(aWidgetType));
|
||||
ThemeGeometryTypeToVibrancyType(aThemeGeometryType));
|
||||
}
|
||||
return [NSColor clearColor];
|
||||
}
|
||||
|
@ -3256,20 +3252,20 @@ NSEvent* gLastDragMouseDownEvent = nil;
|
|||
[(BaseWindow*)[self window] drawsContentsIntoWindowFrame];
|
||||
}
|
||||
|
||||
- (NSColor*)vibrancyFillColorForWidgetType:(uint8_t)aWidgetType
|
||||
- (NSColor*)vibrancyFillColorForThemeGeometryType:(nsITheme::ThemeGeometryType)aThemeGeometryType
|
||||
{
|
||||
if (!mGeckoChild) {
|
||||
return [NSColor whiteColor];
|
||||
}
|
||||
return mGeckoChild->VibrancyFillColorForWidgetType(aWidgetType);
|
||||
return mGeckoChild->VibrancyFillColorForThemeGeometryType(aThemeGeometryType);
|
||||
}
|
||||
|
||||
- (NSColor*)vibrancyFontSmoothingBackgroundColorForWidgetType:(uint8_t)aWidgetType
|
||||
- (NSColor*)vibrancyFontSmoothingBackgroundColorForThemeGeometryType:(nsITheme::ThemeGeometryType)aThemeGeometryType
|
||||
{
|
||||
if (!mGeckoChild) {
|
||||
return [NSColor clearColor];
|
||||
}
|
||||
return mGeckoChild->VibrancyFontSmoothingBackgroundColorForWidgetType(aWidgetType);
|
||||
return mGeckoChild->VibrancyFontSmoothingBackgroundColorForThemeGeometryType(aThemeGeometryType);
|
||||
}
|
||||
|
||||
- (nsIntRegion)nativeDirtyRegionWithBoundingRect:(NSRect)aRect
|
||||
|
|
|
@ -28,6 +28,18 @@ class nsNativeThemeCocoa : private nsNativeTheme,
|
|||
public nsITheme
|
||||
{
|
||||
public:
|
||||
enum {
|
||||
eThemeGeometryTypeTitlebar = eThemeGeometryTypeUnknown + 1,
|
||||
eThemeGeometryTypeToolbar,
|
||||
eThemeGeometryTypeWindowButtons,
|
||||
eThemeGeometryTypeFullscreenButton,
|
||||
eThemeGeometryTypeMenu,
|
||||
eThemeGeometryTypeHighlightedMenuItem,
|
||||
eThemeGeometryTypeVibrancyLight,
|
||||
eThemeGeometryTypeVibrancyDark,
|
||||
eThemeGeometryTypeTooltip,
|
||||
};
|
||||
|
||||
nsNativeThemeCocoa();
|
||||
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
@ -65,6 +77,8 @@ public:
|
|||
virtual bool NeedToClearBackgroundBehindWidget(uint8_t aWidgetType) MOZ_OVERRIDE;
|
||||
virtual bool WidgetProvidesFontSmoothingBackgroundColor(nsIFrame* aFrame, uint8_t aWidgetType,
|
||||
nscolor* aColor) MOZ_OVERRIDE;
|
||||
virtual ThemeGeometryType ThemeGeometryTypeForWidget(nsIFrame* aFrame,
|
||||
uint8_t aWidgetType) MOZ_OVERRIDE;
|
||||
virtual Transparency GetWidgetTransparency(nsIFrame* aFrame, uint8_t aWidgetType) MOZ_OVERRIDE;
|
||||
|
||||
void DrawProgress(CGContextRef context, const HIRect& inBoxRect,
|
||||
|
|
|
@ -2256,7 +2256,7 @@ nsNativeThemeCocoa::DrawResizer(CGContextRef cgContext, const HIRect& aRect,
|
|||
|
||||
static void
|
||||
DrawVibrancyBackground(CGContextRef cgContext, CGRect inBoxRect,
|
||||
nsIFrame* aFrame, uint8_t aWidgetType,
|
||||
nsIFrame* aFrame, nsITheme::ThemeGeometryType aThemeGeometryType,
|
||||
int aCornerRadius = 0)
|
||||
{
|
||||
ChildView* childView = ChildViewForFrame(aFrame);
|
||||
|
@ -2270,7 +2270,7 @@ DrawVibrancyBackground(CGContextRef cgContext, CGRect inBoxRect,
|
|||
[[NSBezierPath bezierPathWithRoundedRect:rect xRadius:aCornerRadius yRadius:aCornerRadius] addClip];
|
||||
}
|
||||
|
||||
[[childView vibrancyFillColorForWidgetType:aWidgetType] set];
|
||||
[[childView vibrancyFillColorForThemeGeometryType:aThemeGeometryType] set];
|
||||
NSRectFill(rect);
|
||||
|
||||
[NSGraphicsContext restoreGraphicsState];
|
||||
|
@ -2391,7 +2391,7 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsRenderingContext* aContext,
|
|||
|
||||
case NS_THEME_MENUPOPUP:
|
||||
if (VibrancyManager::SystemSupportsVibrancy()) {
|
||||
DrawVibrancyBackground(cgContext, macRect, aFrame, aWidgetType, 4);
|
||||
DrawVibrancyBackground(cgContext, macRect, aFrame, eThemeGeometryTypeMenu, 4);
|
||||
} else {
|
||||
HIThemeMenuDrawInfo mdi;
|
||||
memset(&mdi, 0, sizeof(mdi));
|
||||
|
@ -2424,7 +2424,7 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsRenderingContext* aContext,
|
|||
bool isDisabled = IsDisabled(aFrame, eventState);
|
||||
bool isSelected = !isDisabled && CheckBooleanAttr(aFrame, nsGkAtoms::menuactive);
|
||||
if (!isSelected && VibrancyManager::SystemSupportsVibrancy()) {
|
||||
DrawVibrancyBackground(cgContext, macRect, aFrame, aWidgetType);
|
||||
DrawVibrancyBackground(cgContext, macRect, aFrame, eThemeGeometryTypeMenu);
|
||||
} else {
|
||||
// maybe use kThemeMenuItemHierBackground or PopUpBackground instead of just Plain?
|
||||
HIThemeMenuItemDrawInfo drawInfo;
|
||||
|
@ -2472,7 +2472,7 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsRenderingContext* aContext,
|
|||
|
||||
case NS_THEME_TOOLTIP:
|
||||
if (VibrancyManager::SystemSupportsVibrancy()) {
|
||||
DrawVibrancyBackground(cgContext, macRect, aFrame, aWidgetType);
|
||||
DrawVibrancyBackground(cgContext, macRect, aFrame, ThemeGeometryTypeForWidget(aFrame, aWidgetType));
|
||||
} else {
|
||||
CGContextSetRGBFillColor(cgContext, 0.996, 1.000, 0.792, 0.950);
|
||||
CGContextFillRect(cgContext, macRect);
|
||||
|
@ -2909,9 +2909,11 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsRenderingContext* aContext,
|
|||
break;
|
||||
|
||||
case NS_THEME_MAC_VIBRANCY_LIGHT:
|
||||
case NS_THEME_MAC_VIBRANCY_DARK:
|
||||
DrawVibrancyBackground(cgContext, macRect, aFrame, aWidgetType);
|
||||
case NS_THEME_MAC_VIBRANCY_DARK: {
|
||||
ThemeGeometryType type = ThemeGeometryTypeForWidget(aFrame, aWidgetType);
|
||||
DrawVibrancyBackground(cgContext, macRect, aFrame, type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hidpi) {
|
||||
|
@ -3793,7 +3795,8 @@ nsNativeThemeCocoa::WidgetProvidesFontSmoothingBackgroundColor(nsIFrame* aFrame,
|
|||
{
|
||||
ChildView* childView = ChildViewForFrame(aFrame);
|
||||
if (childView) {
|
||||
NSColor* color = [childView vibrancyFontSmoothingBackgroundColorForWidgetType:aWidgetType];
|
||||
ThemeGeometryType type = ThemeGeometryTypeForWidget(aFrame, aWidgetType);
|
||||
NSColor* color = [childView vibrancyFontSmoothingBackgroundColorForThemeGeometryType:type];
|
||||
*aColor = ConvertNSColor(color);
|
||||
return true;
|
||||
}
|
||||
|
@ -3804,6 +3807,34 @@ nsNativeThemeCocoa::WidgetProvidesFontSmoothingBackgroundColor(nsIFrame* aFrame,
|
|||
}
|
||||
}
|
||||
|
||||
nsITheme::ThemeGeometryType
|
||||
nsNativeThemeCocoa::ThemeGeometryTypeForWidget(nsIFrame* aFrame, uint8_t aWidgetType)
|
||||
{
|
||||
switch (aWidgetType) {
|
||||
case NS_THEME_WINDOW_TITLEBAR:
|
||||
return eThemeGeometryTypeTitlebar;
|
||||
case NS_THEME_TOOLBAR:
|
||||
case NS_THEME_MOZ_MAC_UNIFIED_TOOLBAR:
|
||||
return eThemeGeometryTypeToolbar;
|
||||
case NS_THEME_WINDOW_BUTTON_BOX:
|
||||
return eThemeGeometryTypeWindowButtons;
|
||||
case NS_THEME_MOZ_MAC_FULLSCREEN_BUTTON:
|
||||
return eThemeGeometryTypeFullscreenButton;
|
||||
case NS_THEME_MAC_VIBRANCY_LIGHT:
|
||||
return eThemeGeometryTypeVibrancyLight;
|
||||
case NS_THEME_MAC_VIBRANCY_DARK:
|
||||
return eThemeGeometryTypeVibrancyDark;
|
||||
case NS_THEME_TOOLTIP:
|
||||
return eThemeGeometryTypeTooltip;
|
||||
case NS_THEME_MENUPOPUP:
|
||||
case NS_THEME_MENUITEM:
|
||||
case NS_THEME_CHECKMENUITEM:
|
||||
return eThemeGeometryTypeMenu;
|
||||
default:
|
||||
return eThemeGeometryTypeUnknown;
|
||||
}
|
||||
}
|
||||
|
||||
nsITheme::Transparency
|
||||
nsNativeThemeCocoa::GetWidgetTransparency(nsIFrame* aFrame, uint8_t aWidgetType)
|
||||
{
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include "nsAutoPtr.h"
|
||||
#include "nsWidgetInitData.h"
|
||||
#include "nsTArray.h"
|
||||
#include "nsITheme.h"
|
||||
#include "nsITimer.h"
|
||||
#include "nsXULAppAPI.h"
|
||||
#include "mozilla/EventForwards.h"
|
||||
|
@ -740,14 +741,15 @@ class nsIWidget : public nsISupports {
|
|||
|
||||
// Used in UpdateThemeGeometries.
|
||||
struct ThemeGeometry {
|
||||
// The -moz-appearance value for the themed widget
|
||||
uint8_t mWidgetType;
|
||||
// The ThemeGeometryType value for the themed widget, see
|
||||
// nsITheme::ThemeGeometryTypeForWidget.
|
||||
nsITheme::ThemeGeometryType mType;
|
||||
// The device-pixel rect within the window for the themed widget
|
||||
nsIntRect mRect;
|
||||
|
||||
ThemeGeometry(uint8_t aWidgetType, const nsIntRect& aRect)
|
||||
: mWidgetType(aWidgetType)
|
||||
, mRect(aRect)
|
||||
ThemeGeometry(nsITheme::ThemeGeometryType aType, const nsIntRect& aRect)
|
||||
: mType(aType)
|
||||
, mRect(aRect)
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
@ -2664,6 +2664,19 @@ nsNativeThemeWin::WidgetAppearanceDependsOnWindowFocus(uint8_t aWidgetType)
|
|||
}
|
||||
}
|
||||
|
||||
nsITheme::ThemeGeometryType
|
||||
nsNativeThemeWin::ThemeGeometryTypeForWidget(nsIFrame* aFrame,
|
||||
uint8_t aWidgetType)
|
||||
{
|
||||
switch (aWidgetType) {
|
||||
case NS_THEME_WINDOW_BUTTON_BOX:
|
||||
case NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED:
|
||||
return eThemeGeometryTypeWindowButtons;
|
||||
default:
|
||||
return eThemeGeometryTypeUnknown;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
nsNativeThemeWin::ShouldHideScrollbars()
|
||||
{
|
||||
|
|
|
@ -74,6 +74,12 @@ public:
|
|||
|
||||
virtual bool WidgetAppearanceDependsOnWindowFocus(uint8_t aWidgetType) MOZ_OVERRIDE;
|
||||
|
||||
enum {
|
||||
eThemeGeometryTypeWindowButtons = eThemeGeometryTypeUnknown + 1
|
||||
};
|
||||
virtual ThemeGeometryType ThemeGeometryTypeForWidget(nsIFrame* aFrame,
|
||||
uint8_t aWidgetType) MOZ_OVERRIDE;
|
||||
|
||||
virtual bool ShouldHideScrollbars() MOZ_OVERRIDE;
|
||||
|
||||
nsNativeThemeWin();
|
||||
|
|
|
@ -3531,8 +3531,7 @@ nsWindow::UpdateThemeGeometries(const nsTArray<ThemeGeometry>& aThemeGeometries)
|
|||
{
|
||||
nsIntRegion clearRegion;
|
||||
for (size_t i = 0; i < aThemeGeometries.Length(); i++) {
|
||||
if ((aThemeGeometries[i].mWidgetType == NS_THEME_WINDOW_BUTTON_BOX ||
|
||||
aThemeGeometries[i].mWidgetType == NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED) &&
|
||||
if (aThemeGeometries[i].mType == nsNativeThemeWin::eThemeGeometryTypeWindowButtons &&
|
||||
nsUXThemeData::CheckForCompositor())
|
||||
{
|
||||
nsIntRect bounds = aThemeGeometries[i].mRect;
|
||||
|
|
Загрузка…
Ссылка в новой задаче