diff options
Diffstat (limited to 'kwin/clients/test')
-rw-r--r-- | kwin/clients/test/Makefile.am | 15 | ||||
-rw-r--r-- | kwin/clients/test/test.cpp | 343 | ||||
-rw-r--r-- | kwin/clients/test/test.desktop | 67 | ||||
-rw-r--r-- | kwin/clients/test/test.h | 49 |
4 files changed, 474 insertions, 0 deletions
diff --git a/kwin/clients/test/Makefile.am b/kwin/clients/test/Makefile.am new file mode 100644 index 000000000..a5a3fcf67 --- /dev/null +++ b/kwin/clients/test/Makefile.am @@ -0,0 +1,15 @@ +INCLUDES = -I$(srcdir)/../../lib $(all_includes) + +kde_module_LTLIBRARIES = kwin3_test.la + +kwin3_test_la_SOURCES = test.cpp +kwin3_test_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module +kwin3_test_la_LIBADD = $(LIB_KDEUI) ../../lib/libkdecorations.la +#kwin_keramik_la_LDFLAGS = $(all_libraries) -avoid-version -module $(KDE_RPATH) $(KDE_MT_LDFLAGS) + +METASOURCES = AUTO + +kwin_test_lnkdir = $(kde_datadir)/kwin +kwin_test_lnk_DATA = test.desktop + +EXTRA_DIST = $(kwin_test_lnk_DATA) diff --git a/kwin/clients/test/test.cpp b/kwin/clients/test/test.cpp new file mode 100644 index 000000000..abac77e64 --- /dev/null +++ b/kwin/clients/test/test.cpp @@ -0,0 +1,343 @@ +#include "test.h" + +#include <qtooltip.h> +#include <kglobal.h> +#include <kdebug.h> + +namespace KWinTest +{ + +Decoration::Decoration( KDecorationBridge* bridge, KDecorationFactory* factory ) + : KDecoration( bridge, factory ), + button( NULL ) + { + } + +void Decoration::init() + { + createMainWidget(); + widget()->setEraseColor( red ); + widget()->installEventFilter( this ); + if( isCloseable()) + { + button = new QPushButton( widget()); + button->show(); + button->setCursor( arrowCursor ); + button->move( 0, 0 ); + connect( button, SIGNAL( clicked()), SLOT( closeWindow())); + QToolTip::add( button, "Zelva Mana" ); + } + } + +Decoration::MousePosition Decoration::mousePosition( const QPoint& p ) const + { + const int range = 16; + const int border = 4; + + MousePosition m = Nowhere; + + int width = widget()->width(); + int height = widget()->height(); + if ( ( p.x() > border && p.x() < width - border ) + && ( p.y() > border && p.y() < height - border ) ) + return Center; + + if ( p.y() <= range && p.x() <= range) + m = TopLeft2; + else if ( p.y() >= height-range && p.x() >= width-range) + m = BottomRight2; + else if ( p.y() >= height-range && p.x() <= range) + m = BottomLeft2; + else if ( p.y() <= range && p.x() >= width-range) + m = TopRight2; + else if ( p.y() <= border ) + m = Top; + else if ( p.y() >= height-border ) + m = Bottom; + else if ( p.x() <= border ) + m = Left; + else if ( p.x() >= width-border ) + m = Right; + else + m = Center; + return m; + } + +void Decoration::borders( int& left, int& right, int& top, int& bottom ) const + { + if( options()->preferredBorderSize( factory()) == BorderTiny ) + { + left = right = bottom = 1; + top = 5; + } + else + { + left = right = options()->preferredBorderSize( factory()) * 5; + top = options()->preferredBorderSize( factory()) * 10; + bottom = options()->preferredBorderSize( factory()) * 2; + } + if( isShade()) + bottom = 0; + if( ( maximizeMode() & MaximizeHorizontal ) && !options()->moveResizeMaximizedWindows()) + left = right = 0; + if( ( maximizeMode() & MaximizeVertical ) && !options()->moveResizeMaximizedWindows()) + bottom = 0; + } + +void Decoration::reset( unsigned long ) + { + } + +void Decoration::resize( const QSize& s ) + { + widget()->resize( s ); + } + +QSize Decoration::minimumSize() const + { + return QSize( 100, 50 ); + } + +bool Decoration::eventFilter( QObject* o, QEvent* e ) + { + if( o == widget()) + { + switch( e->type()) + { + case QEvent::MouseButtonPress: + { // FRAME + processMousePressEvent( static_cast< QMouseEvent* >( e )); + return true; + } + case QEvent::Show: + break; + case QEvent::Hide: + break; + default: + break; + } + } + return false; + } + +} +#include <qapplication.h> +#include <qpainter.h> +#include <X11/Xlib.h> +#include <math.h> +#include <unistd.h> +namespace KWinTest +{ + +// taken from riscos +bool Decoration::animateMinimize(bool iconify) +{ + int style = 1; + switch (style) { + + case 1: + { + // Double twisting double back, with pike ;) + + if (!iconify) // No animation for restore. + return true; + + // Go away quick. + helperShowHide( false ); + qApp->syncX(); + + QRect r = iconGeometry(); + + if (!r.isValid()) + return true; + + // Algorithm taken from Window Maker (http://www.windowmaker.org) + + int sx = geometry().x(); + int sy = geometry().y(); + int sw = width(); + int sh = height(); + int dx = r.x(); + int dy = r.y(); + int dw = r.width(); + int dh = r.height(); + + double steps = 12; + + double xstep = double((dx-sx)/steps); + double ystep = double((dy-sy)/steps); + double wstep = double((dw-sw)/steps); + double hstep = double((dh-sh)/steps); + + double cx = sx; + double cy = sy; + double cw = sw; + double ch = sh; + + double finalAngle = 3.14159265358979323846; + + double delta = finalAngle / steps; + + QPainter p( workspaceWidget()); + p.setRasterOp(Qt::NotROP); + + for (double angle = 0; ; angle += delta) { + + if (angle > finalAngle) + angle = finalAngle; + + double dx = (cw / 10) - ((cw / 5) * sin(angle)); + double dch = (ch / 2) * cos(angle); + double midy = cy + (ch / 2); + + QPoint p1(int(cx + dx), int(midy - dch)); + QPoint p2(int(cx + cw - dx), p1.y()); + QPoint p3(int(cx + dw + dx), int(midy + dch)); + QPoint p4(int(cx - dx), p3.y()); + + grabXServer(); + + p.drawLine(p1, p2); + p.drawLine(p2, p3); + p.drawLine(p3, p4); + p.drawLine(p4, p1); + + p.flush(); + + usleep(500); + + p.drawLine(p1, p2); + p.drawLine(p2, p3); + p.drawLine(p3, p4); + p.drawLine(p4, p1); + + ungrabXServer(); + +// FRAME qApp->processEvents(); // FRAME ??? + + cx += xstep; + cy += ystep; + cw += wstep; + ch += hstep; + + if (angle >= finalAngle) + break; + } + } + break; + + case 2: + { + // KVirc style ? Maybe. For qwertz. + + if (!iconify) // No animation for restore. + return true; + + // Go away quick. + helperShowHide( false ); + + qApp->syncX(); + + int stepCount = 12; + + QRect r(geometry()); + + int dx = r.width() / (stepCount * 2); + int dy = r.height() / (stepCount * 2); + + QPainter p( workspaceWidget()); + p.setRasterOp(Qt::NotROP); + + for (int step = 0; step < stepCount; step++) { + + r.moveBy(dx, dy); + r.setWidth(r.width() - 2 * dx); + r.setHeight(r.height() - 2 * dy); + + grabXServer(); + + p.drawRect(r); + p.flush(); + usleep(200); + p.drawRect(r); + + ungrabXServer(); + +// FRAME qApp->processEvents(); + } + } + break; + + + default: + { + QRect icongeom = iconGeometry(); + + if (!icongeom.isValid()) + return true; + + QRect wingeom = geometry(); + + QPainter p( workspaceWidget()); + + p.setRasterOp(Qt::NotROP); + +#if 0 + if (iconify) + p.setClipRegion( + QRegion( workspaceWidget()->rect()) - wingeom + ); +#endif + + grabXServer(); + + p.drawLine(wingeom.bottomRight(), icongeom.bottomRight()); + p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft()); + p.drawLine(wingeom.topLeft(), icongeom.topLeft()); + p.drawLine(wingeom.topRight(), icongeom.topRight()); + + p.flush(); + + qApp->syncX(); + + usleep(30000); + + p.drawLine(wingeom.bottomRight(), icongeom.bottomRight()); + p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft()); + p.drawLine(wingeom.topLeft(), icongeom.topLeft()); + p.drawLine(wingeom.topRight(), icongeom.topRight()); + + ungrabXServer(); + } + break; + } + return true; +} + +KDecoration* Factory::createDecoration( KDecorationBridge* bridge ) + { + NET::WindowType type = windowType( SUPPORTED_WINDOW_TYPES_MASK, bridge ); + if( type == NET::Dialog ) + ; + return new Decoration( bridge, this ); + } + +bool Factory::reset( unsigned long changed ) + { + resetDecorations( changed ); + return false; + } + +} // namespace + +extern "C" +{ + +KDE_EXPORT KDecorationFactory *create_factory() + { + return new KWinTest::Factory(); + } + +} + +#include "test.moc" diff --git a/kwin/clients/test/test.desktop b/kwin/clients/test/test.desktop new file mode 100644 index 000000000..ed340f573 --- /dev/null +++ b/kwin/clients/test/test.desktop @@ -0,0 +1,67 @@ +[Desktop Entry] +Name=KWin test +Name[af]=KWin toets +Name[ar]=اختبار KWin +Name[az]=KWin sınağı +Name[be]=Тэст KWin +Name[bn]=Kwin পরীক্ষা +Name[ca]=Test de KWin +Name[csb]=Test KWin +Name[cy]=arbrawf KWin +Name[da]=KWin-test +Name[de]=KWin-Test +Name[el]=KWin τεστ +Name[eo]=Testo de KDE-fenestroadministrilo +Name[es]=Prueba de KWin +Name[eu]=KWin froga +Name[fa]=آزمون KWin +Name[fi]=KWin-testi +Name[fr]=Test de KWin +Name[ga]=Tástáil KWim +Name[gl]=Proba de KWin +Name[he]=ניסיון KWin +Name[hi]=के-विन जांच +Name[hr]=KWina proba +Name[hu]=KWin-teszt +Name[is]=KWin prófun +Name[it]=Prova KWin +Name[ja]=KWin テスト +Name[ka]=KWin შემოწმება +Name[kk]=KWin сынауы +Name[km]=សាកល្បង KWin +Name[ko]=KWin 테스트 +Name[lt]=KWin patikrinimas +Name[lv]=KWin tests +Name[mk]=Тест за KWin +Name[mn]=KWin шалгалт +Name[ms]=Ujian KWin +Name[nds]=KWin-Test +Name[ne]=के विन परीक्षण +Name[nn]=KWin-test +Name[pa]=KWin ਜਾਂਚ +Name[pl]=Test KWin +Name[pt]=Teste do KWin +Name[pt_BR]=Teste do KWin +Name[ro]=Test KWin +Name[ru]=Проверка KWin +Name[rw]= Isuzuma rya KWin +Name[se]=KWin-geahččaleapmi +Name[sk]=Test KWin +Name[sl]=Preizkus KWin +Name[sr]=Проба KWin-а +Name[sr@Latn]=Proba KWin-a +Name[sv]=Kwin-test +Name[ta]=KWin சோதனை +Name[te]=కెవిన్ పరిక్ష +Name[tg]=Тафтиши KWin +Name[th]=ทดสอบ KWin +Name[tr]=KWin Testi +Name[tt]=KWin sınaw +Name[uk]=Тест KWin +Name[uz]=KWin sinash +Name[uz@cyrillic]=KWin синаш +Name[vi]=Thử KWin +Name[wa]=Saye KPurnea +Name[zh_CN]=KWin 测试 +Name[zh_TW]=KWin 測試 +X-KDE-Library=kwin3_test diff --git a/kwin/clients/test/test.h b/kwin/clients/test/test.h new file mode 100644 index 000000000..56e21dbc0 --- /dev/null +++ b/kwin/clients/test/test.h @@ -0,0 +1,49 @@ +#ifndef KWIN_TEST +#define KWIN_TEST + +#include <kdecoration.h> +#include <kdecorationfactory.h> +#include <qpushbutton.h> + +namespace KWinTest +{ + +const int SUPPORTED_WINDOW_TYPES_MASK = NET::NormalMask | NET::DesktopMask | NET::DockMask + | NET::ToolbarMask | NET::MenuMask | NET::DialogMask /*| NET::OverrideMask*/ | NET::TopMenuMask + | NET::UtilityMask | NET::SplashMask; + +class Decoration + : public KDecoration + { + Q_OBJECT + public: + Decoration( KDecorationBridge* bridge, KDecorationFactory* factory ); + virtual void init(); + virtual MousePosition mousePosition( const QPoint& p ) const; + virtual void borders( int& left, int& right, int& top, int& bottom ) const; + virtual void resize( const QSize& s ); + virtual QSize minimumSize() const; + virtual void activeChange() {}; + virtual void captionChange() {}; + virtual void maximizeChange() {}; + virtual void desktopChange() {}; + virtual void shadeChange() {}; + virtual void iconChange() {}; + virtual bool eventFilter( QObject* o, QEvent* e ); + virtual void reset( unsigned long changed ); + virtual bool animateMinimize( bool minimize ); + private: + QPushButton* button; + }; + +class Factory + : public KDecorationFactory + { + public: + virtual KDecoration* createDecoration( KDecorationBridge* ); + virtual bool reset( unsigned long changed ); + }; + +} // namespace + +#endif |