File indexing completed on 2024-04-28 05:26:20

0001 //////////////////////////////////////////////////////////////////////////////
0002 // breezeblurhelper.cpp
0003 // handle regions passed to kwin for blurring
0004 // -------------------
0005 //
0006 // SPDX-FileCopyrightText: 2018 Alex Nemeth <alex.nemeth329@gmail.com>
0007 //
0008 // Largely rewritten from Oxygen widget style
0009 // SPDX-FileCopyrightText: 2007 Thomas Luebking <thomas.luebking@web.de>
0010 // SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0011 //
0012 // SPDX-License-Identifier: MIT
0013 //////////////////////////////////////////////////////////////////////////////
0014 
0015 #include "breezeblurhelper.h"
0016 #include "breezestyleconfigdata.h"
0017 
0018 #include <KWindowEffects>
0019 
0020 #include <QEvent>
0021 #include <QVector>
0022 
0023 namespace Breeze
0024 {
0025 //___________________________________________________________
0026 BlurHelper::BlurHelper(QObject *parent)
0027     : QObject(parent)
0028 {
0029 }
0030 
0031 //___________________________________________________________
0032 void BlurHelper::registerWidget(QWidget *widget)
0033 {
0034     // install event filter
0035     addEventFilter(widget);
0036 
0037     // schedule shadow area repaint
0038     update(widget);
0039 }
0040 
0041 //___________________________________________________________
0042 void BlurHelper::unregisterWidget(QWidget *widget)
0043 {
0044     // remove event filter
0045     widget->removeEventFilter(this);
0046 }
0047 
0048 //___________________________________________________________
0049 bool BlurHelper::eventFilter(QObject *object, QEvent *event)
0050 {
0051     switch (event->type()) {
0052     case QEvent::Hide:
0053     case QEvent::Show:
0054     case QEvent::Resize: {
0055         // cast to widget and check
0056         QWidget *widget(qobject_cast<QWidget *>(object));
0057 
0058         if (!widget) {
0059             break;
0060         }
0061 
0062         update(widget);
0063         break;
0064     }
0065 
0066     default:
0067         break;
0068     }
0069 
0070     // never eat events
0071     return false;
0072 }
0073 
0074 //___________________________________________________________
0075 void BlurHelper::update(QWidget *widget) const
0076 {
0077     /*
0078     directly from bespin code. Supposedly prevent playing with some 'pseudo-widgets'
0079     that have winId matching some other -random- window
0080     */
0081     if (!(widget->testAttribute(Qt::WA_WState_Created) || widget->internalWinId())) {
0082         return;
0083     }
0084 
0085     widget->winId(); // force creation of the window handle
0086     KWindowEffects::enableBlurBehind(widget->windowHandle(), true);
0087 
0088     // force update
0089     if (widget->isVisible()) {
0090         widget->update();
0091     }
0092 }
0093 }