File indexing completed on 2024-04-28 13:25:50

0001 /*
0002     SPDX-FileCopyrightText: 2018 Michail Vourlakos <mvourlakos@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "effects.h"
0007 
0008 // local
0009 #include <config-latte.h>
0010 #include <coretypes.h>
0011 #include "panelshadows_p.h"
0012 #include "view.h"
0013 #include "../lattecorona.h"
0014 #include "../wm/abstractwindowinterface.h"
0015 
0016 // Qt
0017 #include <QRegion>
0018 
0019 // KDE
0020 #include <KWindowEffects>
0021 #include <KWindowSystem>
0022 
0023 
0024 namespace Latte {
0025 namespace ViewPart {
0026 
0027 Effects::Effects(Latte::View *parent)
0028     : QObject(parent),
0029       m_view(parent)
0030 {
0031     m_corona = qobject_cast<Latte::Corona *>(m_view->corona());
0032 
0033     init();
0034 }
0035 
0036 Effects::~Effects()
0037 {
0038 }
0039 
0040 void Effects::init()
0041 {
0042     connect(this, &Effects::backgroundOpacityChanged, this, &Effects::updateEffects);
0043     connect(this, &Effects::backgroundOpacityChanged, this, &Effects::updateBackgroundContrastValues);
0044     connect(this, &Effects::backgroundCornersMaskChanged, this, &Effects::updateEffects);
0045     connect(this, &Effects::backgroundRadiusEnabledChanged, this, &Effects::updateEffects);
0046     connect(this, &Effects::drawEffectsChanged, this, &Effects::updateEffects);
0047     connect(this, &Effects::enabledBordersChanged, this, &Effects::updateEffects);
0048     connect(this, &Effects::rectChanged, this, &Effects::updateEffects);
0049 
0050 
0051     connect(this, &Effects::backgroundCornersMaskChanged, this, &Effects::updateMask);
0052     connect(this, &Effects::backgroundRadiusEnabledChanged, this, &Effects::updateMask);
0053     connect(this, &Effects::subtractedMaskRegionsChanged, this, &Effects::updateMask);
0054     connect(this, &Effects::unitedMaskRegionsChanged, this, &Effects::updateMask);
0055     connect(m_view, &QQuickWindow::widthChanged, this, &Effects::updateMask);
0056     connect(m_view, &QQuickWindow::heightChanged, this, &Effects::updateMask);
0057     connect(m_view, &Latte::View::behaveAsPlasmaPanelChanged, this, &Effects::updateMask);
0058     connect(KWindowSystem::self(), &KWindowSystem::compositingChanged, this, [&]() {
0059         if (!KWindowSystem::compositingActive() && !m_view->behaveAsPlasmaPanel()) {
0060             setMask(m_rect);
0061         }
0062 
0063         updateMask();
0064     });
0065 
0066     connect(this, &Effects::rectChanged, this, [&]() {
0067         if (!KWindowSystem::compositingActive() && !m_view->behaveAsPlasmaPanel()) {
0068             setMask(m_rect);
0069         }
0070     });
0071 
0072     connect(this, &Effects::backgroundRadiusChanged, this, &Effects::updateBackgroundCorners);
0073 
0074     connect(this, &Effects::drawShadowsChanged, this, [&]() {
0075         if (m_view->behaveAsPlasmaPanel()) {
0076             updateEnabledBorders();
0077         }
0078     });
0079 
0080     connect(this, &Effects::backgroundAllCornersChanged, this, &Effects::updateEnabledBorders);
0081 
0082     connect(this, &Effects::popUpMarginChanged, this, &Effects::onPopUpMarginChanged);
0083 
0084     connect(m_view, &Latte::View::alignmentChanged, this, &Effects::updateEnabledBorders);
0085     connect(m_view, &Latte::View::maxLengthChanged, this, &Effects::updateEnabledBorders);
0086     connect(m_view, &Latte::View::offsetChanged, this, &Effects::updateEnabledBorders);
0087     connect(m_view, &Latte::View::screenEdgeMarginEnabledChanged, this, &Effects::updateEnabledBorders);
0088     connect(m_view, &Latte::View::behaveAsPlasmaPanelChanged, this, &Effects::updateEffects);
0089     connect(this, &Effects::drawShadowsChanged, this, &Effects::updateShadows);
0090     connect(m_view, &Latte::View::behaveAsPlasmaPanelChanged, this, &Effects::updateShadows);
0091     connect(m_view, &Latte::View::configWindowGeometryChanged, this, &Effects::updateMask);
0092     connect(m_view, &Latte::View::layoutChanged, this, &Effects::onPopUpMarginChanged);
0093 
0094     connect(&m_theme, &Plasma::Theme::themeChanged, this, [&]() {
0095         updateBackgroundContrastValues();
0096         updateEffects();
0097     });
0098 }
0099 
0100 bool Effects::animationsBlocked() const
0101 {
0102     return m_animationsBlocked;
0103 }
0104 
0105 void Effects::setAnimationsBlocked(bool blocked)
0106 {
0107     if (m_animationsBlocked == blocked) {
0108         return;
0109     }
0110 
0111     m_animationsBlocked = blocked;
0112     emit animationsBlockedChanged();
0113 }
0114 
0115 bool Effects::backgroundAllCorners() const
0116 {
0117     return m_backgroundAllCorners;
0118 }
0119 
0120 void Effects::setBackgroundAllCorners(bool allcorners)
0121 {
0122     if (m_backgroundAllCorners == allcorners) {
0123         return;
0124     }
0125 
0126     m_backgroundAllCorners = allcorners;
0127     emit backgroundAllCornersChanged();
0128 }
0129 
0130 bool Effects::backgroundRadiusEnabled() const
0131 {
0132     return m_backgroundRadiusEnabled;
0133 }
0134 
0135 void Effects::setBackgroundRadiusEnabled(bool enabled)
0136 {
0137     if (m_backgroundRadiusEnabled == enabled) {
0138         return;
0139     }
0140 
0141     m_backgroundRadiusEnabled = enabled;
0142     emit backgroundRadiusEnabledChanged();
0143 }
0144 
0145 bool Effects::drawShadows() const
0146 {
0147     return m_drawShadows;
0148 }
0149 
0150 void Effects::setDrawShadows(bool draw)
0151 {
0152     if (m_drawShadows == draw) {
0153         return;
0154     }
0155 
0156     m_drawShadows = draw;
0157 
0158     emit drawShadowsChanged();
0159 }
0160 
0161 bool Effects::drawEffects() const
0162 {
0163     return m_drawEffects;
0164 }
0165 
0166 void Effects::setDrawEffects(bool draw)
0167 {
0168     if (m_drawEffects == draw) {
0169         return;
0170     }
0171 
0172     m_drawEffects = draw;
0173 
0174     emit drawEffectsChanged();
0175 }
0176 
0177 void Effects::setForceBottomBorder(bool draw)
0178 {
0179     if (m_forceBottomBorder == draw) {
0180         return;
0181     }
0182 
0183     m_forceBottomBorder = draw;
0184     updateEnabledBorders();
0185 }
0186 
0187 void Effects::setForceTopBorder(bool draw)
0188 {
0189     if (m_forceTopBorder == draw) {
0190         return;
0191     }
0192 
0193     m_forceTopBorder = draw;
0194     updateEnabledBorders();
0195 }
0196 
0197 int Effects::backgroundRadius()
0198 {
0199     return m_backgroundRadius;
0200 }
0201 
0202 void Effects::setBackgroundRadius(const int &radius)
0203 {
0204     if (m_backgroundRadius == radius) {
0205         return;
0206     }
0207 
0208     m_backgroundRadius = radius;
0209     emit backgroundRadiusChanged();
0210 }
0211 
0212 float Effects::backgroundOpacity() const
0213 {
0214     return m_backgroundOpacity;
0215 }
0216 
0217 void Effects::setBackgroundOpacity(float opacity)
0218 {
0219     if (m_backgroundOpacity == opacity) {
0220         return;
0221     }
0222 
0223     m_backgroundOpacity = opacity;
0224 
0225     updateBackgroundContrastValues();
0226     emit backgroundOpacityChanged();
0227 }
0228 
0229 int Effects::editShadow() const
0230 {
0231     return m_editShadow;
0232 }
0233 
0234 void Effects::setEditShadow(int shadow)
0235 {
0236     if (m_editShadow == shadow) {
0237         return;
0238     }
0239 
0240     m_editShadow = shadow;
0241     emit editShadowChanged();
0242 }
0243 
0244 int Effects::innerShadow() const
0245 {
0246     return m_innerShadow;
0247 }
0248 
0249 void Effects::setInnerShadow(int shadow)
0250 {
0251     if (m_innerShadow == shadow)
0252         return;
0253 
0254     m_innerShadow = shadow;
0255 
0256     emit innerShadowChanged();
0257 }
0258 
0259 int Effects::popUpMargin() const
0260 {
0261     return m_view->layout() ? m_view->layout()->popUpMargin() : -1/*default*/;
0262 }
0263 
0264 QRect Effects::rect() const
0265 {
0266     return m_rect;
0267 }
0268 
0269 void Effects::setRect(QRect area)
0270 {
0271     if (m_rect == area) {
0272         return;
0273     }
0274 
0275     m_rect = area;
0276 
0277     emit rectChanged();
0278 }
0279 
0280 QRect Effects::mask() const
0281 {
0282     return m_mask;
0283 }
0284 
0285 void Effects::setMask(QRect area)
0286 {
0287     if (m_mask == area)
0288         return;
0289 
0290     m_mask = area;
0291     updateMask();
0292 
0293     // qDebug() << "dock mask set:" << m_mask;
0294     emit maskChanged();
0295 }
0296 
0297 QRect Effects::inputMask() const
0298 {
0299     return m_inputMask;
0300 }
0301 
0302 void Effects::setInputMask(QRect area)
0303 {
0304     if (m_inputMask == area) {
0305         return;
0306     }
0307 
0308     m_inputMask = area;
0309 
0310     if (KWindowSystem::isPlatformX11()) {
0311         if (m_view->devicePixelRatio() != 1.0) {
0312             //!Fix for X11 Global Scale
0313             auto ratio = m_view->devicePixelRatio();
0314             area = QRect(qRound(area.x() * ratio),
0315                          qRound(area.y() * ratio),
0316                          qRound(area.width()*ratio),
0317                          qRound(area.height() * ratio));
0318         }
0319 
0320         m_corona->wm()->setInputMask(m_view, area);
0321     } else {
0322         //under wayland mask() is providing the Input Area
0323         m_view->setMask(area);
0324     }
0325 
0326     emit inputMaskChanged();
0327 }
0328 
0329 QRect Effects::appletsLayoutGeometry() const
0330 {
0331     return m_appletsLayoutGeometry;
0332 }
0333 
0334 void Effects::setAppletsLayoutGeometry(const QRect &geom)
0335 {
0336     if (m_appletsLayoutGeometry == geom) {
0337         return;
0338     }
0339 
0340     m_appletsLayoutGeometry = geom;
0341     m_view->setProperty("_applets_layout_geometry", QVariant(m_appletsLayoutGeometry));
0342 
0343     emit appletsLayoutGeometryChanged();
0344 }
0345 
0346 QQuickItem *Effects::panelBackgroundSvg() const
0347 {
0348     return m_panelBackgroundSvg;
0349 }
0350 
0351 void Effects::setPanelBackgroundSvg(QQuickItem *quickitem)
0352 {
0353     if (m_panelBackgroundSvg == quickitem) {
0354         return;
0355     }
0356 
0357     m_panelBackgroundSvg = quickitem;
0358     emit panelBackgroundSvgChanged();
0359 }
0360 
0361 void Effects::onPopUpMarginChanged()
0362 {
0363     m_view->setProperty("_applets_popup_margin", QVariant(popUpMargin()));
0364 }
0365 
0366 void Effects::forceMaskRedraw()
0367 {
0368     updateMask();
0369 }
0370 
0371 void Effects::setSubtractedMaskRegion(const QString &regionid, const QRegion &region)
0372 {
0373     if (m_subtractedMaskRegions.contains(regionid) && m_subtractedMaskRegions[regionid] == region) {
0374         return;
0375     }
0376 
0377     m_subtractedMaskRegions[regionid] = region;
0378     emit subtractedMaskRegionsChanged();
0379 }
0380 
0381 void Effects::removeSubtractedMaskRegion(const QString &regionid)
0382 {
0383     if (!m_subtractedMaskRegions.contains(regionid)) {
0384         return;
0385     }
0386 
0387     m_subtractedMaskRegions.remove(regionid);
0388     emit subtractedMaskRegionsChanged();
0389 }
0390 
0391 void Effects::setUnitedMaskRegion(const QString &regionid, const QRegion &region)
0392 {
0393     if (m_unitedMaskRegions.contains(regionid) && m_unitedMaskRegions[regionid] == region) {
0394         return;
0395     }
0396 
0397     m_unitedMaskRegions[regionid] = region;
0398     emit unitedMaskRegionsChanged();
0399 }
0400 
0401 void Effects::removeUnitedMaskRegion(const QString &regionid)
0402 {
0403     if (!m_unitedMaskRegions.contains(regionid)) {
0404         return;
0405     }
0406 
0407     m_unitedMaskRegions.remove(regionid);
0408     emit unitedMaskRegionsChanged();
0409 }
0410 
0411 QRegion Effects::customMask(const QRect &rect)
0412 {
0413     QRegion result = rect;
0414     int dx = rect.right() - m_cornersMaskRegion.topLeft.boundingRect().width() + 1;
0415     int dy = rect.bottom() - m_cornersMaskRegion.topLeft.boundingRect().height() + 1;
0416 
0417     if (m_hasTopLeftCorner) {
0418         QRegion tl = m_cornersMaskRegion.topLeft;
0419         tl.translate(rect.x(), rect.y());
0420         result = result.subtracted(tl);
0421     }
0422 
0423     if (m_hasTopRightCorner) {
0424         QRegion tr = m_cornersMaskRegion.topRight;
0425         tr.translate(rect.x() + dx, rect.y());
0426         result = result.subtracted(tr);
0427     }
0428 
0429     if (m_hasBottomRightCorner) {
0430         QRegion br = m_cornersMaskRegion.bottomRight;
0431         br.translate(rect.x() + dx, rect.y() + dy);
0432         result = result.subtracted(br);
0433     }
0434 
0435     if (m_hasBottomLeftCorner) {
0436         QRegion bl = m_cornersMaskRegion.bottomLeft;
0437         bl.translate(rect.x(), rect.y() + dy);
0438         result = result.subtracted(bl);
0439     }
0440 
0441     return result;
0442 }
0443 
0444 QRegion Effects::maskCombinedRegion()
0445 {
0446     QRegion region = m_mask;
0447 
0448     for(auto subregion : m_subtractedMaskRegions) {
0449         region = region.subtracted(subregion);
0450     }
0451 
0452     for(auto subregion : m_unitedMaskRegions) {
0453         region = region.united(subregion);
0454     }
0455 
0456     return region;
0457 }
0458 
0459 void Effects::updateBackgroundCorners()
0460 {
0461     if (m_backgroundRadius<0) {
0462         return;
0463     }
0464 
0465     m_corona->themeExtended()->cornersMask(m_backgroundRadius);
0466 
0467     m_cornersMaskRegion = m_corona->themeExtended()->cornersMask(m_backgroundRadius);
0468     emit backgroundCornersMaskChanged();
0469 }
0470 
0471 void Effects::updateMask()
0472 {
0473     if (KWindowSystem::compositingActive()) {
0474         if (KWindowSystem::isPlatformX11()) {
0475             if (m_view->behaveAsPlasmaPanel()) {
0476                 // set as NULL in order for plasma framrworks to identify NULL Mask properly
0477                 m_view->setMask(QRect(-1, -1, 0, 0));
0478             } else {
0479                 m_view->setMask(QRect(0, 0, m_view->width(), m_view->height()));
0480             }
0481         } else {
0482             // under wayland do nothing
0483         }
0484     } else {
0485         QRegion fixedMask;
0486 
0487         QRect maskRect = m_view->behaveAsPlasmaPanel() ? QRect(0,0, m_view->width(), m_view->height()) : m_mask;
0488 
0489         if (m_backgroundRadiusEnabled) {
0490             //! CustomBackground way
0491             fixedMask = customMask(QRect(0,0,maskRect.width(), maskRect.height()));
0492         } else {
0493             //! Plasma::Theme way
0494             //! this is used when compositing is disabled and provides
0495             //! the correct way for the mask to be painted in order for
0496             //! rounded corners to be shown correctly
0497             //! the enabledBorders check was added because there was cases
0498             //! that the mask region wasn't calculated correctly after location changes
0499             if (!m_panelBackgroundSvg) {
0500                 return;
0501             }
0502 
0503             const QVariant maskProperty = m_panelBackgroundSvg->property("mask");
0504             if (static_cast<QMetaType::Type>(maskProperty.type()) == QMetaType::QRegion) {
0505                 fixedMask = maskProperty.value<QRegion>();
0506             }
0507         }
0508 
0509         fixedMask.translate(maskRect.x(), maskRect.y());
0510 
0511         //! fix for KF5.32 that return empty QRegion's for the mask
0512         if (fixedMask.isEmpty()) {
0513             fixedMask = QRegion(maskRect);
0514         }
0515 
0516         m_view->setMask(fixedMask);
0517     }
0518 }
0519 
0520 void Effects::clearShadows()
0521 {
0522     PanelShadows::self()->removeWindow(m_view);
0523 }
0524 
0525 void Effects::updateShadows()
0526 {
0527     if (m_view->behaveAsPlasmaPanel() && drawShadows()) {
0528         PanelShadows::self()->addWindow(m_view, enabledBorders());
0529     } else {
0530         PanelShadows::self()->removeWindow(m_view);
0531     }
0532 }
0533 
0534 void Effects::updateEffects()
0535 {
0536     //! Don't apply any effect before the wayland surface is created under wayland
0537     //! https://bugs.kde.org/show_bug.cgi?id=392890
0538     if (KWindowSystem::isPlatformWayland() && !m_view->surface()) {
0539         return;
0540     }
0541 
0542     bool clearEffects{true};
0543 
0544     if (m_drawEffects) {
0545         if (!m_view->behaveAsPlasmaPanel()) {
0546             if (!m_rect.isNull() && !m_rect.isEmpty() && m_rect != VisibilityManager::ISHIDDENMASK) {
0547                 QRegion backMask;
0548 
0549                 if (m_backgroundRadiusEnabled) {
0550                     //! CustomBackground way
0551                     backMask = customMask(QRect(0,0,m_rect.width(), m_rect.height()));
0552                 } else {
0553                     //! Plasma::Theme way
0554                     //! this is used when compositing is disabled and provides
0555                     //! the correct way for the mask to be painted in order for
0556                     //! rounded corners to be shown correctly
0557                     if (!m_panelBackgroundSvg) {
0558                         return;
0559                     }
0560 
0561                     if (m_rect == VisibilityManager::ISHIDDENMASK) {
0562                         clearEffects = true;
0563                     } else {
0564                         const QVariant maskProperty = m_panelBackgroundSvg->property("mask");
0565                         if (static_cast<QMetaType::Type>(maskProperty.type()) == QMetaType::QRegion) {
0566                             backMask = maskProperty.value<QRegion>();
0567                         }
0568                     }
0569                 }
0570 
0571                 //! adjust mask coordinates based on local coordinates
0572                 int fX = m_rect.x(); int fY = m_rect.y();
0573 
0574                 //! Latte is now using GtkFrameExtents so Effects geometries must be adjusted
0575                 //! windows that use GtkFrameExtents and apply Effects on them they take GtkFrameExtents
0576                 //! as granted
0577                 if (KWindowSystem::isPlatformX11() && !m_view->byPassWM()) {
0578                     if (m_view->location() == Plasma::Types::BottomEdge) {
0579                         fY = qMax(0, fY - m_view->headThicknessGap());
0580                     } else if (m_view->location() == Plasma::Types::RightEdge) {
0581                         fX = qMax(0, fX - m_view->headThicknessGap());
0582                     }
0583                 }
0584 
0585                 //! There are cases that mask is NULL even though it should not
0586                 //! Example: SidebarOnDemand from v0.10 that BEHAVEASPLASMAPANEL in EditMode
0587                 //! switching multiple times between inConfigureAppletsMode and LiveEditMode
0588                 //! is such a case
0589                 QRegion fixedMask;
0590 
0591                 if (!backMask.isNull()) {
0592                     fixedMask = backMask;
0593                     fixedMask.translate(fX, fY);
0594                 } else {
0595                     fixedMask = QRect(fX, fY, m_rect.width(), m_rect.height());
0596                 }
0597 
0598                 if (!fixedMask.isEmpty()) {
0599                     clearEffects = false;
0600                     KWindowEffects::enableBlurBehind(m_view->winId(), true, fixedMask);
0601                     KWindowEffects::enableBackgroundContrast(m_view->winId(),
0602                                                              m_theme.backgroundContrastEnabled(),
0603                                                              m_backEffectContrast,
0604                                                              m_backEffectIntesity,
0605                                                              m_backEffectSaturation,
0606                                                              fixedMask);
0607                 }
0608             }
0609         } else {
0610             //!  BEHAVEASPLASMAPANEL case
0611             clearEffects = false;
0612             KWindowEffects::enableBlurBehind(m_view->winId(), true);
0613             KWindowEffects::enableBackgroundContrast(m_view->winId(),
0614                                                      m_theme.backgroundContrastEnabled(),
0615                                                      m_backEffectContrast,
0616                                                      m_backEffectIntesity,
0617                                                      m_backEffectSaturation);
0618         }
0619     }
0620 
0621     if (clearEffects) {
0622         KWindowEffects::enableBlurBehind(m_view->winId(), false);
0623         KWindowEffects::enableBackgroundContrast(m_view->winId(), false);
0624     }
0625 }
0626 
0627 //!BEGIN draw panel shadows outside the dock window
0628 Plasma::FrameSvg::EnabledBorders Effects::enabledBorders() const
0629 {
0630     return m_enabledBorders;
0631 }
0632 
0633 qreal Effects::currentMidValue(const qreal &max, const qreal &factor, const qreal &min) const
0634 {
0635     if (max==min || factor==0) {
0636         return min;
0637     }
0638 
0639     qreal space = 0;
0640     qreal distance = 0;
0641 
0642     if (max<min) {
0643         space = min-max;
0644         distance = factor*space;
0645         return 1-distance;
0646     } else {
0647         space = max-min;
0648         distance = factor*space;
0649         return 1+distance;
0650     }
0651 }
0652 
0653 void Effects::updateBackgroundContrastValues()
0654 {
0655     if (!m_theme.backgroundContrastEnabled()) {
0656         m_backEffectContrast = 1.0;
0657         m_backEffectIntesity = 1.0;
0658         m_backEffectSaturation = 1.0;
0659         return;
0660     }
0661 
0662     if (m_backgroundOpacity == -1 /*Default plasma opacity option*/) {
0663         m_backEffectContrast = m_theme.backgroundContrast();
0664         m_backEffectIntesity = m_theme.backgroundIntensity();
0665         m_backEffectSaturation = m_theme.backgroundSaturation();
0666     } else {
0667         m_backEffectContrast = currentMidValue(m_theme.backgroundContrast(), m_backgroundOpacity, 1);
0668         m_backEffectIntesity = currentMidValue(m_theme.backgroundIntensity(), m_backgroundOpacity, 1);
0669         m_backEffectSaturation = currentMidValue(m_theme.backgroundSaturation(), m_backgroundOpacity, 1);
0670     }
0671 }
0672 
0673 void Effects::updateEnabledBorders()
0674 {
0675     if (!m_view->screen()) {
0676         return;
0677     }
0678 
0679     Plasma::FrameSvg::EnabledBorders borders = Plasma::FrameSvg::AllBorders;
0680 
0681     if (!m_view->screenEdgeMarginEnabled() && !m_backgroundAllCorners) {
0682         switch (m_view->location()) {
0683         case Plasma::Types::TopEdge:
0684             borders &= ~Plasma::FrameSvg::TopBorder;
0685             break;
0686 
0687         case Plasma::Types::LeftEdge:
0688             borders &= ~Plasma::FrameSvg::LeftBorder;
0689             break;
0690 
0691         case Plasma::Types::RightEdge:
0692             borders &= ~Plasma::FrameSvg::RightBorder;
0693             break;
0694 
0695         case Plasma::Types::BottomEdge:
0696             borders &= ~Plasma::FrameSvg::BottomBorder;
0697             break;
0698 
0699         default:
0700             break;
0701         }
0702     }
0703 
0704     if (!m_backgroundAllCorners) {
0705         if ((m_view->location() == Plasma::Types::LeftEdge || m_view->location() == Plasma::Types::RightEdge)) {
0706             if (m_view->maxLength() == 1 && m_view->alignment() == Latte::Types::Justify) {
0707                 if (!m_forceTopBorder) {
0708                     borders &= ~Plasma::FrameSvg::TopBorder;
0709                 }
0710 
0711                 if (!m_forceBottomBorder) {
0712                     borders &= ~Plasma::FrameSvg::BottomBorder;
0713                 }
0714             }
0715 
0716             if (m_view->alignment() == Latte::Types::Top && !m_forceTopBorder && m_view->offset() == 0) {
0717                 borders &= ~Plasma::FrameSvg::TopBorder;
0718             }
0719 
0720             if (m_view->alignment() == Latte::Types::Bottom && !m_forceBottomBorder && m_view->offset() == 0) {
0721                 borders &= ~Plasma::FrameSvg::BottomBorder;
0722             }
0723         }
0724 
0725         if (m_view->location() == Plasma::Types::TopEdge || m_view->location() == Plasma::Types::BottomEdge) {
0726             if (m_view->maxLength() == 1 && m_view->alignment() == Latte::Types::Justify) {
0727                 borders &= ~Plasma::FrameSvg::LeftBorder;
0728                 borders &= ~Plasma::FrameSvg::RightBorder;
0729             }
0730 
0731             if (m_view->alignment() == Latte::Types::Left && m_view->offset() == 0) {
0732                 borders &= ~Plasma::FrameSvg::LeftBorder;
0733             }
0734 
0735             if (m_view->alignment() == Latte::Types::Right  && m_view->offset() == 0) {
0736                 borders &= ~Plasma::FrameSvg::RightBorder;
0737             }
0738         }
0739     }
0740 
0741     m_hasTopLeftCorner =  (borders == Plasma::FrameSvg::AllBorders) || ((borders & Plasma::FrameSvg::TopBorder) && (borders & Plasma::FrameSvg::LeftBorder));
0742     m_hasTopRightCorner =  (borders == Plasma::FrameSvg::AllBorders) || ((borders & Plasma::FrameSvg::TopBorder) && (borders & Plasma::FrameSvg::RightBorder));
0743     m_hasBottomLeftCorner =  (borders == Plasma::FrameSvg::AllBorders) || ((borders & Plasma::FrameSvg::BottomBorder) && (borders & Plasma::FrameSvg::LeftBorder));
0744     m_hasBottomRightCorner =  (borders == Plasma::FrameSvg::AllBorders) || ((borders & Plasma::FrameSvg::BottomBorder) && (borders & Plasma::FrameSvg::RightBorder));
0745 
0746     if (m_enabledBorders != borders) {
0747         m_enabledBorders = borders;
0748         emit enabledBordersChanged();
0749     }
0750 
0751     if (!m_view->behaveAsPlasmaPanel() || !m_drawShadows) {
0752         PanelShadows::self()->removeWindow(m_view);
0753     } else {
0754         PanelShadows::self()->setEnabledBorders(m_view, borders);
0755     }
0756 }
0757 //!END draw panel shadows outside the dock window
0758 
0759 }
0760 }