summaryrefslogtreecommitdiff
authorsandman <sandman>2002-07-08 00:42:56 (UTC)
committer sandman <sandman>2002-07-08 00:42:56 (UTC)
commit923a6290c8cc93914d54e583f1d79a6bae638fab (patch) (side-by-side diff)
treeb2562e4dbf6d71631b358021f8c4ec29f36a6d12
parent895f43bd1850b3e0c43edaaad18a7d7f2613033b (diff)
downloadopie-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)
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/styles/liquid/liquid.cpp16
-rw-r--r--noncore/styles/liquid/plugin.cpp2
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 ( ); } }