diff --git a/kstyle/breezeshadowhelper.h b/kstyle/breezeshadowhelper.h --- a/kstyle/breezeshadowhelper.h +++ b/kstyle/breezeshadowhelper.h @@ -38,6 +38,7 @@ { class ShadowManager; class ShmPool; + class Surface; } } #endif @@ -157,6 +158,9 @@ //* registered widgets QMap _widgets; + //* registered widgets to wayland surface mappings + QMap _widgetSurfaces; + //* tileset TileSet _shadowTiles; diff --git a/kstyle/breezeshadowhelper.cpp b/kstyle/breezeshadowhelper.cpp --- a/kstyle/breezeshadowhelper.cpp +++ b/kstyle/breezeshadowhelper.cpp @@ -171,16 +171,40 @@ //_______________________________________________________ bool ShadowHelper::eventFilter( QObject* object, QEvent* event ) { + if( Helper::isWayland() ) + { + QWidget* widget( static_cast( object ) ); + if( event->type() == QEvent::Paint ) + { + auto iter = _widgetSurfaces.constFind( widget ); + if( iter == _widgetSurfaces.constEnd() ) + { + // install shadows and update winId + installShadows( widget ); + } + } + else if( event->type() == QEvent::Hide ) + { + auto iter = _widgetSurfaces.find( widget ); + if( iter != _widgetSurfaces.end() ) + { + delete iter.value(); + _widgetSurfaces.erase( iter ); + } + } + } + else if( Helper::isX11() ) + { + // check event type + if( event->type() != QEvent::WinIdChange ) return false; - // check event type - if( event->type() != QEvent::WinIdChange ) return false; - - // cast widget - QWidget* widget( static_cast( object ) ); + // cast widget + QWidget* widget( static_cast( object ) ); - // install shadows and update winId - if( installShadows( widget ) ) - { _widgets.insert( widget, widget->winId() ); } + // install shadows and update winId + if( installShadows( widget ) ) + { _widgets.insert( widget, widget->winId() ); } + } return false; @@ -464,6 +488,7 @@ shadow->setOffsets( shadowMargins( widget ) ); shadow->commit(); s->commit( Surface::CommitFlag::None ); + _widgetSurfaces.insert(widget, s); return true; #else