20#include "windowshadow.h"
21#include "boxshadowrenderer.h"
23#include <QCoreApplication>
24#include <QDBusInterface>
26#include <KWindowSystem>
27#include <KWindowEffects>
37const CompositeShadowParams s_shadowParams[] = {
39 CompositeShadowParams(),
41 CompositeShadowParams(
43 ShadowParams(
QPoint(0, 0), 16, 0.26),
44 ShadowParams(
QPoint(0, -2), 8, 0.16)),
46 CompositeShadowParams(
48 ShadowParams(
QPoint(0, 0), 20, 0.24),
49 ShadowParams(
QPoint(0, -2), 10, 0.14)),
51 CompositeShadowParams(
53 ShadowParams(
QPoint(0, 0), 24, 0.22),
54 ShadowParams(
QPoint(0, -3), 12, 0.12)),
56 CompositeShadowParams(
58 ShadowParams(
QPoint(0, 0), 36, 0.12),
59 ShadowParams(
QPoint(0, -3), 20, 0.05))
62WindowShadow::WindowShadow(
QObject *parent) noexcept
70WindowShadow::~WindowShadow()
75CompositeShadowParams WindowShadow::lookupShadowParams(
int shadowSizeEnum)
77 switch (shadowSizeEnum) {
79 return s_shadowParams[0];
81 return s_shadowParams[1];
83 return s_shadowParams[2];
85 return s_shadowParams[3];
87 return s_shadowParams[4];
90 return s_shadowParams[3];
94void WindowShadow::classBegin()
96 m_shadowTiles = this->shadowTiles();
99 createTile(m_shadowTiles.pixmap(1)),
100 createTile(m_shadowTiles.pixmap(2)),
101 createTile(m_shadowTiles.pixmap(5)),
102 createTile(m_shadowTiles.pixmap(8)),
103 createTile(m_shadowTiles.pixmap(7)),
104 createTile(m_shadowTiles.pixmap(6)),
105 createTile(m_shadowTiles.pixmap(3)),
106 createTile(m_shadowTiles.pixmap(0))
112void WindowShadow::componentComplete()
117void WindowShadow::setView(
QWindow *view)
119 if (view != m_view) {
128QWindow *WindowShadow::view()
const
133void WindowShadow::setGeometry(
const QRect &rect)
135 if (rect != m_rect) {
142QRect WindowShadow::geometry()
const
147void WindowShadow::setRadius(qreal value)
149 if (m_radius != value) {
159qreal WindowShadow::strength()
const
164void WindowShadow::setStrength(qreal strength)
166 if (m_strength != strength) {
167 m_strength = strength;
176void WindowShadow::onViewVisibleChanged(
bool visible)
178 if (visible && m_view) {
183void WindowShadow::configureTiles()
192 qDebug() <<
"TRYING TO HOOK TO THE CASKSERVER" << qApp->desktopFileName() << qApp->desktopFileName();
194 if(chromeInterface->isValid())
196 qDebug() <<
"TRYING TO HOOK TO THE CASKSERVER IS VAL:ID";
198 chromeInterface->call(
"dropShadow",
static_cast<int>(m_radius), qApp->desktopFileName());
201 qDebug() <<
"COULD NTO HOOK TO THE CASKSERVER";
223 m_shadow->
setPadding(shadowMargins(m_shadowTiles));
227KWindowShadowTile::Ptr WindowShadow::createTile(
const QPixmap& source)
229 KWindowShadowTile::Ptr tile = KWindowShadowTile::Ptr::create();
230 tile->setImage(source.
toImage());
234TileSet WindowShadow::shadowTiles()
236 const qreal frameRadius = m_radius;
237 const CompositeShadowParams params = lookupShadowParams(ShadowVeryLarge);
242 auto withOpacity = [](
const QColor &color, qreal opacity) ->
QColor {
244 c.setAlphaF(opacity);
249 const qreal strength = m_strength;
251 const QSize boxSize = BoxShadowRenderer::calculateMinimumBoxSize(params.shadow1.radius)
252 .
expandedTo(BoxShadowRenderer::calculateMinimumBoxSize(params.shadow2.radius));
254 const qreal dpr = qApp->devicePixelRatio();
256 BoxShadowRenderer shadowRenderer;
257 shadowRenderer.setBorderRadius(frameRadius);
258 shadowRenderer.setBoxSize(boxSize);
259 shadowRenderer.setDevicePixelRatio(dpr);
261 shadowRenderer.addShadow(params.shadow1.offset, params.shadow1.radius,
262 withOpacity(color, params.shadow1.opacity * strength));
263 shadowRenderer.addShadow(params.shadow2.offset, params.shadow2.radius,
264 withOpacity(color, params.shadow2.opacity * strength));
266 QImage shadowTexture = shadowRenderer.render();
271 boxRect.moveCenter(outerRect.center());
277 int Shadow_Overlap = 3;
279 boxRect.left() - outerRect.left() - Shadow_Overlap - params.offset.
x(),
280 boxRect.top() - outerRect.top() - Shadow_Overlap - params.offset.
y(),
281 outerRect.right() - boxRect.right() - Shadow_Overlap + params.offset.
x(),
282 outerRect.bottom() - boxRect.bottom() - Shadow_Overlap + params.offset.
y());
287 painter.drawRoundedRect(
295 const QPoint innerRectTopLeft = outerRect.center();
298 innerRectTopLeft.
x(),
299 innerRectTopLeft.
y(),
307 const CompositeShadowParams params = lookupShadowParams(ShadowVeryLarge);
311 const QSize boxSize = BoxShadowRenderer::calculateMinimumBoxSize(params.shadow1.radius)
312 .
expandedTo(BoxShadowRenderer::calculateMinimumBoxSize(params.shadow2.radius));
314 const QSize shadowSize = BoxShadowRenderer::calculateMinimumShadowTextureSize(boxSize, params.shadow1.radius, params.shadow1.offset)
315 .
expandedTo(BoxShadowRenderer::calculateMinimumShadowTextureSize(boxSize, params.shadow2.radius, params.shadow2.offset));
320 boxRect.moveCenter(shadowRect.center());
322 int Shadow_Overlap = 4;
324 boxRect.left() - shadowRect.left() - Shadow_Overlap - params.offset.
x(),
325 boxRect.top() - shadowRect.top() - Shadow_Overlap - params.offset.
y(),
326 shadowRect.right() - boxRect.right() - Shadow_Overlap + params.offset.
x(),
327 shadowRect.bottom() - boxRect.bottom() - Shadow_Overlap + params.offset.
y());
void setBottomLeftTile(KWindowShadowTile::Ptr tile)
void setWindow(QWindow *window)
void setRightTile(KWindowShadowTile::Ptr tile)
void setTopRightTile(KWindowShadowTile::Ptr tile)
void setBottomTile(KWindowShadowTile::Ptr tile)
void setBottomRightTile(KWindowShadowTile::Ptr tile)
void setTopLeftTile(KWindowShadowTile::Ptr tile)
void setTopTile(KWindowShadowTile::Ptr tile)
void setLeftTile(KWindowShadowTile::Ptr tile)
void setPadding(const QMargins &padding)
tilesets are collections of stretchable pixmaps corresponding to a given widget corners,...
QDBusConnection sessionBus()
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
CompositionMode_DestinationOut
qreal devicePixelRatio() const const
QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags)
QImage toImage() const const
QSize expandedTo(const QSize &otherSize) const const
void visibleChanged(bool arg)