author | sandman <sandman> | 2002-07-08 00:42:56 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-07-08 00:42:56 (UTC) |
commit | 923a6290c8cc93914d54e583f1d79a6bae638fab (patch) (side-by-side diff) | |
tree | b2562e4dbf6d71631b358021f8c4ec29f36a6d12 | |
parent | 895f43bd1850b3e0c43edaaad18a7d7f2613033b (diff) | |
download | opie-923a6290c8cc93914d54e583f1d79a6bae638fab.zip opie-923a6290c8cc93914d54e583f1d79a6bae638fab.tar.gz opie-923a6290c8cc93914d54e583f1d79a6bae638fab.tar.bz2 |
- Fix a memory leak (bg pixmaps for taskbar applets were never freed)
- Try to be more intelligent about stipple alignment in child widgets
(in every app I tested the stipple is now always aligned right)
-rw-r--r-- | noncore/styles/liquid/liquid.cpp | 16 | ||||
-rw-r--r-- | noncore/styles/liquid/plugin.cpp | 2 |
2 files changed, 10 insertions, 8 deletions
diff --git a/noncore/styles/liquid/liquid.cpp b/noncore/styles/liquid/liquid.cpp index 67e53e9..fc925b8 100644 --- a/noncore/styles/liquid/liquid.cpp +++ b/noncore/styles/liquid/liquid.cpp @@ -32,217 +32,216 @@ #include <qmenubar.h> #include <stdio.h> #include "htmlmasks.h" #include "embeddata.h" typedef void (QStyle::*QDrawMenuBarItemImpl) (QPainter *, int, int, int, int, QMenuItem *, QColorGroup &, bool, bool); QDrawMenuBarItemImpl qt_set_draw_menu_bar_impl(QDrawMenuBarItemImpl impl); void TransMenuHandler::stripePixmap(QPixmap &pix, const QColor &color) { QImage img(pix.convertToImage()); QImageEffect::fade(img, 0.9, color); int x, y; int r, g, b; for(y=0; y < img.height(); y+=3){ unsigned int *data = (unsigned int *) img.scanLine(y); for(x=0; x < img.width(); ++x){ r = qRed(data[x]); g = qGreen(data[x]); b = qBlue(data[x]); if(r-10) r-=10; if(g-10) g-=10; if(b-10) b-=10; data[x] = qRgb(r, g, b); } } pix.convertFromImage(img); } TransMenuHandler::TransMenuHandler(QObject *parent) : QObject(parent) { pixDict.setAutoDelete(true); reloadSettings(); } void TransMenuHandler::reloadSettings() { pixDict.clear(); Config config ( "qpe" ); config. setGroup ( "Liquid-Style" ); type = config. readNumEntry("Type", TransStippleBg); color = QColor ( config. readEntry("Color", QApplication::palette().active().button().name())); fgColor = QColor ( config. readEntry("TextColor", QApplication::palette().active().text().name())); opacity = config. readNumEntry("Opacity", 10); if ( opacity < -20 ) opacity = 20; else if ( opacity > 20 ) opacity = 20; shadowText = config. readBoolEntry("ShadowText", true); } bool TransMenuHandler::eventFilter(QObject *obj, QEvent *ev) { QWidget *p = (QWidget *)obj; if(ev->type() == QEvent::Show){ if(type == TransStippleBg || type == TransStippleBtn || type == Custom){ QApplication::syncX(); QPixmap *pix = new QPixmap; if(p->testWFlags(Qt::WType_Popup)){ QRect r(p->x(), p->y(), p->width(), p->height()); QRect deskR = QApplication::desktop()->rect(); if(r.right() > deskR.right() || r.bottom() > deskR.bottom()){ r.setBottom(deskR.bottom()); r.setRight(deskR.right()); } *pix = QPixmap::grabWindow(QApplication::desktop()-> winId(), r.x(), r.y(), r.width(), r.height()); } else{ // tear off menu pix->resize(p->width(), p->height()); pix->fill(Qt::black.rgb()); } if(type == TransStippleBg){ stripePixmap(*pix, p->colorGroup().background()); } else if(type == TransStippleBtn){ stripePixmap(*pix, p->colorGroup().button()); } else{ QPixmapEffect::fade(*pix, (((float)opacity)+80)*0.01, color); } - if (p->inherits("QPopupMenu")) - pixDict.insert(p->winId(), pix); - else { + pixDict.insert(p->winId(), pix); + + if (!p->inherits("QPopupMenu")) { p->setBackgroundPixmap(*pix); QObjectList *ol = p-> queryList("QWidget"); for ( QObjectListIt it( *ol ); it. current ( ); ++it ) { QWidget *wid = (QWidget *) it.current ( ); wid-> setBackgroundPixmap(*pix); wid-> setBackgroundOrigin(QWidget::ParentOrigin); } delete ol; } } } else if(ev->type() == QEvent::Hide){ if(type == TransStippleBg || type == TransStippleBtn || type == Custom){ // qWarning("Deleting menu pixmap, width %d", pixDict.find(p->winId())->width()); - if (p->inherits("QPopupMenu")) - pixDict.remove(p->winId()); - else { - p->setBackgroundMode(QWidget::PaletteBackground); + pixDict.remove(p->winId()); + if (!p->inherits("QPopupMenu")) { + p->setBackgroundMode(QWidget::PaletteBackground); QObjectList *ol = p-> queryList("QWidget"); for ( QObjectListIt it( *ol ); it. current ( ); ++it ) { QWidget *wid = (QWidget *) it.current ( ); wid-> setBackgroundMode( QWidget::PaletteBackground ); } delete ol; } } } return(false); } LiquidStyle::LiquidStyle() :QWindowsStyle() { setName ( "LiquidStyle" ); btnMaskBmp = QBitmap(37, 26, buttonmask_bits, true); btnMaskBmp.setMask(btnMaskBmp); htmlBtnMaskBmp = QBitmap(37, 26, htmlbuttonmask_bits, true); htmlBtnMaskBmp.setMask(htmlBtnMaskBmp); headerHoverID = -1; highlightWidget = NULL; setButtonDefaultIndicatorWidth(0); btnDict.setAutoDelete(true); bevelFillDict.setAutoDelete(true); smallBevelFillDict.setAutoDelete(true); customBtnColorList.setAutoDelete(true); customBtnIconList.setAutoDelete(true); customBtnLabelList.setAutoDelete(true); rMatrix.rotate(270.0); highcolor = QPixmap::defaultDepth() > 8; btnBorderPix = new QPixmap; btnBorderPix->convertFromImage(qembed_findImage("buttonfill")); btnBlendPix = new QPixmap; btnBlendPix->convertFromImage(qembed_findImage("buttonborder")); bevelFillPix = new QPixmap; bevelFillPix->convertFromImage(qembed_findImage("clear_fill_large")); smallBevelFillPix = new QPixmap; smallBevelFillPix->convertFromImage(qembed_findImage("clear_fill_small")); // new stuff vsbSliderFillPix = menuPix = NULL; menuHandler = new TransMenuHandler(this); setScrollBarExtent(15, 15); int i; for(i=0; i < BITMAP_ITEMS; ++i){ pixmaps[i] = NULL; } oldSliderThickness = sliderThickness(); setSliderThickness(11); } LiquidStyle::~LiquidStyle() { if(btnBorderPix) delete btnBorderPix; if(btnBlendPix) delete btnBlendPix; if(bevelFillPix) delete bevelFillPix; if(smallBevelFillPix) delete smallBevelFillPix; if(vsbSliderFillPix) delete vsbSliderFillPix; if(menuPix) delete menuPix; setScrollBarExtent(16, 16); setSliderThickness(oldSliderThickness); int i; for(i=0; i < BITMAP_ITEMS; ++i){ if(pixmaps[i]) delete pixmaps[i]; } } void LiquidStyle::drawClearBevel(QPainter *p, int x, int y, int w, int h, const QColor &c, const QColor &bg) { QPen oldPen = p->pen(); // headers need this int x2 = x+w-1; int y2 = y+h-1; // outer dark rect p->setPen(c.dark(130)); p->drawLine(x, y+2, x, y2-2); // l p->drawLine(x2, y+2, x2, y2-2); // r p->drawLine(x+2, y, x2-2, y); // t p->drawLine(x+2, y2, x2-2, y2); // b p->drawPoint(x+1, y+1); // tl p->drawPoint(x2-1, y+1); // tr p->drawPoint(x+1, y2-1); // bl @@ -752,193 +751,194 @@ void LiquidStyle::polish(QPalette &appPal) QPixmap *pix = smallBevelFillDict.find(c.rgb()); // better be NULL ;-) if(!pix){ int h, s, v; c.hsv(&h, &s, &v); pix = new QPixmap(*smallBevelFillPix); adjustHSV(*pix, h, s, v); smallBevelFillDict.insert(c.rgb(), pix); } pagerHoverBrush.setColor(c); pagerHoverBrush.setPixmap(*pix); c = c.dark(120); pix = smallBevelFillDict.find(c.rgb()); // better be NULL ;-) if(!pix){ int h, s, v; c.hsv(&h, &s, &v); pix = new QPixmap(*smallBevelFillPix); adjustHSV(*pix, h, s, v); smallBevelFillDict.insert(c.rgb(), pix); } pagerBrush.setColor(c); pagerBrush.setPixmap(*pix); // background color stuff c = QColor ( config. readEntry ( "Background", ( Qt::lightGray ).name ( ))); c.hsv(&bH, &bS, &bV); c.light(120).hsv(&bHoverH, &bHoverS, &bHoverV); // FIXME? if(vsbSliderFillPix) delete vsbSliderFillPix; vsbSliderFillPix = new QPixmap(bevelFillPix->xForm(rMatrix)); adjustHSV(*vsbSliderFillPix, bH, bS, bV); // background brush QPixmap wallPaper(32, 32); wallPaper.fill(c.rgb()); painter.begin(&wallPaper); for(i=0; i < 32; i+=4){ painter.setPen(c.dark(100 + contrast)); painter.drawLine(0, i, 32, i); painter.setPen(c.dark(100 + 3 * contrast / 5 ) ); painter.drawLine(0, i+1, 32, i+1); }; painter.end(); bgBrush.setColor(c); bgBrush.setPixmap(wallPaper); appPal.setBrush(QColorGroup::Background, bgBrush); // lineedits c = QColor ( config. readEntry("Base", ( Qt::white). name ( ))); QPixmap basePix; basePix.resize(32, 32); basePix.fill(c.rgb()); painter.begin(&basePix); painter.setPen(c.dark(105)); for(i=0; i < 32; i+=4){ painter.drawLine(0, i, 32, i); painter.drawLine(0, i+1, 32, i+1); }; painter.end(); baseBrush.setColor(c); baseBrush.setPixmap(basePix); it.toFirst(); while ((w=it.current()) != 0 ){ ++it; if(w->inherits("QLineEdit")){ QPalette pal = w->palette(); pal.setBrush(QColorGroup::Base, baseBrush); w->setPalette(pal); } else if(w->inherits("QPushButton")){ applyCustomAttributes((QPushButton *)w); } } } void LiquidStyle::polish(QWidget *w) { if(w->inherits("QMenuBar")){ //((QFrame*)w)->setLineWidth(0); w->setBackgroundMode(QWidget::PaletteBackground); return; } if(w->inherits("QPopupMenu")) w->setBackgroundMode(QWidget::NoBackground); else if(w-> testWFlags(Qt::WType_Popup) && !w->inherits("QListBox")) { w->installEventFilter(menuHandler); } if(w->isTopLevel()){ return; } - w-> setBackgroundOrigin ( QWidget::ParentOrigin ); + if ( !w-> inherits("QFrame") || (((QFrame*) w)-> frameShape () == QFrame::NoFrame )) + w-> setBackgroundOrigin ( QWidget::ParentOrigin ); if(w->inherits("QComboBox") || w->inherits("QLineEdit") || w->inherits("QRadioButton") || w->inherits("QCheckBox") || w->inherits("QScrollBar")) { w->installEventFilter(this); } if(w->inherits("QLineEdit")){ QPalette pal = w->palette(); pal.setBrush(QColorGroup::Base, baseBrush); w->setPalette(pal); } if(w->inherits("QPushButton")){ applyCustomAttributes((QPushButton *)w); w->installEventFilter(this); } if(w->inherits("QButton") || w-> inherits("QComboBox")){ w-> setBackgroundMode ( QWidget::PaletteBackground ); } bool isViewport = qstrcmp(w->name(), "qt_viewport") == 0 || qstrcmp(w->name(), "qt_clipped_viewport") == 0; bool isViewportChild = w->parent() && ((qstrcmp(w->parent()->name(), "qt_viewport") == 0) || (qstrcmp(w->parent()->name(), "qt_clipped_viewport") == 0)); if(isViewport && w->parent() && qstrcmp(w->parent()->name(), "proxyview") == 0){ w->setBackgroundMode(QWidget::X11ParentRelative); return; } if(isViewportChild){ if(w->inherits("QButton") || w->inherits("QComboBox")){ if(w->parent()){ // heh, only way to test for KHTML children ;-) if(w->parent()->parent()){ if(w->parent()->parent()->parent() && w->parent()->parent()->parent()->inherits("KHTMLView")){ w->setAutoMask(true); w->setBackgroundMode(QWidget::NoBackground); } } } return; } } if(w->inherits("QHeader")){ w->setMouseTracking(true); w->installEventFilter(this); } if(w-> inherits("QToolButton")) { ((QToolButton*)w)->setAutoRaise (false); } if(w->ownPalette() && !w->inherits("QButton") && !w->inherits("QComboBox")){ return; } if(w->parent() && w->parent()->isWidgetType() && !((QWidget*)w->parent())-> palette().active().brush(QColorGroup::Background).pixmap()){ qWarning("No parent pixmap for child widget %s", w->className()); return; } if(!isViewport && !isViewportChild && !w->testWFlags(WType_Popup) && !( !w-> inherits("QLineEdit") && w-> parent() && w-> parent()-> isWidgetType ( ) && w-> parent()-> inherits ( "QMultiLineEdit" ))) { if(w->backgroundMode() == QWidget::PaletteBackground || w->backgroundMode() == QWidget::PaletteButton){ w->setBackgroundMode(QWidget::X11ParentRelative); } } if(w->inherits("QToolBar")){ w->installEventFilter(this); w->setBackgroundMode(QWidget::PaletteBackground); return; } } void LiquidStyle::unPolish(QWidget *w) { if(w->inherits("QMenuBar")){ ((QFrame *)w)->setLineWidth(1); w->setBackgroundMode(QWidget::PaletteBackground); return; } if(w->inherits("QPopupMenu")) w->setBackgroundMode(QWidget::PaletteButton); else if(w-> testWFlags(Qt::WType_Popup) && !w->inherits("QListBox")) { w->removeEventFilter(menuHandler); } if(w->isTopLevel()) return; // for viewport children, don't just check for NoBackground.... bool isViewportChild = w->parent() && ((qstrcmp(w->parent()->name(), "qt_viewport") == 0) || (qstrcmp(w->parent()->name(), "qt_clipped_viewport") == 0)); diff --git a/noncore/styles/liquid/plugin.cpp b/noncore/styles/liquid/plugin.cpp index f149c29..5f4c8e5 100644 --- a/noncore/styles/liquid/plugin.cpp +++ b/noncore/styles/liquid/plugin.cpp @@ -16,96 +16,98 @@ QStyle *LiquidInterface::create ( ) { return new LiquidStyle ( ); } QString LiquidInterface::name ( ) { return QObject::tr( "Liquid", "name" ); } QString LiquidInterface::description ( ) { return QObject::tr( "High Performance Liquid style by Mosfet", "description" ); } QCString LiquidInterface::key ( ) { return QCString ( "liquid" ); } unsigned int LiquidInterface::version ( ) { return 100; // 1.0.0 (\d+.\d.\d) } QRESULT LiquidInterface::queryInterface ( const QUuid &uuid, QUnknownInterface **iface ) { static LiquidSettingsInterface *setiface = 0; *iface = 0; if ( uuid == IID_QUnknown ) *iface = this; else if ( uuid == IID_Style ) *iface = this; else if ( uuid == IID_StyleSettings ) { if ( !setiface ) setiface = new LiquidSettingsInterface ( ); *iface = setiface; } if ( *iface ) (*iface)-> addRef ( ); return QS_OK; } Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( LiquidInterface ) } LiquidSettingsInterface::LiquidSettingsInterface ( ) : ref ( 0 ) { m_widget = 0; } LiquidSettingsInterface::~LiquidSettingsInterface ( ) { } QWidget *LiquidSettingsInterface::create ( QWidget *parent, const char *name ) { m_widget = new LiquidSettings ( parent, name ? name : "LIQUID-SETTINGS" ); return m_widget; } bool LiquidSettingsInterface::accept ( ) { if ( !m_widget ) return false; return m_widget-> writeConfig ( ); } void LiquidSettingsInterface::reject ( ) { } QRESULT LiquidSettingsInterface::queryInterface ( const QUuid &uuid, QUnknownInterface **iface ) { *iface = 0; if ( uuid == IID_QUnknown ) *iface = this; else if ( uuid == IID_StyleSettings ) *iface = this; if ( *iface ) (*iface)-> addRef ( ); return QS_OK; } +// Hack for Retail Z experiments +extern "C" { QStyle *allocate ( ) { return new LiquidStyle ( ); } } |