summaryrefslogtreecommitdiff
path: root/library/qpedecoration_qws.cpp
Side-by-side diff
Diffstat (limited to 'library/qpedecoration_qws.cpp') (more/less context) (show whitespace changes)
-rw-r--r--library/qpedecoration_qws.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/library/qpedecoration_qws.cpp b/library/qpedecoration_qws.cpp
index 933542d..bac1a75 100644
--- a/library/qpedecoration_qws.cpp
+++ b/library/qpedecoration_qws.cpp
@@ -323,389 +323,397 @@ static QImage *closeImage( int th )
static QImage *helpImage( int th )
{
static QImage *i = 0;
if ( !i || i->height() != th ) {
delete i;
i = new QImage(scaleButton(Resource::loadImage("HelpButton"),th));
}
return i;
}
static QImage *maximizeImage( int th )
{
static QImage *i = 0;
if ( !i || i->height() != th ) {
delete i;
i = new QImage(scaleButton(Resource::loadImage("MaximizeButton"),th));
}
return i;
}
int WindowDecorationInterface::metric( Metric m, const WindowData *wd ) const
{
switch ( m ) {
case TitleHeight:
if ( QApplication::desktop()->height() > 320 )
return 19;
else
return 15;
case LeftBorder:
case RightBorder:
case TopBorder:
case BottomBorder:
return 4;
case OKWidth:
return okImage(metric(TitleHeight,wd))->width();
case CloseWidth:
return closeImage(metric(TitleHeight,wd))->width();
case HelpWidth:
return helpImage(metric(TitleHeight,wd))->width();
case MaximizeWidth:
return maximizeImage(metric(TitleHeight,wd))->width();
case CornerGrabSize:
return 16;
}
return 0;
}
void WindowDecorationInterface::drawArea( Area a, QPainter *p, const WindowData *wd ) const
{
int th = metric( TitleHeight, wd );
QRect r = wd->rect;
switch ( a ) {
case Border:
{
const QColorGroup &cg = wd->palette.active();
qDrawWinPanel(p, r.x()-metric(LeftBorder,wd),
r.y()-th-metric(TopBorder,wd),
r.width()+metric(LeftBorder,wd)+metric(RightBorder,wd),
r.height()+th+metric(TopBorder,wd)+metric(BottomBorder,wd),
cg, FALSE, &cg.brush(QColorGroup::Background));
}
break;
case Title:
{
const QColorGroup &cg = wd->palette.active();
QBrush titleBrush;
QPen titleLines;
if ( wd->flags & WindowData::Active ) {
titleBrush = cg.brush(QColorGroup::Highlight);
titleLines = titleBrush.color().dark();
} else {
titleBrush = cg.brush(QColorGroup::Background);
titleLines = titleBrush.color();
}
p->fillRect( r.x(), r.y()-th, r.width(), th, titleBrush);
p->setPen( titleLines );
for ( int i = r.y()-th; i < r.y(); i += 2 )
p->drawLine( r.left(), i, r.right(), i );
}
break;
case TitleText:
p->drawText( r.x()+3+metric(HelpWidth,wd), r.top()-th,
r.width()-metric(OKWidth,wd)-metric(CloseWidth,wd),
th, QPainter::AlignVCenter, wd->caption);
break;
}
}
void WindowDecorationInterface::drawButton( Button b, QPainter *p, const WindowData *wd, int x, int y, int, int, QWSButton::State state ) const
{
QImage *img = 0;
switch ( b ) {
case OK:
img = okImage(metric(TitleHeight,wd));
break;
case Close:
img = closeImage(metric(TitleHeight,wd));
break;
case Help:
img = helpImage(metric(TitleHeight,wd));
break;
case Maximize:
img = maximizeImage(metric(TitleHeight,wd));
break;
}
if ( img ) {
if ((state & QWSButton::MouseOver) && (state & QWSButton::Clicked))
p->drawImage(x+2, y+2, *img);
else
p->drawImage(x+1, y+1, *img);
}
}
QRegion WindowDecorationInterface::mask( const WindowData *wd ) const
{
int th = metric(TitleHeight,wd);
QRect rect( wd->rect );
QRect r(rect.left() - metric(LeftBorder,wd),
rect.top() - th - metric(TopBorder,wd),
rect.width() + metric(LeftBorder,wd) + metric(RightBorder,wd),
rect.height() + th + metric(TopBorder,wd) + metric(BottomBorder,wd));
return QRegion(r) - rect;
}
class DefaultWindowDecoration : public WindowDecorationInterface
{
public:
DefaultWindowDecoration() : ref(0) {}
QString name() const {
return "Default";
}
QPixmap icon() const {
return QPixmap();
}
QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {
*iface = 0;
if ( uuid == IID_QUnknown )
*iface = this;
else if ( uuid == IID_WindowDecoration )
*iface = this;
if ( *iface )
(*iface)->addRef();
return QS_OK;
}
Q_REFCOUNT
private:
ulong ref;
};
static WindowDecorationInterface *wdiface = 0;
static QLibrary *wdlib = 0;
static QString libname;
//===========================================================================
QPEDecoration::QPEDecoration()
: QWSDefaultDecoration()
{
init ( libname );
}
QPEDecoration::QPEDecoration( const QString &plugin )
: QWSDefaultDecoration()
{
init ( plugin );
}
void QPEDecoration::init ( const QString &plugin )
{
libname = plugin;
if ( wdlib ) {
wdiface->release();
wdlib->unload();
delete wdlib;
wdlib = 0;
} else {
delete wdiface;
}
WindowDecorationInterface *iface = 0;
QString path = QPEApplication::qpeDir() + "/plugins/decorations/";
+#ifdef Q_OS_MACX
+ if ( plugin.find( ".dylib" ) > 0 ) {
+#else
if ( plugin.find( ".so" ) > 0 ) {
+#endif
// full library name supplied
path += plugin;
} else {
+#ifdef Q_OS_MACX
+ path += "lib" + plugin.lower() + ".dylib"; // compatibility
+#else
path += "lib" + plugin.lower() + ".so"; // compatibility
+#endif
}
QLibrary *lib = new QLibrary( path );
if ( lib->queryInterface( IID_WindowDecoration, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
wdiface = iface;
wdlib = lib;
} else {
delete lib;
wdiface = new DefaultWindowDecoration;
}
helpFile = QString(qApp->argv()[0]) + ".html";
QStringList helpPath = Global::helpPath();
helpExists = FALSE;
for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end() && !helpExists; ++it) {
helpExists = QFile::exists( *it + "/" + helpFile );
//qDebug ( "Checking %s/%s for help: %d", (*it).latin1(), helpFile.latin1(),helpExists);
}
qpeManager = new QPEManager( this );
// Qtopia 1.5 compatibility
imageOk = *okImage ( 15 );
imageClose = *closeImage ( 15 );
imageHelp = *helpImage ( 15 );
}
QPEDecoration::~QPEDecoration()
{
delete qpeManager;
}
const char **QPEDecoration::menuPixmap()
{
return (const char **)0;
}
const char **QPEDecoration::closePixmap()
{
return (const char **)qpe_close_xpm;
}
const char **QPEDecoration::minimizePixmap()
{
return (const char **)qpe_accept_xpm;
}
const char **QPEDecoration::maximizePixmap()
{
return (const char **)0;
}
const char **QPEDecoration::normalizePixmap()
{
return (const char **)0;
}
int QPEDecoration::getTitleHeight( const QWidget *w )
{
WindowDecorationInterface::WindowData wd;
windowData( w, wd );
return wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
}
/*
If rect is empty, no frame is added. (a hack, really)
*/
QRegion QPEDecoration::region(const QWidget *widget, const QRect &rect, QWSDecoration::Region type)
{
qpeManager->updateActive();
WindowDecorationInterface::WindowData wd;
windowData( widget, wd );
wd.rect = rect;
int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
int okWidth = wdiface->metric(WindowDecorationInterface::OKWidth,&wd);
int closeWidth = wdiface->metric(WindowDecorationInterface::CloseWidth,&wd);
int helpWidth = wdiface->metric(WindowDecorationInterface::HelpWidth,&wd);
int grab = wdiface->metric(WindowDecorationInterface::CornerGrabSize,&wd);
QRegion region;
switch ((int)type) {
case Menu:
break;
case Maximize:
if ( !widget->inherits( "QDialog" ) && qApp->desktop()->width() > 350 ) {
int maximizeWidth = wdiface->metric(WindowDecorationInterface::MaximizeWidth,&wd);
int left = rect.right() - maximizeWidth - closeWidth;
if ( ((HackWidget *)widget)->needsOk() )
left -= okWidth;
QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight);
region = r;
}
break;
case Minimize:
if ( ((HackWidget *)widget)->needsOk() ) {
QRect r(rect.right() - okWidth,
rect.top() - titleHeight, okWidth, titleHeight);
if (r.left() > rect.left() + titleHeight)
region = r;
}
break;
case Close:
{
int left = rect.right() - closeWidth;
if ( ((HackWidget *)widget)->needsOk() )
left -= okWidth;
QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight);
region = r;
}
break;
case Title:
if ( !widget->isMaximized() ) {
int width = rect.width() - helpWidth - closeWidth;
if ( ((HackWidget *)widget)->needsOk() )
width -= okWidth;
QRect r(rect.left()+helpWidth, rect.top() - titleHeight,
width, titleHeight);
if (r.width() > 0)
region = r;
}
break;
case Help:
if ( helpExists || widget->testWFlags(Qt::WStyle_ContextHelp) ) {
QRect r(rect.left(), rect.top() - titleHeight,
helpWidth, titleHeight);
region = r;
}
break;
case Top:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int b = wdiface->metric(WindowDecorationInterface::TopBorder,&wd);
region = m & QRect( br.left()+grab, br.top(),
br.width()-2*grab, b );
}
break;
case Left:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int b = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd);
region = m & QRect( br.left(), br.top()+grab,
b, br.height()-2*grab );
}
break;
case Right:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int b = wdiface->metric(WindowDecorationInterface::RightBorder,&wd);
region = m & QRect( rect.right(), br.top()+grab,
b, br.height()-2*grab );
}
break;
case Bottom:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int b = wdiface->metric(WindowDecorationInterface::BottomBorder,&wd);
region = m & QRect( br.left()+grab, rect.bottom(),
br.width()-2*grab, b );
}
break;
case TopLeft:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd);
int lb = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd);
QRegion crgn( br.left(), br.top(), grab, tb );
crgn |= QRect( br.left(), br.top(), lb, grab );
region = m & crgn;
}
break;
case TopRight:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd);
int rb = wdiface->metric(WindowDecorationInterface::RightBorder,&wd);
QRegion crgn( br.right()-grab, br.top(), grab, tb );
crgn |= QRect( br.right()-rb, br.top(), rb, grab );
region = m & crgn;
}
break;
case BottomLeft:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();