//______________________________________________ void ShadowHelper::initialize( const ColorUtils::Rgba& color, const WindowShadow& shadow ) { #if OXYGEN_DEBUG std::cerr << "Oxygen::ShadowHelper::initialize" << std::endl; #endif reset(); _size = int(shadow.shadowSize()) - WindowShadow::Overlap; // round tiles WindowShadowKey key; key.hasTopBorder = true; key.hasBottomBorder = true; _roundTiles = shadow.tileSet( color, key ); // square tiles key.hasTopBorder = false; key.hasBottomBorder = false; _squareTiles = shadow.tileSet( color, key ); // re-install shadows for all windowId for( WidgetMap::const_iterator iter = _widgets.begin(); iter != _widgets.end(); ++iter ) { installX11Shadows( iter->first ); } }
bool ShadowHelper::eventFilter(QObject *object, QEvent *event) { if (event->type() == QEvent::WinIdChange) installX11Shadows(static_cast<QWidget*>(object)); return false; }
//_______________________________________________________ bool ShadowHelper::registerWidget(QWidget* widget, bool force) { // make sure widget is not already registered if (_widgets.contains(widget)) { return false; } // check if widget qualifies if (!(force || acceptWidget(widget))) { return false; } // store in map and add destroy signal connection Utils::addEventFilter(widget, this); _widgets.insert(widget, 0); /* need to install shadow directly when widget "created" state is already set since WinID changed is never called when this is the case */ if (installX11Shadows(widget)) { _widgets.insert(widget, widget->internalWinId()); } connect(widget, SIGNAL(destroyed(QObject*)), SLOT(objectDeleted(QObject*))); return true; }
//_______________________________________________________ bool ShadowHelper::eventFilter(QObject* object, QEvent* event) { // check event type if (event->type() != QEvent::WinIdChange) return false; // cast widget QWidget *widget(static_cast<QWidget*>(object)); // install shadows and update winId if (installX11Shadows(widget)) { _widgets.insert(widget, widget->internalWinId()); } return false; }
bool ShadowHelper::registerWidget(QWidget *widget, bool force) { QtcQWidgetProps props(widget); // make sure widget is not already registered if (props->shadowRegistered) return false; // check if widget qualifies if (!(force || acceptWidget(widget))) return false; props->shadowRegistered = true; // WinIdChange Event, should not happen though widget->installEventFilter(this); installX11Shadows(widget); return true; }
//_______________________________________________________ void ShadowHelper::reloadConfig( void ) { // shadow cache shadowCache().readConfig(); // reset reset(); // retrieve shadow pixmap _size = shadowCache().shadowSize(); QPixmap pixmap( shadowCache().pixmap( ShadowCache::Key() ) ); if( !pixmap.isNull() ) { QPainter painter( &pixmap ); // add transparency painter.setCompositionMode(QPainter::CompositionMode_DestinationIn); painter.fillRect( pixmap.rect(), QColor( 0, 0, 0, 150 ) ); } // recreate tileset _tiles = TileSet( pixmap, pixmap.width()/2, pixmap.height()/2, 1, 1 ); if( !pixmap.isNull() ) { QPainter painter( &pixmap ); // add round corners const QRect cornerRect( (pixmap.width()-10)/2, (pixmap.height()-10)/2, 10, 10 ); _helper.roundCorner( QPalette().color( QPalette::Window ) )->render( cornerRect, &painter ); } // recreate tileset _dockTiles = TileSet( pixmap, pixmap.width()/2, pixmap.height()/2, 1, 1 ); // update property for registered widgets for( QMap<QWidget*,WId>::const_iterator iter = _widgets.constBegin(); iter != _widgets.constEnd(); ++iter ) { installX11Shadows( iter.key() ); } }
//______________________________________________ bool ShadowHelper::registerWidget( GtkWidget* widget ) { // check widget if( !( widget && GTK_IS_WINDOW( widget ) ) ) return false; // make sure that widget is not already registered if( _widgets.find( widget ) != _widgets.end() ) return false; // check if window is accepted if( !acceptWidget( widget ) ) return false; // try install shadows installX11Shadows( widget ); // register in map and returns success WidgetData data; data._destroyId.connect( G_OBJECT( widget ), "destroy", G_CALLBACK( destroyNotifyEvent ), this ); _widgets.insert( std::make_pair( widget, data ) ); return true; }