⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderthemechromiummac.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
📖 第 1 页 / 共 5 页
字号:
    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 + -