327 lines
7.3 KiB
C++
327 lines
7.3 KiB
C++
|
#include "test.h"
|
||
|
|
||
|
#include <qtooltip.h>
|
||
|
#include <kglobal.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->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() == BorderTiny )
|
||
|
{
|
||
|
left = right = bottom = 1;
|
||
|
top = 5;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
left = right = options()->preferredBorderSize() * 5;
|
||
|
top = options()->preferredBorderSize() * 10;
|
||
|
bottom = options()->preferredBorderSize() * 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() && e->type() == QEvent::MouseButtonPress )
|
||
|
{ // FRAME
|
||
|
processMousePressEvent( static_cast< QMouseEvent* >( e ));
|
||
|
return true;
|
||
|
}
|
||
|
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());
|
||
|
|
||
|
XGrabServer(qt_xdisplay());
|
||
|
|
||
|
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);
|
||
|
|
||
|
XUngrabServer(qt_xdisplay());
|
||
|
|
||
|
// 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);
|
||
|
|
||
|
XGrabServer(qt_xdisplay());
|
||
|
|
||
|
p.drawRect(r);
|
||
|
p.flush();
|
||
|
usleep(200);
|
||
|
p.drawRect(r);
|
||
|
|
||
|
XUngrabServer(qt_xdisplay());
|
||
|
|
||
|
// 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
|
||
|
|
||
|
XGrabServer(qt_xdisplay());
|
||
|
|
||
|
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());
|
||
|
|
||
|
XUngrabServer(qt_xdisplay());
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
KDecoration* Factory::createDecoration( KDecorationBridge* bridge )
|
||
|
{
|
||
|
return new Decoration( bridge, this );
|
||
|
}
|
||
|
|
||
|
bool Factory::reset( unsigned long changed )
|
||
|
{
|
||
|
resetDecorations( changed );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
extern "C"
|
||
|
{
|
||
|
|
||
|
KDecorationFactory *create_factory()
|
||
|
{
|
||
|
return new KWinTest::Factory();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
#include "test.moc"
|