diff options
Diffstat (limited to 'kwin/tools/decobenchmark/preview.cpp')
-rw-r--r-- | kwin/tools/decobenchmark/preview.cpp | 412 |
1 files changed, 412 insertions, 0 deletions
diff --git a/kwin/tools/decobenchmark/preview.cpp b/kwin/tools/decobenchmark/preview.cpp new file mode 100644 index 000000000..35301c513 --- /dev/null +++ b/kwin/tools/decobenchmark/preview.cpp @@ -0,0 +1,412 @@ +/* + * + * Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "preview.h" + +#include <kdebug.h> + +#include <kapplication.h> +#include <klocale.h> +#include <kconfig.h> +#include <kglobal.h> +#include <qlabel.h> +#include <qstyle.h> +#include <kiconloader.h> + +#include <X11/Xlib.h> +#include <X11/extensions/shape.h> + +#include <kdecorationfactory.h> +#include <kdecoration_plugins_p.h> + +// FRAME the preview doesn't update to reflect the changes done in the kcm + +KDecorationPreview::KDecorationPreview( KDecorationPlugins* plugin, QWidget* parent, const char* name ) + : QWidget( parent, name ), + m_plugin(plugin) +{ + options = new KDecorationPreviewOptions; + + bridge = new KDecorationPreviewBridge( this, true, "Deco Benchmark" ); + + deco = 0; + + setFixedSize( 600, 500 ); + + positionPreviews(); +} + +KDecorationPreview::~KDecorationPreview() +{ + delete deco; + delete bridge; + delete options; +} + +void KDecorationPreview::performRepaintTest(int n) +{ + kdDebug() << "start " << n << " repaints..." << endl; + bridge->setCaption("Deco Benchmark"); + deco->captionChange(); + positionPreviews(0); + for (int i = 0; i < n; ++i) { + deco->widget()->repaint(); + kapp->processEvents(); + } +} + +void KDecorationPreview::performCaptionTest(int n) +{ + kdDebug() << "start " << n << " caption changes..." << endl; + QString caption = "Deco Benchmark %1"; + positionPreviews(0); + for (int i = 0; i < n; ++i) { + bridge->setCaption(caption.arg(i) ); + deco->captionChange(); + deco->widget()->repaint(); + kapp->processEvents(); + } +} + +void KDecorationPreview::performResizeTest(int n) +{ + kdDebug() << "start " << n << " resizes..." << endl; + bridge->setCaption("Deco Benchmark"); + deco->captionChange(); + for (int i = 0; i < n; ++i) { + positionPreviews(i % 200); + kapp->processEvents(); + } +} + +void KDecorationPreview::performRecreationTest(int n) +{ + kdDebug() << "start " << n << " resizes..." << endl; + bridge->setCaption("Deco Benchmark"); + deco->captionChange(); + positionPreviews(0); + for (int i = 0; i < n; ++i) { + recreateDecoration(); + kapp->processEvents(); + } +} + +bool KDecorationPreview::recreateDecoration() +{ + delete deco; + deco = m_plugin->createDecoration(bridge); + deco->init(); + + if (!deco) + return false; + + positionPreviews(); + deco->widget()->show(); + + return true; +} + +void KDecorationPreview::positionPreviews(int shrink) +{ + if ( !deco ) + return; + + QSize size = QSize(width()-2*10-shrink, height()-2*10-shrink)/*.expandedTo(deco->minimumSize()*/; + + QRect geometry(QPoint(10, 10), size); + deco->widget()->setGeometry(geometry); +} + +void KDecorationPreview::setPreviewMask( const QRegion& reg, int mode ) +{ + QWidget *widget = deco->widget(); + + // FRAME duped from client.cpp + if( mode == Unsorted ) + { + XShapeCombineRegion( qt_xdisplay(), widget->winId(), ShapeBounding, 0, 0, + reg.handle(), ShapeSet ); + } + else + { + QMemArray< QRect > rects = reg.rects(); + XRectangle* xrects = new XRectangle[ rects.count() ]; + for( unsigned int i = 0; + i < rects.count(); + ++i ) + { + xrects[ i ].x = rects[ i ].x(); + xrects[ i ].y = rects[ i ].y(); + xrects[ i ].width = rects[ i ].width(); + xrects[ i ].height = rects[ i ].height(); + } + XShapeCombineRectangles( qt_xdisplay(), widget->winId(), ShapeBounding, 0, 0, + xrects, rects.count(), ShapeSet, mode ); + delete[] xrects; + } +} + +QRect KDecorationPreview::windowGeometry( bool active ) const +{ + QWidget *widget = deco->widget(); + return widget->geometry(); +} + +QRegion KDecorationPreview::unobscuredRegion( bool active, const QRegion& r ) const +{ + return r; +} + +KDecorationPreviewBridge::KDecorationPreviewBridge( KDecorationPreview* p, bool a, const QString &c ) + : preview( p ), active( a ), m_caption( c ) +{ +} + +void KDecorationPreviewBridge::setCaption(const QString &c) +{ + m_caption = c; +} + +QWidget* KDecorationPreviewBridge::initialParentWidget() const + { + return preview; + } + +Qt::WFlags KDecorationPreviewBridge::initialWFlags() const + { + return 0; + } + +bool KDecorationPreviewBridge::isActive() const + { + return active; + } + +bool KDecorationPreviewBridge::isCloseable() const + { + return true; + } + +bool KDecorationPreviewBridge::isMaximizable() const + { + return true; + } + +KDecoration::MaximizeMode KDecorationPreviewBridge::maximizeMode() const + { + return KDecoration::MaximizeRestore; + } + +bool KDecorationPreviewBridge::isMinimizable() const + { + return true; + } + +bool KDecorationPreviewBridge::providesContextHelp() const + { + return true; + } + +int KDecorationPreviewBridge::desktop() const + { + return 1; + } + +bool KDecorationPreviewBridge::isModal() const + { + return false; + } + +bool KDecorationPreviewBridge::isShadeable() const + { + return true; + } + +bool KDecorationPreviewBridge::isShade() const + { + return false; + } + +bool KDecorationPreviewBridge::isSetShade() const + { + return false; + } + +bool KDecorationPreviewBridge::keepAbove() const + { + return false; + } + +bool KDecorationPreviewBridge::keepBelow() const + { + return false; + } + +bool KDecorationPreviewBridge::isMovable() const + { + return true; + } + +bool KDecorationPreviewBridge::isResizable() const + { + return true; + } + +NET::WindowType KDecorationPreviewBridge::windowType( unsigned long ) const + { + return NET::Normal; + } + +QIconSet KDecorationPreviewBridge::icon() const + { + return SmallIconSet( "xapp" ); + } + +QString KDecorationPreviewBridge::caption() const +{ + return m_caption; +} + +void KDecorationPreviewBridge::processMousePressEvent( QMouseEvent* ) + { + } + +void KDecorationPreviewBridge::showWindowMenu( const QRect &) + { + } + +void KDecorationPreviewBridge::showWindowMenu( QPoint ) + { + } + +void KDecorationPreviewBridge::performWindowOperation( WindowOperation ) + { + } + +void KDecorationPreviewBridge::setMask( const QRegion& reg, int mode ) + { + preview->setPreviewMask( reg, mode ); + } + +bool KDecorationPreviewBridge::isPreview() const + { + return false; + } + +QRect KDecorationPreviewBridge::geometry() const + { + return preview->windowGeometry( active ); + } + +QRect KDecorationPreviewBridge::iconGeometry() const + { + return QRect(); + } + +QRegion KDecorationPreviewBridge::unobscuredRegion( const QRegion& r ) const + { + return preview->unobscuredRegion( active, r ); + } + +QWidget* KDecorationPreviewBridge::workspaceWidget() const + { + return preview; + } + +WId KDecorationPreviewBridge::windowId() const + { + return 0; // no decorated window + } + +void KDecorationPreviewBridge::closeWindow() + { + } + +void KDecorationPreviewBridge::maximize( MaximizeMode ) + { + } + +void KDecorationPreviewBridge::minimize() + { + } + +void KDecorationPreviewBridge::showContextHelp() + { + } + +void KDecorationPreviewBridge::setDesktop( int ) + { + } + +void KDecorationPreviewBridge::titlebarDblClickOperation() + { + } + +void KDecorationPreviewBridge::setShade( bool ) + { + } + +void KDecorationPreviewBridge::setKeepAbove( bool ) + { + } + +void KDecorationPreviewBridge::setKeepBelow( bool ) + { + } + +int KDecorationPreviewBridge::currentDesktop() const + { + return 1; + } + +void KDecorationPreviewBridge::helperShowHide( bool ) + { + } + +void KDecorationPreviewBridge::grabXServer( bool ) + { + } + +KDecorationPreviewOptions::KDecorationPreviewOptions() + { + d = new KDecorationOptionsPrivate; + d->defaultKWinSettings(); + updateSettings(); + } + +KDecorationPreviewOptions::~KDecorationPreviewOptions() + { + delete d; + } + +unsigned long KDecorationPreviewOptions::updateSettings() +{ + KConfig cfg( "kwinrc", true ); + unsigned long changed = 0; + changed |= d->updateKWinSettings( &cfg ); + + return changed; +} + +bool KDecorationPreviewPlugins::provides( Requirement ) + { + return false; + } + +// #include "preview.moc" |