fc23037d3a
but not explicitly the license, there I assumed they're licensed under the same license as the rest of KWin, which is GPLv2+ as of now. CC-ing all people mentioned as copyright holders just in case somebody wants some other license, e.g. the X11 license KWin used to be licensed under until KDE3.2. Please check with other relevant contributors and change accordingly in such case. CCMAIL: Karol Szwed <gallium@kde.org> CCMAIL: Luciano Montanaro <mikelima@cirulla.net> CCMAIL: Sandro Giessl <sandro@giessl.com> CCMAIL: Daniel M. Duley <mosfet@kde.org> CCMAIL: Chris Lee <clee@kde.org> svn path=/trunk/KDE/kdebase/workspace/; revision=742990
361 lines
8.4 KiB
C++
361 lines
8.4 KiB
C++
/********************************************************************
|
|
|
|
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, see <http://www.gnu.org/licenses/>.
|
|
*********************************************************************/
|
|
|
|
#include "test.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()));
|
|
button->setToolTip( "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>
|
|
#include <QPainter>
|
|
#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"
|