📄 renderthemechromiummac.mm
字号:
m_systemColorCache.clear(); RenderTheme::platformColorsDidChange();}Color RenderThemeChromiumMac::systemColor(int cssValueId) const{ if (m_systemColorCache.contains(cssValueId)) return m_systemColorCache.get(cssValueId); Color color; switch (cssValueId) { case CSSValueActiveborder: color = convertNSColorToColor([NSColor keyboardFocusIndicatorColor]); break; case CSSValueActivecaption: color = convertNSColorToColor([NSColor windowFrameTextColor]); break; case CSSValueAppworkspace: color = convertNSColorToColor([NSColor headerColor]); break; case CSSValueBackground: // Use theme independent default break; case CSSValueButtonface: // We use this value instead of NSColor's controlColor to avoid website incompatibilities. // We may want to change this to use the NSColor in future. color = 0xFFC0C0C0; break; case CSSValueButtonhighlight: color = convertNSColorToColor([NSColor controlHighlightColor]); break; case CSSValueButtonshadow: color = convertNSColorToColor([NSColor controlShadowColor]); break; case CSSValueButtontext: color = convertNSColorToColor([NSColor controlTextColor]); break; case CSSValueCaptiontext: color = convertNSColorToColor([NSColor textColor]); break; case CSSValueGraytext: color = convertNSColorToColor([NSColor disabledControlTextColor]); break; case CSSValueHighlight: color = convertNSColorToColor([NSColor selectedTextBackgroundColor]); break; case CSSValueHighlighttext: color = convertNSColorToColor([NSColor selectedTextColor]); break; case CSSValueInactiveborder: color = convertNSColorToColor([NSColor controlBackgroundColor]); break; case CSSValueInactivecaption: color = convertNSColorToColor([NSColor controlBackgroundColor]); break; case CSSValueInactivecaptiontext: color = convertNSColorToColor([NSColor textColor]); break; case CSSValueInfobackground: // There is no corresponding NSColor for this so we use a hard coded value. color = 0xFFFBFCC5; break; case CSSValueInfotext: color = convertNSColorToColor([NSColor textColor]); break; case CSSValueMenu: color = menuBackgroundColor(); break; case CSSValueMenutext: color = convertNSColorToColor([NSColor selectedMenuItemTextColor]); break; case CSSValueScrollbar: color = convertNSColorToColor([NSColor scrollBarColor]); break; case CSSValueText: color = convertNSColorToColor([NSColor textColor]); break; case CSSValueThreeddarkshadow: color = convertNSColorToColor([NSColor controlDarkShadowColor]); break; case CSSValueThreedshadow: color = convertNSColorToColor([NSColor shadowColor]); break; case CSSValueThreedface: // We use this value instead of NSColor's controlColor to avoid website incompatibilities. // We may want to change this to use the NSColor in future. color = 0xFFC0C0C0; break; case CSSValueThreedhighlight: color = convertNSColorToColor([NSColor highlightColor]); break; case CSSValueThreedlightshadow: color = convertNSColorToColor([NSColor controlLightHighlightColor]); break; case CSSValueWindow: color = convertNSColorToColor([NSColor windowBackgroundColor]); break; case CSSValueWindowframe: color = convertNSColorToColor([NSColor windowFrameColor]); break; case CSSValueWindowtext: color = convertNSColorToColor([NSColor windowFrameTextColor]); break; } if (!color.isValid()) color = RenderTheme::systemColor(cssValueId); if (color.isValid()) m_systemColorCache.set(cssValueId, color.rgb()); return color;}bool RenderThemeChromiumMac::isControlStyled(const RenderStyle* style, const BorderData& border, const FillLayer& background, const Color& backgroundColor) const{ if (style->appearance() == TextFieldPart || style->appearance() == TextAreaPart || style->appearance() == ListboxPart) return style->border() != border; // FIXME: This is horrible, but there is not much else that can be done. Menu lists cannot draw properly when // scaled. They can't really draw properly when transformed either. We can't detect the transform case at style // adjustment time so that will just have to stay broken. We can however detect that we're zooming. If zooming // is in effect we treat it like the control is styled. if (style->appearance() == MenulistPart && style->effectiveZoom() != 1.0f) return true; return RenderTheme::isControlStyled(style, border, background, backgroundColor);}// FIXME: Use the code from the old upstream version, before it was converted to the new theme API in r37731.void RenderThemeChromiumMac::adjustRepaintRect(const RenderObject* o, IntRect& r){ float zoomLevel = o->style()->effectiveZoom(); switch (o->style()->appearance()) { case CheckboxPart: { // Since we query the prototype cell, we need to update its state to match. setCheckboxCellState(o, r); // We inflate the rect as needed to account for padding included in the cell to accommodate the checkbox // shadow" and the check. We don't consider this part of the bounds of the control in WebKit. IntSize size = checkboxSizes()[[checkbox() controlSize]]; size.setHeight(size.height() * zoomLevel); size.setWidth(size.width() * zoomLevel); r = inflateRect(r, size, checkboxMargins(), zoomLevel); break; } case RadioPart: { // Since we query the prototype cell, we need to update its state to match. setRadioCellState(o, r); // We inflate the rect as needed to account for padding included in the cell to accommodate the checkbox // shadow" and the check. We don't consider this part of the bounds of the control in WebKit. IntSize size = radioSizes()[[radio() controlSize]]; size.setHeight(size.height() * zoomLevel); size.setWidth(size.width() * zoomLevel); r = inflateRect(r, size, radioMargins(), zoomLevel); break; } case PushButtonPart: case DefaultButtonPart: case ButtonPart: { // Since we query the prototype cell, we need to update its state to match. setButtonCellState(o, r); // We inflate the rect as needed to account for padding included in the cell to accommodate the checkbox // shadow" and the check. We don't consider this part of the bounds of the control in WebKit. if ([button() bezelStyle] == NSRoundedBezelStyle) { IntSize size = buttonSizes()[[button() controlSize]]; size.setHeight(size.height() * zoomLevel); size.setWidth(r.width()); r = inflateRect(r, size, buttonMargins(), zoomLevel); } break; } case MenulistPart: { setPopupButtonCellState(o, r); IntSize size = popupButtonSizes()[[popupButton() controlSize]]; size.setHeight(size.height() * zoomLevel); size.setWidth(r.width()); r = inflateRect(r, size, popupButtonMargins(), zoomLevel); break; } default: break; }}IntRect RenderThemeChromiumMac::inflateRect(const IntRect& r, const IntSize& size, const int* margins, float zoomLevel) const{ // Only do the inflation if the available width/height are too small. Otherwise try to // fit the glow/check space into the available box's width/height. int widthDelta = r.width() - (size.width() + margins[LeftMargin] * zoomLevel + margins[RightMargin] * zoomLevel); int heightDelta = r.height() - (size.height() + margins[TopMargin] * zoomLevel + margins[BottomMargin] * zoomLevel); IntRect result(r); if (widthDelta < 0) { result.setX(result.x() - margins[LeftMargin] * zoomLevel); result.setWidth(result.width() - widthDelta); } if (heightDelta < 0) { result.setY(result.y() - margins[TopMargin] * zoomLevel); result.setHeight(result.height() - heightDelta); } return result;}void RenderThemeChromiumMac::updateCheckedState(NSCell* cell, const RenderObject* o){ bool oldIndeterminate = [cell state] == NSMixedState; bool indeterminate = isIndeterminate(o); bool checked = isChecked(o); if (oldIndeterminate != indeterminate) { [cell setState:indeterminate ? NSMixedState : (checked ? NSOnState : NSOffState)]; return; } bool oldChecked = [cell state] == NSOnState; if (checked != oldChecked) [cell setState:checked ? NSOnState : NSOffState];}void RenderThemeChromiumMac::updateEnabledState(NSCell* cell, const RenderObject* o){ bool oldEnabled = [cell isEnabled]; bool enabled = isEnabled(o); if (enabled != oldEnabled) [cell setEnabled:enabled];}void RenderThemeChromiumMac::updateFocusedState(NSCell* cell, const RenderObject* o){ bool oldFocused = [cell showsFirstResponder]; bool focused = isFocused(o) && o->style()->outlineStyleIsAuto(); if (focused != oldFocused) [cell setShowsFirstResponder:focused];}void RenderThemeChromiumMac::updatePressedState(NSCell* cell, const RenderObject* o){ bool oldPressed = [cell isHighlighted]; bool pressed = (o->node() && o->node()->active()); if (pressed != oldPressed) [cell setHighlighted:pressed];}// FIXME: This used to be in the upstream version until it was converted to the new theme API in r37731.int RenderThemeChromiumMac::baselinePosition(const RenderObject* o) const{ if (!o->isBox()) return 0; if (o->style()->appearance() == CheckboxPart || o->style()->appearance() == RadioPart) { const RenderBox* box = toRenderBox(o); return box->marginTop() + box->height() - 2 * o->style()->effectiveZoom(); // The baseline is 2px up from the bottom of the checkbox/radio in AppKit. } return RenderTheme::baselinePosition(o);}bool RenderThemeChromiumMac::controlSupportsTints(const RenderObject* o) const{ // An alternate way to implement this would be to get the appropriate cell object // and call the private _needRedrawOnWindowChangedKeyState method. An advantage of // that would be that we would match AppKit behavior more closely, but a disadvantage // would be that we would rely on an AppKit SPI method. if (!isEnabled(o)) return false; // Checkboxes only have tint when checked. if (o->style()->appearance() == CheckboxPart) return isChecked(o); // For now assume other controls have tint if enabled. return true;}NSControlSize RenderThemeChromiumMac::controlSizeForFont(RenderStyle* style) const{ int fontSize = style->fontSize(); if (fontSize >= 16) return NSRegularControlSize; if (fontSize >= 11) return NSSmallControlSize; return NSMiniControlSize;}void RenderThemeChromiumMac::setControlSize(NSCell* cell, const IntSize* sizes, const IntSize& minSize, float zoomLevel){ NSControlSize size; if (minSize.width() >= static_cast<int>(sizes[NSRegularControlSize].width() * zoomLevel) && minSize.height() >= static_cast<int>(sizes[NSRegularControlSize].height() * zoomLevel)) size = NSRegularControlSize; else if (minSize.width() >= static_cast<int>(sizes[NSSmallControlSize].width() * zoomLevel) && minSize.height() >= static_cast<int>(sizes[NSSmallControlSize].height() * zoomLevel)) size = NSSmallControlSize; else size = NSMiniControlSize; if (size != [cell controlSize]) // Only update if we have to, since AppKit does work even if the size is the same. [cell setControlSize:size];}IntSize RenderThemeChromiumMac::sizeForFont(RenderStyle* style, const IntSize* sizes) const{ if (style->effectiveZoom() != 1.0f) { IntSize result = sizes[controlSizeForFont(style)]; return IntSize(result.width() * style->effectiveZoom(), result.height() * style->effectiveZoom()); } return sizes[controlSizeForFont(style)];}IntSize RenderThemeChromiumMac::sizeForSystemFont(RenderStyle* style, const IntSize* sizes) const{ if (style->effectiveZoom() != 1.0f) { IntSize result = sizes[controlSizeForSystemFont(style)]; return IntSize(result.width() * style->effectiveZoom(), result.height() * style->effectiveZoom()); } return sizes[controlSizeForSystemFont(style)];}void RenderThemeChromiumMac::setSizeFromFont(RenderStyle* style, const IntSize* sizes) const{ // FIXME: Check is flawed, since it doesn't take min-width/max-width into account. IntSize size = sizeForFont(style, sizes);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -