diff --git a/stdclient.cpp b/stdclient.cpp index fdda750ec..d52776de0 100644 --- a/stdclient.cpp +++ b/stdclient.cpp @@ -1,393 +1,393 @@ #include "stdclient.h" #include #include #include #include #include #include #include #include #include "workspace.h" #include "options.h" #include "stdclient_bitmaps.h" static QPixmap* close_pix = 0; static QPixmap* maximize_pix = 0; static QPixmap* minimize_pix = 0; static QPixmap* normalize_pix = 0; static QPixmap* pinup_pix = 0; static QPixmap* pindown_pix = 0; static QPixmap* menu_pix = 0; static QPixmap* dis_close_pix = 0; static QPixmap* dis_maximize_pix = 0; static QPixmap* dis_minimize_pix = 0; static QPixmap* dis_normalize_pix = 0; static QPixmap* dis_pinup_pix = 0; static QPixmap* dis_pindown_pix = 0; static QPixmap* dis_menu_pix = 0; static bool pixmaps_created = FALSE; static void create_pixmaps(); QPixmap* kwin_get_menu_pix_hack() { create_pixmaps(); return menu_pix; } /** * Pixmap creation routine that creates full pixmaps out of bitmaps * for each shade and the user defined titlebutton foreground colors. There * is a large amount of QBitmap constructors/copies here since loadFromData * with type XBM doesn't seem to work with QBitmaps, the only way I could get * a load from data is via the constructor :( Matthias, do you know about * this? */ static void create_pixmaps() { if ( pixmaps_created ) return; pixmaps_created = true; QPainter pact, pdis; QBitmap bitmap; QColor actHigh = options->color(Options::ButtonFg, true).light(150); QColor actMed = options->color(Options::ButtonFg, true); QColor actLow = options->color(Options::ButtonFg, true).dark(120); QColor disHigh = options->color(Options::ButtonFg, false).light(150); QColor disMed = options->color(Options::ButtonFg, false); QColor disLow = options->color(Options::ButtonFg, false).dark(120); close_pix = new QPixmap(16, 16); dis_close_pix = new QPixmap(16, 16); pact.begin(close_pix); pdis.begin(dis_close_pix); bitmap = QBitmap(16, 16, close_white_bits, true); bitmap.setMask(bitmap); pact.setPen(actHigh); pdis.setPen(disHigh); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); bitmap = QBitmap(16, 16, close_dgray_bits, true); pact.setPen(actLow); pdis.setPen(disLow); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); pact.end(); pdis.end(); bitmap = QBitmap(16, 16, close_mask_bits, true); close_pix->setMask(bitmap); dis_close_pix->setMask(bitmap); minimize_pix = new QPixmap(16, 16); dis_minimize_pix = new QPixmap(16, 16); pact.begin(minimize_pix); pdis.begin(dis_minimize_pix); bitmap = QBitmap(16, 16, iconify_white_bits, true); bitmap.setMask(bitmap); pact.setPen(actHigh); pdis.setPen(disHigh); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); bitmap = QBitmap(16, 16, iconify_dgray_bits, true); pact.setPen(actLow); pdis.setPen(disLow); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); pact.end(); pdis.end(); bitmap = QBitmap(16, 16, iconify_mask_bits, true); minimize_pix->setMask(bitmap); dis_minimize_pix->setMask(bitmap); maximize_pix = new QPixmap(16, 16); dis_maximize_pix = new QPixmap(16, 16); pact.begin(maximize_pix); pdis.begin(dis_maximize_pix); bitmap = QBitmap(16, 16, maximize_white_bits, true); bitmap.setMask(bitmap); pact.setPen(actHigh); pdis.setPen(disHigh); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); bitmap = QBitmap(16, 16, maximize_dgray_bits, true); pact.setPen(actLow); pdis.setPen(disLow); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); pact.end(); pdis.end(); bitmap = QBitmap(16, 16, maximize_mask_bits, true); maximize_pix->setMask(bitmap); dis_maximize_pix->setMask(bitmap); normalize_pix = new QPixmap(16, 16); dis_normalize_pix = new QPixmap(16, 16); pact.begin(normalize_pix); pdis.begin(dis_normalize_pix); bitmap = QBitmap(16, 16, maximizedown_white_bits, true); bitmap.setMask(bitmap); pact.setPen(actHigh); pdis.setPen(disHigh); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); bitmap = QBitmap(16, 16, maximizedown_dgray_bits, true); pact.setPen(actLow); pdis.setPen(disLow); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); pact.end(); pdis.end(); bitmap = QBitmap(16, 16, maximizedown_mask_bits, true); normalize_pix->setMask(bitmap); dis_normalize_pix->setMask(bitmap); menu_pix = new QPixmap(16, 16); dis_menu_pix = new QPixmap(16, 16); pact.begin(menu_pix); pdis.begin(dis_menu_pix); bitmap = QBitmap(16, 16, menu_white_bits, true); bitmap.setMask(bitmap); pact.setPen(actHigh); pdis.setPen(disHigh); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); bitmap = QBitmap(16, 16, menu_dgray_bits, true); pact.setPen(actLow); pdis.setPen(disLow); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); pact.end(); pdis.end(); bitmap = QBitmap(16, 16, menu_mask_bits, true); menu_pix->setMask(bitmap); dis_menu_pix->setMask(bitmap); pinup_pix = new QPixmap(16, 16); dis_pinup_pix = new QPixmap(16, 16); pact.begin(pinup_pix); pdis.begin(dis_pinup_pix); bitmap = QBitmap(16, 16, pinup_white_bits, true); bitmap.setMask(bitmap); pact.setPen(actHigh); pdis.setPen(disHigh); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); bitmap = QBitmap(16, 16, pinup_gray_bits, true); pact.setPen(actMed); pdis.setPen(disMed); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); bitmap = QBitmap(16, 16, pinup_dgray_bits, true); bitmap.setMask(bitmap); pact.setPen(actLow); pdis.setPen(disLow); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); pact.end(); pdis.end(); bitmap = QBitmap(16, 16, pinup_mask_bits, true); pinup_pix->setMask(bitmap); dis_pinup_pix->setMask(bitmap); pindown_pix = new QPixmap(16, 16); dis_pindown_pix = new QPixmap(16, 16); pact.begin(pindown_pix); pdis.begin(dis_pindown_pix); bitmap = QBitmap(16, 16, pindown_white_bits, true); bitmap.setMask(bitmap); pact.setPen(actHigh); pdis.setPen(disHigh); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); bitmap = QBitmap(16, 16, pindown_gray_bits, true); pact.setPen(actMed); pdis.setPen(disMed); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); bitmap = QBitmap(16, 16, pindown_dgray_bits, true); bitmap.setMask(bitmap); pact.setPen(actLow); pdis.setPen(disLow); pact.drawPixmap(0, 0, bitmap); pdis.drawPixmap(0, 0, bitmap); pact.end(); pdis.end(); bitmap = QBitmap(16, 16, pindown_mask_bits, true); pindown_pix->setMask(bitmap); dis_pindown_pix->setMask(bitmap); } StdClient::StdClient( Workspace *ws, WId w, QWidget *parent, const char *name ) : Client( ws, w, parent, name, WResizeNoErase ) { create_pixmaps(); QGridLayout* g = new QGridLayout( this, 0, 0, 2 ); g->setRowStretch( 1, 10 ); g->addWidget( windowWrapper(), 1, 1 ); g->addItem( new QSpacerItem( 0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ) ); - g->addColSpacing(0, 2); - g->addColSpacing(2, 2); + g->addColSpacing(0, 1); + g->addColSpacing(2, 1); g->addRowSpacing(2, 2); button[0] = new QToolButton( this ); button[1] = new QToolButton( this ); button[2] = new QToolButton( this ); button[3] = new QToolButton( this ); button[4] = new ThreeButtonButton( this ); button[5] = new QToolButton( this ); QHBoxLayout* hb = new QHBoxLayout; g->addLayout( hb, 0, 1 ); hb->addWidget( button[0] ); hb->addWidget( button[1] ); hb->addWidget( button[2] ); int fh = fontMetrics().lineSpacing(); titlebar = new QSpacerItem(10, fh, QSizePolicy::Expanding, QSizePolicy::Minimum ); hb->addItem( titlebar ); hb->addWidget( button[3] ); hb->addWidget( button[4] ); hb->addWidget( button[5] ); for ( int i = 0; i < 6; i++) { button[i]->setBackgroundMode( PaletteBackground ); button[i]->setMouseTracking( TRUE ); button[i]->setFixedSize( 20, 20 ); } if(miniIcon().isNull()) button[0]->setIconSet(isActive() ? *menu_pix : *dis_menu_pix); else button[0]->setIconSet( miniIcon() ); connect( button[0], SIGNAL( pressed() ), this, SLOT( menuButtonPressed() ) ); button[0]->setPopupDelay( 0 ); button[0]->setPopup( workspace()->clientPopup( this ) ); button[1]->setIconSet(isSticky() ? isActive() ? *pindown_pix : *dis_pindown_pix : isActive() ? *pinup_pix : *dis_pinup_pix ); connect( button[1], SIGNAL( clicked() ), this, ( SLOT( toggleSticky() ) ) ); button[1]->hide(); // no sticky for now button[2]->hide(); button[3]->setIconSet(isActive() ? *minimize_pix : *dis_minimize_pix); connect( button[3], SIGNAL( clicked() ), this, ( SLOT( iconify() ) ) ); button[4]->setIconSet(isActive() ? *maximize_pix : *dis_maximize_pix); connect( button[4], SIGNAL( clicked(int) ), this, ( SLOT( maxButtonClicked(int) ) ) ); button[5]->setIconSet(isActive() ? *close_pix : *dis_close_pix); connect( button[5], SIGNAL( clicked() ), this, ( SLOT( closeWindow() ) ) ); if ( isTransient() ) { // lighter decoration for transient windows button[1]->hide(); button[2]->hide(); button[3]->hide(); button[4]->hide(); } } void StdClient::activeChange(bool on) { if(miniIcon().isNull()) button[0]->setIconSet(on ? *menu_pix : *dis_menu_pix); button[1]->setIconSet(isSticky() ? on ? *pindown_pix : *dis_pindown_pix : on ? *pinup_pix : *dis_pinup_pix ); button[3]->setIconSet(on ? *minimize_pix : *dis_minimize_pix); button[4]->setIconSet(on ? *maximize_pix : *dis_maximize_pix); button[5]->setIconSet(on ? *close_pix : *dis_close_pix); Client::activeChange(on); } StdClient::~StdClient() { } void StdClient::resizeEvent( QResizeEvent* e) { Client::resizeEvent( e ); QRegion rr = rect(); QRect t = titlebar->geometry(); t.setTop( 0 ); QRegion r = rr.subtract( QRect( t.x()+1, 0, t.width()-2, 1 ) ); setMask( r ); if ( isVisibleToTLW() && !testWFlags( WNorthWestGravity )) { // manual clearing without the titlebar (we selected WResizeNoErase ) QPainter p( this ); r = rr.subtract( t ); p.setClipRegion( r ); p.fillRect( rect(), colorGroup().brush( QColorGroup::Background ) ); } } /*!\reimp */ void StdClient::captionChange( const QString& ) { repaint( titlebar->geometry(), FALSE ); } /*!\reimp */ void StdClient::maximizeChange( bool m ) { button[4]->setIconSet( m?*normalize_pix:*maximize_pix ); } /*!\reimp */ void StdClient::stickyChange( bool s) { button[1]->setIconSet( s?*pindown_pix:*pinup_pix ); } void StdClient::paintEvent( QPaintEvent* ) { QPainter p( this ); QRect t = titlebar->geometry(); QRegion r = rect(); r = r.subtract( t ); p.setClipRegion( r ); qDrawWinPanel( &p, rect(), colorGroup() ); t.setTop( 1 ); p.setClipRegion( t ); t.setTop( 0 ); p.fillRect( t, options->color(Options::TitleBar, isActive())); p.setPen( options->color(Options::TitleBar, isActive()).light() ); p.drawLine(t.left(), t.top()+1, t.right(), t.top()+1); qDrawShadePanel( &p, t.x(), t.y(), t.width(), t.height(), colorGroup(), true, 1 ); t.setLeft( t.left() + 4 ); t.setRight( t.right() - 2 ); p.setPen(options->color(Options::Font, isActive())); p.setFont(options->font(isActive())); p.drawText( t, AlignLeft|AlignVCenter, caption() ); } void StdClient::mouseDoubleClickEvent( QMouseEvent * e ) { if ( titlebar->geometry().contains( e->pos() ) ) workspace()->performWindowOperation( this, options->operationTitlebarDblClick() ); workspace()->requestFocus( this ); } void StdClient::init() { button[0]->setIconSet( miniIcon() ); // ### TODO transient etc. } void StdClient::iconChange() { if(miniIcon().isNull()) button[0]->setIconSet(isActive() ? *menu_pix : *dis_menu_pix); else button[0]->setIconSet( miniIcon() ); button[0]->repaint( FALSE ); } /*! Indicates that the menu button has been clicked */ void StdClient::menuButtonPressed() { (void ) workspace()->clientPopup( this ); //trigger the popup menu } void StdClient::maxButtonClicked( int button ) { switch ( button ){ case MidButton: maximize( MaximizeVertical ); break; case RightButton: maximize( MaximizeHorizontal ); break; default: //LeftButton: maximize( MaximizeFull ); break; } } diff --git a/systemclient.cpp b/systemclient.cpp index 989261f8c..851135acf 100644 --- a/systemclient.cpp +++ b/systemclient.cpp @@ -1,326 +1,386 @@ #include "systemclient.h" #include #include #include #include #include #include #include #include #include #include "workspace.h" #include "options.h" static unsigned char iconify_bits[] = { 0xff, 0xff, 0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18}; static unsigned char close_bits[] = { 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00 }; static unsigned char maximize_bits[] = { 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0xff, 0xff }; static unsigned char minmax_bits[] = { 0x0c, 0x18, 0x33, 0x67, 0xcf, 0x9f, 0x3f, 0x3f}; static unsigned char unsticky_bits[] = { 0x00, 0x18, 0x18, 0x7e, 0x7e, 0x18, 0x18, 0x00}; static unsigned char sticky_bits[] = { 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x00}; static QPixmap *titlePix=0; static KPixmap *aFramePix=0; static KPixmap *iFramePix=0; static KPixmap *aHandlePix=0; static KPixmap *iHandlePix=0; static bool pixmaps_created = false; static void create_pixmaps() { if(pixmaps_created) return; pixmaps_created = true; // titlebar QPainter p; QPainter maskPainter; int i, y; titlePix = new QPixmap(32, 14); QBitmap mask(32, 14); mask.fill(Qt::color0); p.begin(titlePix); maskPainter.begin(&mask); maskPainter.setPen(Qt::color1); for(i=0, y=2; i < 4; ++i, y+=3){ p.setPen(options->color(Options::TitleBar, true).light(150)); p.drawLine(0, y, 31, y); maskPainter.drawLine(0, y, 31, y); p.setPen(options->color(Options::TitleBar, true).dark(120)); p.drawLine(0, y+1, 31, y+1); maskPainter.drawLine(0, y+1, 31, y+1); } p.end(); maskPainter.end(); titlePix->setMask(mask); // Bottom frame gradient aFramePix = new KPixmap(); aFramePix->resize(32, 6); KPixmapEffect::gradient(*aFramePix, options->color(Options::Frame, true).light(150), options->color(Options::Frame, true).dark(120), KPixmapEffect::VerticalGradient); iFramePix = new KPixmap(); iFramePix->resize(32, 6); KPixmapEffect::gradient(*iFramePix, options->color(Options::Frame, false).light(150), options->color(Options::Frame, false).dark(120), KPixmapEffect::VerticalGradient); // Handle gradient aHandlePix = new KPixmap(); aHandlePix->resize(32, 6); KPixmapEffect::gradient(*aHandlePix, options->color(Options::Handle, true).light(150), options->color(Options::Handle, true).dark(120), KPixmapEffect::VerticalGradient); iHandlePix = new KPixmap(); iHandlePix->resize(32, 6); KPixmapEffect::gradient(*iHandlePix, options->color(Options::Handle, false).light(150), options->color(Options::Handle, false).dark(120), KPixmapEffect::VerticalGradient); } + SystemButton::SystemButton(QWidget *parent, const char *name, const unsigned char *bitmap) : QButton(parent, name) { QPainter p; aBackground.resize(14, 14); iBackground.resize(14, 14); QColor hColor(options->color(Options::ButtonBg, true)); QColor lColor(options->color(Options::ButtonBlend, true)); // only do this if we can dim/brighten equally if(hColor.red() < 226 && hColor.green() < 226 && hColor.blue() < 226) hColor.setRgb(hColor.red()+30, hColor.green()+30, hColor.blue()+30); if(lColor.red() > 29 && lColor.green() > 29 && lColor.blue() > 29) lColor.setRgb(lColor.red()-30, lColor.green()-30, lColor.blue()-30); KPixmapEffect::gradient(iBackground, hColor, lColor, KPixmapEffect::DiagonalGradient); hColor = options->color(Options::ButtonBlend, false); lColor = options->color(Options::ButtonBg, false); if(hColor.red() > 29 && hColor.green() > 29 && hColor.blue() > 29) hColor.setRgb(hColor.red()-30, hColor.green()-30, hColor.blue()-30); if(lColor.red() < 226 && lColor.green() < 226 && lColor.blue() < 226) lColor.setRgb(lColor.red()+30, lColor.green()+30, lColor.blue()+30); KPixmapEffect::gradient(aBackground, hColor, lColor, KPixmapEffect::DiagonalGradient); KPixmap aInternal; aInternal.resize(10, 10); KPixmap iInternal; iInternal.resize(10, 10); KPixmapEffect::gradient(iInternal, options->color(Options::ButtonBlend, true), options->color(Options::ButtonBg, true), KPixmapEffect::DiagonalGradient); KPixmapEffect::gradient(aInternal, options->color(Options::ButtonBg, false), options->color(Options::ButtonBlend, false), KPixmapEffect::DiagonalGradient); p.begin(&iBackground); p.drawPixmap(2, 2, iInternal); p.setPen(options->color(Options::ButtonBg, false)); p.drawLine(0, 13, 13, 13); p.drawLine(13, 0, 13, 13); p.setPen(options->color(Options::ButtonBlend, false)); p.drawLine(0, 0, 12, 0); p.drawLine(0, 0, 0, 12); p.end(); p.begin(&aBackground); p.drawPixmap(2, 2, aInternal); p.setPen(options->color(Options::ButtonFg, true)); p.drawRect(0, 0, 14, 14); p.end(); resize(14, 14); if(bitmap) setBitmap(bitmap); } void SystemButton::setBitmap(const unsigned char *bitmap) { deco = QBitmap(8, 8, bitmap, true); deco.setMask(deco); repaint(); } void SystemButton::drawButton(QPainter *p) { if(isDown()) p->drawPixmap(0, 0, aBackground); else p->drawPixmap(0, 0, iBackground); p->setPen(options->color(Options::ButtonFg, isDown())); p->drawPixmap(isDown() ? 4 : 3, isDown() ? 4 : 3, deco); } SystemClient::SystemClient( Workspace *ws, WId w, QWidget *parent, const char *name ) : Client( ws, w, parent, name, WResizeNoErase ) { create_pixmaps(); QGridLayout* g = new QGridLayout(this, 0, 0, 2); g->setRowStretch(1, 10); g->addWidget(windowWrapper(), 1, 1 ); g->addItem( new QSpacerItem( 0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ) ); + + g->addColSpacing(0, 2); + g->addColSpacing(2, 2); g->addRowSpacing(2, 6); button[0] = new SystemButton(this, "close", close_bits); button[1] = new SystemButton(this, "sticky"); if(isSticky()) button[1]->setBitmap(unsticky_bits); else button[1]->setBitmap(sticky_bits); button[2] = new SystemButton(this, "iconify", iconify_bits); button[3] = new SystemButton(this, "maximize", maximize_bits); connect( button[0], SIGNAL( clicked() ), this, ( SLOT( closeWindow() ) ) ); connect( button[1], SIGNAL( clicked() ), this, ( SLOT( toggleSticky() ) ) ); connect( button[2], SIGNAL( clicked() ), this, ( SLOT( iconify() ) ) ); connect( button[3], SIGNAL( clicked() ), this, ( SLOT( maximize() ) ) ); QHBoxLayout* hb = new QHBoxLayout(); g->addLayout( hb, 0, 1 ); hb->addSpacing(2); hb->addWidget( button[0] ); titlebar = new QSpacerItem(10, 16, QSizePolicy::Expanding, QSizePolicy::Minimum); hb->addItem(titlebar); - hb->addSpacing(2); + hb->addSpacing(3); hb->addWidget( button[1] ); hb->addSpacing(2); hb->addWidget( button[2] ); hb->addSpacing(2); hb->addWidget( button[3] ); - hb->addSpacing(2); + hb->addSpacing(3); for ( int i = 0; i < 4; i++) { button[i]->setMouseTracking( TRUE ); button[i]->setFixedSize( 14, 14 ); } } void SystemClient::resizeEvent( QResizeEvent* e) { Client::resizeEvent( e ); - + doShape(); if ( isVisibleToTLW() && !testWFlags( WNorthWestGravity )) { QPainter p( this ); QRect t = titlebar->geometry(); t.setTop( 0 ); QRegion r = rect(); r = r.subtract( t ); p.setClipRegion( r ); p.eraseRect( rect() ); } } void SystemClient::captionChange( const QString& ) { repaint( titlebar->geometry(), false ); } +void SystemClient::drawRoundFrame(QPainter &p, int x, int y, int w, int h) +{ + int x2=x+w-1, y2=y+h-1; + QPointArray hPntArray, lPntArray; + hPntArray.putPoints(0, 12, x+4,y+1, x+5,y+1, // top left + x+3,y+2, x+2,y+3, x+1,y+4, x+1,y+5, + x+1,y2-5, x+1,y2-4, x+2,y2-3, // half corners + x2-5,y+1, x2-4,y+1, x2-3,y+2); + + lPntArray.putPoints(0, 17, x2-5,y2-1, x2-4,y2-1, // btm right + x2-3,y2-2, x2-2,y2-3, x2-1,y2-5, x2-1,y2-4, + + x+3,y2-2, x+4,y2-1, x+5,y2-1, //half corners + x2-2,y+3, x2-1,y+4, x2-1,y+5, + + x2-5,y2-2, x2-4,y2-2, // testing + x2-3,y2-3, + x2-2,y2-5, x2-2,y2-4); + + p.setPen(options->colorGroup(Options::Frame, isActive()).light()); + p.drawLine(x+6, y, x2-6, y); + p.drawLine(0, y+6, 0, y2-6); + p.drawPoints(hPntArray); + p.setPen(options->colorGroup(Options::Frame, isActive()).dark()); + p.drawLine(x+6, y2, x2-6, y2); + p.drawLine(x+6, y2-1, x2-6, y2-1); + p.drawLine(x2, y+6, x2, y2-6); + p.drawLine(x2-1, y+6, x2-1, y2-6); + p.drawPoints(lPntArray); +} void SystemClient::paintEvent( QPaintEvent* ) { QPainter p( this ); QRect t = titlebar->geometry(); t.setTop( 1 ); - p.setPen(Qt::black); - p.drawRect(rect()); QBrush fillBrush(colorGroup().brush(QColorGroup::Background).pixmap() ? colorGroup().brush(QColorGroup::Background) : options->colorGroup(Options::Frame, isActive()). brush(QColorGroup::Button)); - qDrawShadePanel(&p, rect().x()+1, rect().y()+1, rect().width()-2, - rect().height()-2, - options->colorGroup(Options::Frame, isActive()), false, 1, - &fillBrush); - + p.fillRect(rect(), fillBrush); + drawRoundFrame(p, 0, 0, width(), height()); t.setTop( 2 ); if(isActive()) p.drawTiledPixmap(t, *titlePix); QRegion r = rect(); r = r.subtract( t ); p.setClipRegion( r ); p.setClipping( FALSE ); t.setTop( 2 ); t.setLeft( t.left() + 4 ); t.setRight( t.right() - 2 ); p.setPen(options->color(Options::Font, isActive())); p.setFont(options->font(isActive())); if(isActive()){ QFontMetrics fm(options->font(true)); p.fillRect(t.x()+((t.width()-fm.width(caption()))/2)-4, t.y(), fm.width(caption())+8, t.height(), fillBrush); } p.drawText( t, AlignCenter, caption() ); - qDrawShadePanel(&p, rect().x()+1, rect().bottom()-6, 24, 6, - options->colorGroup(Options::Handle, isActive()), false); - p.drawTiledPixmap(rect().x()+2, rect().bottom()-5, 22, 4, - isActive() ? *aHandlePix : *iHandlePix); + p.setPen(options->colorGroup(Options::Frame, isActive()).light()); + p.drawLine(width()-20, height()-7, width()-10, height()-7); + p.drawLine(width()-20, height()-5, width()-10, height()-5); + p.setPen(options->colorGroup(Options::Frame, isActive()).dark()); + p.drawLine(width()-20, height()-6, width()-10, height()-6); + p.drawLine(width()-20, height()-4, width()-10, height()-4); +} - qDrawShadePanel(&p, rect().x()+25, rect().bottom()-6, rect().width()-50, 6, - options->colorGroup(Options::Frame, isActive()), false); - p.drawTiledPixmap(rect().x()+26, rect().bottom()-5, rect().width()-52, 4, - isActive() ? *aFramePix : *iFramePix); +#define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2) + +void SystemClient::doShape() +{ + // using a bunch of QRect lines seems much more efficent than bitmaps or + // point arrays + + QRegion mask(QRect(6, 0, width()-12, height())); + mask += QRegion(QRect(5, 1, 1, height()-2)); // left + mask += QRegion(QRect(4, 1, 1, height()-2)); + mask += QRegion(QRect(3, 2, 1, height()-4)); + mask += QRegion(QRect(2, 3, 1, height()-6)); + mask += QRegion(QRect(1, 4, 1, height()-8)); + mask += QRegion(QRect(0, 6, 1, height()-12)); + int x2 = width()-1; + mask += QRegion(QRect(x2-5, 1, 1, height()-2)); // right + mask += QRegion(QRect(x2-4, 1, 1, height()-2)); + mask += QRegion(QRect(x2-3, 2, 1, height()-4)); + mask += QRegion(QRect(x2-2, 3, 1, height()-6)); + mask += QRegion(QRect(x2-1, 4, 1, height()-8)); + mask += QRegion(QRect(x2, 6, 1, height()-12)); + + setMask(mask); + - qDrawShadePanel(&p, rect().right()-24, rect().bottom()-6, 24, 6, - options->colorGroup(Options::Handle, isActive()), false); - p.drawTiledPixmap(rect().right()-23, rect().bottom()-5, 22, 4, - isActive() ? *aHandlePix : *iHandlePix); } +void SystemClient::showEvent(QShowEvent *ev) +{ + Client::showEvent(ev); + doShape(); + repaint(); +} + +void SystemClient::windowWrapperShowEvent( QShowEvent* ) +{ + doShape(); +} + void SystemClient::mouseDoubleClickEvent( QMouseEvent * e ) { if (titlebar->geometry().contains( e->pos() ) ) setShade( !isShade() ); workspace()->requestFocus( this ); } void SystemClient::stickyChange(bool on) { button[1]->setBitmap(on ? unsticky_bits : sticky_bits); } void SystemClient::maximizeChange(bool m) { button[3]->setBitmap(m ? minmax_bits : maximize_bits); } void SystemClient::init() { // } diff --git a/systemclient.h b/systemclient.h index cd25e7f53..ff20a0455 100644 --- a/systemclient.h +++ b/systemclient.h @@ -1,49 +1,52 @@ #ifndef __SYSTEMCLIENT_H #define __SYSTEMCLIENT_H #include #include #include #include "client.h" class QLabel; class QSpacerItem; // get rid of autohide :P class SystemButton : public QButton { public: SystemButton(QWidget *parent=0, const char *name=0, const unsigned char *bitmap=NULL); void setBitmap(const unsigned char *bitmap); protected: virtual void drawButton(QPainter *p); void drawButtonLabel(QPainter *){;} KPixmap aBackground, iBackground; QBitmap deco; }; class SystemClient : public Client { Q_OBJECT public: SystemClient( Workspace *ws, WId w, QWidget *parent=0, const char *name=0 ); ~SystemClient(){;} protected: + void drawRoundFrame(QPainter &p, int x, int y, int w, int h); void resizeEvent( QResizeEvent* ); void paintEvent( QPaintEvent* ); - + void showEvent( QShowEvent* ); + void windowWrapperShowEvent( QShowEvent* ); void mouseDoubleClickEvent( QMouseEvent * ); void init(); void captionChange( const QString& name ); void stickyChange(bool on); void maximizeChange(bool m); + void doShape(); private: SystemButton* button[4]; QSpacerItem* titlebar; }; #endif