00001 #include <kconfig.h>
00002 #include "kwmthemeclient.h"
00003 #include <kglobal.h>
00004 #include <qlayout.h>
00005 #include <qdrawutil.h>
00006 #include <qpainter.h>
00007 #include <kpixmapeffect.h>
00008 #include <kstandarddirs.h>
00009 #include <kdebug.h>
00010 #include <klocale.h>
00011 #include <qbitmap.h>
00012 #include <qstyle.h>
00013 #include <qlabel.h>
00014 #include <qtooltip.h>
00015
00016 namespace KWMTheme {
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 inline const KDecorationOptions* options() { return KDecoration::options(); }
00061
00062 enum FramePixmap{FrameTop=0, FrameBottom, FrameLeft, FrameRight, FrameTopLeft,
00063 FrameTopRight, FrameBottomLeft, FrameBottomRight};
00064
00065 static QPixmap *framePixmaps[8];
00066 static QPixmap *menuPix, *iconifyPix, *closePix, *maxPix, *minmaxPix,
00067 *pinupPix, *pindownPix;
00068 static KPixmap *aTitlePix = 0;
00069 static KPixmap *iTitlePix = 0;
00070 static KPixmapEffect::GradientType grType;
00071 static int maxExtent, titleAlign;
00072 static bool titleGradient = true;
00073 static bool pixmaps_created = false;
00074 static bool titleSunken = false;
00075 static bool titleTransparent;
00076
00077 static void create_pixmaps()
00078 {
00079 const char *keys[] = {"wm_top", "wm_bottom", "wm_left", "wm_right",
00080 "wm_topleft", "wm_topright", "wm_bottomleft", "wm_bottomright"};
00081
00082 if(pixmaps_created)
00083 return;
00084 pixmaps_created = true;
00085
00086 KConfig *config = KGlobal::config();
00087 config->setGroup("General");
00088 QString tmpStr;
00089
00090 for(int i=0; i < 8; ++i)
00091 {
00092 framePixmaps[i] = new QPixmap(locate("data",
00093 "kwin/pics/"+config->readEntry(keys[i], " ")));
00094 if(framePixmaps[i]->isNull())
00095 kdWarning() << "Unable to load frame pixmap for " << keys[i] << endl;
00096 }
00097
00098
00099
00100
00101
00102
00103 maxExtent = framePixmaps[FrameTop]->height();
00104 if(framePixmaps[FrameBottom]->height() > maxExtent)
00105 maxExtent = framePixmaps[FrameBottom]->height();
00106 if(framePixmaps[FrameLeft]->width() > maxExtent)
00107 maxExtent = framePixmaps[FrameLeft]->width();
00108 if(framePixmaps[FrameRight]->width() > maxExtent)
00109 maxExtent = framePixmaps[FrameRight]->width();
00110
00111 maxExtent++;
00112
00113 menuPix = new QPixmap(locate("data",
00114 "kwin/pics/"+config->readEntry("menu", " ")));
00115 iconifyPix = new QPixmap(locate("data",
00116 "kwin/pics/"+config->readEntry("iconify", " ")));
00117 maxPix = new QPixmap(locate("appdata",
00118 "pics/"+config->readEntry("maximize", " ")));
00119 minmaxPix = new QPixmap(locate("data",
00120 "kwin/pics/"+config->readEntry("maximizedown", " ")));
00121 closePix = new QPixmap(locate("data",
00122 "kwin/pics/"+config->readEntry("close", " ")));
00123 pinupPix = new QPixmap(locate("data",
00124 "kwin/pics/"+config->readEntry("pinup", " ")));
00125 pindownPix = new QPixmap(locate("data",
00126 "kwin/pics/"+config->readEntry("pindown", " ")));
00127 if(menuPix->isNull())
00128 menuPix->load(locate("data", "kwin/pics/menu.png"));
00129 if(iconifyPix->isNull())
00130 iconifyPix->load(locate("data", "kwin/pics/iconify.png"));
00131 if(maxPix->isNull())
00132 maxPix->load(locate("data", "kwin/pics/maximize.png"));
00133 if(minmaxPix->isNull())
00134 minmaxPix->load(locate("data", "kwin/pics/maximizedown.png"));
00135 if(closePix->isNull())
00136 closePix->load(locate("data", "kwin/pics/close.png"));
00137 if(pinupPix->isNull())
00138 pinupPix->load(locate("data", "kwin/pics/pinup.png"));
00139 if(pindownPix->isNull())
00140 pindownPix->load(locate("data", "kwin/pics/pindown.png"));
00141
00142 tmpStr = config->readEntry("TitleAlignment");
00143 if(tmpStr == "right")
00144 titleAlign = Qt::AlignRight | Qt::AlignVCenter;
00145 else if(tmpStr == "middle")
00146 titleAlign = Qt::AlignCenter;
00147 else
00148 titleAlign = Qt::AlignLeft | Qt::AlignVCenter;
00149 titleSunken = config->readBoolEntry("TitleFrameShaded", true);
00150
00151 titleTransparent = config->readBoolEntry("PixmapUnderTitleText", true);
00152
00153 tmpStr = config->readEntry("TitlebarLook");
00154 if(tmpStr == "shadedVertical"){
00155 aTitlePix = new KPixmap;
00156 aTitlePix->resize(32, 20);
00157 KPixmapEffect::gradient(*aTitlePix,
00158 options()->color(KDecorationOptions::ColorTitleBar, true),
00159 options()->color(KDecorationOptions::ColorTitleBlend, true),
00160 KPixmapEffect::VerticalGradient);
00161 iTitlePix = new KPixmap;
00162 iTitlePix->resize(32, 20);
00163 KPixmapEffect::gradient(*iTitlePix,
00164 options()->color(KDecorationOptions::ColorTitleBar, false),
00165 options()->color(KDecorationOptions::ColorTitleBlend, false),
00166 KPixmapEffect::VerticalGradient);
00167 titleGradient = false;
00168
00169 }
00170 else if(tmpStr == "shadedHorizontal")
00171 grType = KPixmapEffect::HorizontalGradient;
00172 else if(tmpStr == "shadedDiagonal")
00173 grType = KPixmapEffect::DiagonalGradient;
00174 else if(tmpStr == "shadedCrossDiagonal")
00175 grType = KPixmapEffect::CrossDiagonalGradient;
00176 else if(tmpStr == "shadedPyramid")
00177 grType = KPixmapEffect::PyramidGradient;
00178 else if(tmpStr == "shadedRectangle")
00179 grType = KPixmapEffect::RectangleGradient;
00180 else if(tmpStr == "shadedPipeCross")
00181 grType = KPixmapEffect::PipeCrossGradient;
00182 else if(tmpStr == "shadedElliptic")
00183 grType = KPixmapEffect::EllipticGradient;
00184 else{
00185 titleGradient = false;
00186 tmpStr = config->readEntry("TitlebarPixmapActive", "");
00187 if(!tmpStr.isEmpty()){
00188 aTitlePix = new KPixmap;
00189 aTitlePix->load(locate("data", "kwin/pics/" + tmpStr));
00190 }
00191 else
00192 aTitlePix = NULL;
00193 tmpStr = config->readEntry("TitlebarPixmapInactive", "");
00194 if(!tmpStr.isEmpty()){
00195 iTitlePix = new KPixmap;
00196 iTitlePix->load(locate("data", "kwin/pics/" + tmpStr));
00197 }
00198 else
00199 iTitlePix = NULL;
00200 }
00201 }
00202
00203 static void delete_pixmaps()
00204 {
00205 for(int i=0; i < 8; ++i)
00206 delete framePixmaps[i];
00207
00208 delete menuPix;
00209 delete iconifyPix;
00210 delete closePix;
00211 delete maxPix;
00212 delete minmaxPix;
00213 delete pinupPix;
00214 delete pindownPix;
00215 delete aTitlePix;
00216 aTitlePix = 0;
00217 delete iTitlePix;
00218 iTitlePix = 0;
00219
00220 titleGradient = true;
00221 pixmaps_created = false;
00222 titleSunken = false;
00223 }
00224
00225 void MyButton::drawButtonLabel(QPainter *p)
00226 {
00227 if(pixmap()){
00228
00229
00230
00231 int offset = (isDown() && ((pixmap()->width() >= width()) ||
00232 (pixmap()->height() >= height()))) ? 1 : 0;
00233 style().drawItem(p, QRect( offset, offset, width(), height() ),
00234 AlignCenter, colorGroup(),
00235 true, pixmap(), QString::null);
00236 }
00237 }
00238
00239 KWMThemeClient::KWMThemeClient( KDecorationBridge* b, KDecorationFactory* f )
00240 : KDecoration( b, f )
00241 {
00242 }
00243
00244 void KWMThemeClient::init()
00245 {
00246 createMainWidget( WResizeNoErase | WStaticContents );
00247 widget()->installEventFilter( this );
00248
00249 stickyBtn = maxBtn = mnuBtn = 0;
00250 layout = new QGridLayout(widget());
00251 layout->addColSpacing(0, maxExtent);
00252 layout->addColSpacing(2, maxExtent);
00253
00254 layout->addRowSpacing(0, maxExtent);
00255
00256 layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Fixed,
00257 QSizePolicy::Expanding));
00258
00259 if( isPreview())
00260 layout->addWidget( new QLabel( i18n( "<center><b>KWMTheme</b></center>" ), widget()), 2, 1);
00261 else
00262 layout->addItem( new QSpacerItem( 0, 0 ), 2, 1);
00263
00264
00265 layout->addItem( new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding) );
00266 layout->addRowSpacing(3, maxExtent);
00267 layout->setRowStretch(2, 10);
00268 layout->setColStretch(1, 10);
00269
00270 QBoxLayout* hb = new QBoxLayout(0, QBoxLayout::LeftToRight, 0, 0, 0);
00271 layout->addLayout( hb, 1, 1 );
00272
00273 KConfig *config = KGlobal::config();
00274 config->setGroup("Buttons");
00275 QString val;
00276 MyButton *btn;
00277 int i;
00278 static const char *defaultButtons[]={"Menu","Sticky","Off","Iconify",
00279 "Maximize","Close"};
00280 static const char keyOffsets[]={"ABCDEF"};
00281 for(i=0; i < 6; ++i){
00282 if(i == 3){
00283 titlebar = new QSpacerItem(10, 20, QSizePolicy::Expanding,
00284 QSizePolicy::Minimum );
00285 hb->addItem( titlebar );
00286 }
00287 QString key("Button");
00288 key += QChar(keyOffsets[i]);
00289 val = config->readEntry(key, defaultButtons[i]);
00290 if(val == "Menu"){
00291 mnuBtn = new MyButton(widget(), "menu");
00292 QToolTip::add( mnuBtn, i18n("Menu"));
00293 iconChange();
00294 hb->addWidget(mnuBtn);
00295 mnuBtn->setFixedSize(20, 20);
00296 connect(mnuBtn, SIGNAL(pressed()), this,
00297 SLOT(menuButtonPressed()));
00298 }
00299 else if(val == "Sticky"){
00300 stickyBtn = new MyButton(widget(), "sticky");
00301 QToolTip::add( stickyBtn, i18n("Sticky"));
00302 if (isOnAllDesktops())
00303 stickyBtn->setPixmap(*pindownPix);
00304 else
00305 stickyBtn->setPixmap(*pinupPix);
00306 connect(stickyBtn, SIGNAL( clicked() ), this, SLOT(toggleOnAllDesktops()));
00307 hb->addWidget(stickyBtn);
00308 stickyBtn->setFixedSize(20, 20);
00309 }
00310 else if((val == "Iconify") && isMinimizable()){
00311 btn = new MyButton(widget(), "iconify");
00312 QToolTip::add( btn, i18n("Minimize"));
00313 btn->setPixmap(*iconifyPix);
00314 connect(btn, SIGNAL(clicked()), this, SLOT(minimize()));
00315 hb->addWidget(btn);
00316 btn->setFixedSize(20, 20);
00317 }
00318 else if((val == "Maximize") && isMaximizable()){
00319 maxBtn = new MyButton(widget(), "max");
00320 QToolTip::add( maxBtn, i18n("Maximize"));
00321 maxBtn->setPixmap(*maxPix);
00322 connect(maxBtn, SIGNAL(clicked()), this, SLOT(maximize()));
00323 hb->addWidget(maxBtn);
00324 maxBtn->setFixedSize(20, 20);
00325 }
00326 else if((val == "Close") && isCloseable()){
00327 btn = new MyButton(widget(), "close");
00328 QToolTip::add( btn, i18n("Close"));
00329 btn->setPixmap(*closePix);
00330 connect(btn, SIGNAL(clicked()), this, SLOT(closeWindow()));
00331 hb->addWidget(btn);
00332 btn->setFixedSize(20, 20);
00333 }
00334 else{
00335 if((val != "Off") &&
00336 ((val == "Iconify") && !isMinimizable()) &&
00337 ((val == "Maximize") && !isMaximizable()))
00338 kdWarning() << "KWin: Unrecognized button value: " << val << endl;
00339
00340 }
00341 }
00342 if(titleGradient){
00343 aGradient = new KPixmap;
00344 iGradient = new KPixmap;
00345 }
00346 else{
00347 aGradient = 0;
00348 iGradient = 0;
00349 }
00350 widget()->setBackgroundMode(NoBackground);
00351 }
00352
00353 void KWMThemeClient::drawTitle(QPainter &dest)
00354 {
00355 QRect titleRect = titlebar->geometry();
00356 QRect r(0, 0, titleRect.width(), titleRect.height());
00357 QPixmap buffer;
00358
00359 if(buffer.width() == r.width())
00360 return;
00361
00362 buffer.resize(r.size());
00363 QPainter p;
00364 p.begin(&buffer);
00365
00366 if(titleSunken){
00367 qDrawShadeRect(&p, r, options()->colorGroup(KDecorationOptions::ColorFrame, isActive()),
00368 true, 1, 0);
00369 r.setRect(r.x()+1, r.y()+1, r.width()-2, r.height()-2);
00370 }
00371
00372 KPixmap *fill = isActive() ? aTitlePix : iTitlePix;
00373 if(fill)
00374 p.drawTiledPixmap(r, *fill);
00375 else if(titleGradient){
00376 fill = isActive() ? aGradient : iGradient;
00377 if(fill->width() != r.width()){
00378 fill->resize(r.width(), 20);
00379 KPixmapEffect::gradient(*fill,
00380 options()->color(KDecorationOptions::ColorTitleBar, isActive()),
00381 options()->color(KDecorationOptions::ColorTitleBlend, isActive()),
00382 grType);
00383 }
00384 p.drawTiledPixmap(r, *fill);
00385 }
00386 else{
00387 p.fillRect(r, options()->colorGroup(KDecorationOptions::ColorTitleBar, isActive()).
00388 brush(QColorGroup::Button));
00389 }
00390 p.setFont(options()->font(isActive()));
00391 p.setPen(options()->color(KDecorationOptions::ColorFont, isActive()));
00392
00393 r.setLeft(r.left()+5);
00394 r.setRight(r.right()-5);
00395 p.drawText(r, titleAlign, caption());
00396 p.end();
00397
00398 dest.drawPixmap(titleRect.x(), titleRect.y(), buffer);
00399 }
00400
00401
00402 void KWMThemeClient::resizeEvent( QResizeEvent* )
00403 {
00404 doShape();
00405 widget()->repaint();
00406 }
00407
00408 void KWMThemeClient::captionChange()
00409 {
00410 widget()->repaint( titlebar->geometry(), false );
00411 }
00412
00413 void KWMThemeClient::paintEvent( QPaintEvent *)
00414 {
00415 QPainter p;
00416 p.begin(widget());
00417 int x,y;
00418
00419 int w1 = framePixmaps[FrameTopLeft]->width();
00420 int h1 = framePixmaps[FrameTopLeft]->height();
00421 if (w1 > width()/2) w1 = width()/2;
00422 if (h1 > height()/2) h1 = height()/2;
00423 p.drawPixmap(0,0,*framePixmaps[FrameTopLeft],
00424 0,0,w1, h1);
00425 int w2 = framePixmaps[FrameTopRight]->width();
00426 int h2 = framePixmaps[FrameTopRight]->height();
00427 if (w2 > width()/2) w2 = width()/2;
00428 if (h2 > height()/2) h2 = height()/2;
00429 p.drawPixmap(width()-w2,0,*framePixmaps[FrameTopRight],
00430 framePixmaps[FrameTopRight]->width()-w2,0,w2, h2);
00431
00432 int w3 = framePixmaps[FrameBottomLeft]->width();
00433 int h3 = framePixmaps[FrameBottomLeft]->height();
00434 if (w3 > width()/2) w3 = width()/2;
00435 if (h3 > height()/2) h3 = height()/2;
00436 p.drawPixmap(0,height()-h3,*framePixmaps[FrameBottomLeft],
00437 0,framePixmaps[FrameBottomLeft]->height()-h3,w3, h3);
00438
00439 int w4 = framePixmaps[FrameBottomRight]->width();
00440 int h4 = framePixmaps[FrameBottomRight]->height();
00441 if (w4 > width()/2) w4 = width()/2;
00442 if (h4 > height()/2) h4 = height()/2;
00443 p.drawPixmap(width()-w4,height()-h4,*(framePixmaps[FrameBottomRight]),
00444 framePixmaps[FrameBottomRight]->width()-w4,
00445 framePixmaps[FrameBottomRight]->height()-h4,
00446 w4, h4);
00447
00448 QPixmap pm;
00449 QWMatrix m;
00450 int n,s,w;
00451
00452 pm = *framePixmaps[FrameTop];
00453
00454 if (pm.width() > 0){
00455 s = width()-w2-w1;
00456 n = s/pm.width();
00457 w = n>0?s/n:s;
00458 m.reset();
00459 m.scale(w/(float)pm.width(), 1);
00460 pm = pm.xForm(m);
00461
00462 x = w1;
00463 while (1){
00464 if (pm.width() < width()-w2-x){
00465 p.drawPixmap(x,maxExtent-pm.height()-1,
00466 pm);
00467 x += pm.width();
00468 }
00469 else {
00470 p.drawPixmap(x,maxExtent-pm.height()-1,
00471 pm,
00472 0,0,width()-w2-x,pm.height());
00473 break;
00474 }
00475 }
00476 }
00477
00478
00479 pm = *framePixmaps[FrameBottom];
00480
00481 if (pm.width() > 0){
00482 s = width()-w4-w3;
00483 n = s/pm.width();
00484 w = n>0?s/n:s;
00485 m.reset();
00486 m.scale(w/(float)pm.width(), 1);
00487 pm = pm.xForm(m);
00488
00489 x = w3;
00490 while (1){
00491 if (pm.width() < width()-w4-x){
00492 p.drawPixmap(x,height()-maxExtent+1,pm);
00493 x += pm.width();
00494 }
00495 else {
00496 p.drawPixmap(x,height()-maxExtent+1,pm,
00497 0,0,width()-w4-x,pm.height());
00498 break;
00499 }
00500 }
00501 }
00502
00503
00504 pm = *framePixmaps[FrameLeft];
00505
00506 if (pm.height() > 0){
00507 s = height()-h3-h1;
00508 n = s/pm.height();
00509 w = n>0?s/n:s;
00510 m.reset();
00511 m.scale(1, w/(float)pm.height());
00512 pm = pm.xForm(m);
00513
00514 y = h1;
00515 while (1){
00516 if (pm.height() < height()-h3-y){
00517 p.drawPixmap(maxExtent-pm.width()-1, y,
00518 pm);
00519 y += pm.height();
00520 }
00521 else {
00522 p.drawPixmap(maxExtent-pm.width()-1, y,
00523 pm,
00524 0,0, pm.width(),
00525 height()-h3-y);
00526 break;
00527 }
00528 }
00529 }
00530
00531
00532 pm = *framePixmaps[FrameRight];
00533
00534 if (pm.height() > 0){
00535 s = height()-h4-h2;
00536 n = s/pm.height();
00537 w = n>0?s/n:s;
00538 m.reset();
00539 m.scale(1, w/(float)pm.height());
00540 pm = pm.xForm(m);
00541
00542 y = h2;
00543 while (1){
00544 if (pm.height() < height()-h4-y){
00545 p.drawPixmap(width()-maxExtent+1, y,
00546 pm);
00547 y += pm.height();
00548 }
00549 else {
00550 p.drawPixmap(width()-maxExtent+1, y,
00551 pm,
00552 0,0, pm.width(),
00553 height()-h4-y);
00554 break;
00555 }
00556 }
00557 }
00558 drawTitle(p);
00559
00560 QColor c = widget()->colorGroup().background();
00561
00562
00563
00564
00565 p.setPen(c);
00566 p.drawRect(maxExtent-1, maxExtent-1, width()-(maxExtent-1)*2,
00567 height()-(maxExtent-1)*2);
00568
00569
00570
00571 QRect r(layout->cellGeometry(2, 1));
00572 p.fillRect( r.x(), r.y(), r.width(), r.height(), c);
00573 p.end();
00574 }
00575
00576 void KWMThemeClient::doShape()
00577 {
00578
00579 QBitmap shapemask(width(), height());
00580 shapemask.fill(color0);
00581 QPainter p;
00582 p.begin(&shapemask);
00583 p.setBrush(color1);
00584 p.setPen(color1);
00585 int x,y;
00586
00587 int w1 = framePixmaps[FrameTopLeft]->width();
00588 int h1 = framePixmaps[FrameTopLeft]->height();
00589 if (w1 > width()/2) w1 = width()/2;
00590 if (h1 > height()/2) h1 = height()/2;
00591 if (framePixmaps[FrameTopLeft]->mask())
00592 p.drawPixmap(0,0,*framePixmaps[FrameTopLeft]->mask(),
00593 0,0,w1, h1);
00594 else
00595 p.fillRect(0,0,w1,h1,color1);
00596 int w2 = framePixmaps[FrameTopRight]->width();
00597 int h2 = framePixmaps[FrameTopRight]->height();
00598 if (w2 > width()/2) w2 = width()/2;
00599 if (h2 > height()/2) h2 = height()/2;
00600 if (framePixmaps[FrameTopRight]->mask())
00601 p.drawPixmap(width()-w2,0,*framePixmaps[FrameTopRight]->mask(),
00602 framePixmaps[FrameTopRight]->width()-w2,0,w2, h2);
00603 else
00604 p.fillRect(width()-w2,0,w2, h2,color1);
00605
00606 int w3 = framePixmaps[FrameBottomLeft]->width();
00607 int h3 = framePixmaps[FrameBottomLeft]->height();
00608 if (w3 > width()/2) w3 = width()/2;
00609 if (h3 > height()/2) h3 = height()/2;
00610 if (framePixmaps[FrameBottomLeft]->mask())
00611 p.drawPixmap(0,height()-h3,*framePixmaps[FrameBottomLeft]->mask(),
00612 0,framePixmaps[FrameBottomLeft]->height()-h3,w3, h3);
00613 else
00614 p.fillRect(0,height()-h3,w3,h3,color1);
00615
00616 int w4 = framePixmaps[FrameBottomRight]->width();
00617 int h4 = framePixmaps[FrameBottomRight]->height();
00618 if (w4 > width()/2) w4 = width()/2;
00619 if (h4 > height()/2) h4 = height()/2;
00620 if (framePixmaps[FrameBottomRight]->mask())
00621 p.drawPixmap(width()-w4,height()-h4,*framePixmaps[FrameBottomRight]->mask(),
00622 framePixmaps[FrameBottomRight]->width()-w4,
00623 framePixmaps[FrameBottomRight]->height()-h4,
00624 w4, h4);
00625 else
00626 p.fillRect(width()-w4,height()-h4,w4,h4,color1);
00627
00628 QPixmap pm;
00629 QWMatrix m;
00630 int n,s,w;
00631
00632 if (framePixmaps[FrameTop]->mask())
00633 {
00634 pm = *framePixmaps[FrameTop]->mask();
00635
00636 s = width()-w2-w1;
00637 n = s/pm.width();
00638 w = n>0?s/n:s;
00639 m.reset();
00640 m.scale(w/(float)pm.width(), 1);
00641 pm = pm.xForm(m);
00642
00643 x = w1;
00644 while (1){
00645 if (pm.width() < width()-w2-x){
00646 p.drawPixmap(x,maxExtent-pm.height()-1,
00647 pm);
00648 x += pm.width();
00649 }
00650 else {
00651 p.drawPixmap(x,maxExtent-pm.height()-1,
00652 pm,
00653 0,0,width()-w2-x,pm.height());
00654 break;
00655 }
00656 }
00657 }
00658
00659
00660 if (framePixmaps[FrameBottom]->mask())
00661 {
00662 pm = *framePixmaps[FrameBottom]->mask();
00663
00664 s = width()-w4-w3;
00665 n = s/pm.width();
00666 w = n>0?s/n:s;
00667 m.reset();
00668 m.scale(w/(float)pm.width(), 1);
00669 pm = pm.xForm(m);
00670
00671 x = w3;
00672 while (1){
00673 if (pm.width() < width()-w4-x){
00674 p.drawPixmap(x,height()-maxExtent+1,pm);
00675 x += pm.width();
00676 }
00677 else {
00678 p.drawPixmap(x,height()-maxExtent+1,pm,
00679 0,0,width()-w4-x,pm.height());
00680 break;
00681 }
00682 }
00683 }
00684
00685
00686 if (framePixmaps[FrameLeft]->mask())
00687 {
00688 pm = *framePixmaps[FrameLeft]->mask();
00689
00690 s = height()-h3-h1;
00691 n = s/pm.height();
00692 w = n>0?s/n:s;
00693 m.reset();
00694 m.scale(1, w/(float)pm.height());
00695 pm = pm.xForm(m);
00696
00697 y = h1;
00698 while (1){
00699 if (pm.height() < height()-h3-y){
00700 p.drawPixmap(maxExtent-pm.width()-1, y,
00701 pm);
00702 y += pm.height();
00703 }
00704 else {
00705 p.drawPixmap(maxExtent-pm.width()-1, y,
00706 pm,
00707 0,0, pm.width(),
00708 height()-h3-y);
00709 break;
00710 }
00711 }
00712 }
00713
00714
00715 if (framePixmaps[FrameRight]->mask())
00716 {
00717 pm = *framePixmaps[FrameRight]->mask();
00718
00719 s = height()-h4-h2;
00720 n = s/pm.height();
00721 w = n>0?s/n:s;
00722 m.reset();
00723 m.scale(1, w/(float)pm.height());
00724 pm = pm.xForm(m);
00725
00726 y = h2;
00727 while (1){
00728 if (pm.height() < height()-h4-y){
00729 p.drawPixmap(width()-maxExtent+1, y,
00730 pm);
00731 y += pm.height();
00732 }
00733 else {
00734 p.drawPixmap(width()-maxExtent+1, y,
00735 pm,
00736 0,0, pm.width(),
00737 height()-h4-y);
00738 break;
00739 }
00740 }
00741 }
00742 p.fillRect(maxExtent-1, maxExtent-1, width()-2*maxExtent+2, height()-2*maxExtent+2, color1);
00743 setMask(shapemask);
00744 }
00745
00746
00747 void KWMThemeClient::showEvent(QShowEvent *)
00748 {
00749 doShape();
00750 widget()->repaint(false);
00751 }
00752
00753 void KWMThemeClient::mouseDoubleClickEvent( QMouseEvent * e )
00754 {
00755 if (titlebar->geometry().contains( e->pos() ) )
00756 titlebarDblClickOperation();
00757 }
00758
00759 void KWMThemeClient::desktopChange()
00760 {
00761 if (stickyBtn) {
00762 bool on = isOnAllDesktops();
00763 stickyBtn->setPixmap(on ? *pindownPix : *pinupPix);
00764 QToolTip::remove( stickyBtn );
00765 QToolTip::add( stickyBtn, on ? i18n("Unsticky") : i18n("Sticky") );
00766 }
00767 }
00768
00769 void KWMThemeClient::maximizeChange()
00770 {
00771 if (maxBtn) {
00772 bool m = maximizeMode() == MaximizeFull;
00773 maxBtn->setPixmap(m ? *minmaxPix : *maxPix);
00774 QToolTip::remove( maxBtn );
00775 QToolTip::add( maxBtn, m ? i18n("Restore") : i18n("Maximize"));
00776 }
00777 }
00778
00779 void KWMThemeClient::slotMaximize()
00780 {
00781 maximize( maximizeMode() == MaximizeFull ? MaximizeRestore : MaximizeFull );
00782 }
00783
00784 void KWMThemeClient::activeChange()
00785 {
00786 widget()->update();
00787 }
00788
00789 KDecoration::Position KWMThemeClient::mousePosition(const QPoint &p) const
00790 {
00791 Position m = KDecoration::mousePosition(p);
00792
00793 if(p.y() < framePixmaps[FrameTop]->height() &&
00794 p.x() < framePixmaps[FrameLeft]->width()){
00795 m = PositionTopLeft;
00796 }
00797 else if(p.y() < framePixmaps[FrameTop]->height() &&
00798 p.x() > width()-framePixmaps[FrameRight]->width()){
00799 m = PositionTopRight;
00800 }
00801 else if(p.y() > height()-framePixmaps[FrameBottom]->height() &&
00802 p.x() < framePixmaps[FrameLeft]->width()){
00803 m = PositionBottomLeft;
00804 }
00805 else if(p.y() > height()-framePixmaps[FrameBottom]->height() &&
00806 p.x() > width()-framePixmaps[FrameRight]->width()){
00807 m = PositionBottomRight;
00808 }
00809 else if(p.y() < framePixmaps[FrameTop]->height())
00810 m = PositionTop;
00811 else if(p.y() > height()-framePixmaps[FrameBottom]->height())
00812 m = PositionBottom;
00813 else if(p.x() < framePixmaps[FrameLeft]->width())
00814 m = PositionLeft;
00815 else if(p.x() > width()-framePixmaps[FrameRight]->width())
00816 m = PositionRight;
00817 return(m);
00818 }
00819
00820 void KWMThemeClient::menuButtonPressed()
00821 {
00822 mnuBtn->setDown(false);
00823 QPoint pos = mnuBtn->mapToGlobal(mnuBtn->rect().bottomLeft());
00824 showWindowMenu( pos );
00825 }
00826
00827 void KWMThemeClient::iconChange()
00828 {
00829 if(mnuBtn){
00830 if( icon().pixmap( QIconSet::Small, QIconSet::Normal ).isNull()){
00831 mnuBtn->setPixmap(*menuPix);
00832 }
00833 else{
00834 mnuBtn->setPixmap(icon().pixmap( QIconSet::Small, QIconSet::Normal ));
00835 }
00836 }
00837 }
00838
00839 bool KWMThemeClient::eventFilter( QObject* o, QEvent* e )
00840 {
00841 if ( o != widget() )
00842 return false;
00843
00844 switch ( e->type() )
00845 {
00846 case QEvent::Resize:
00847 resizeEvent( static_cast< QResizeEvent* >( e ) );
00848 return true;
00849
00850 case QEvent::Paint:
00851 paintEvent( static_cast< QPaintEvent* >( e ) );
00852 return true;
00853
00854 case QEvent::MouseButtonDblClick:
00855 mouseDoubleClickEvent( static_cast< QMouseEvent* >( e ) );
00856 return true;
00857
00858 case QEvent::MouseButtonPress:
00859 processMousePressEvent( static_cast< QMouseEvent* >( e ) );
00860 return true;
00861
00862 case QEvent::Show:
00863 showEvent( static_cast< QShowEvent* >( e ) );
00864 return true;
00865
00866 default:
00867 return false;
00868 }
00869 }
00870
00871 QSize KWMThemeClient::minimumSize() const
00872 {
00873 return widget()->minimumSize().expandedTo( QSize( 100, 50 ));
00874 }
00875
00876 void KWMThemeClient::resize( const QSize& s )
00877 {
00878 widget()->resize( s );
00879 }
00880
00881 void KWMThemeClient::borders( int& left, int& right, int& top, int& bottom ) const
00882 {
00883 left =
00884 right =
00885 top =
00886 bottom =
00887
00888 TODO
00889 }
00890
00891 KWMThemeFactory::KWMThemeFactory()
00892 {
00893 create_pixmaps();
00894 }
00895
00896 KWMThemeFactory::~KWMThemeFactory()
00897 {
00898 delete_pixmaps();
00899 }
00900
00901 KDecoration* KWMThemeFactory::createDecoration( KDecorationBridge* b )
00902 {
00903 return new KWMThemeClient( b, this );
00904 }
00905
00906 bool KWMThemeFactory::reset( unsigned long mask )
00907 {
00908 bool needHardReset = false;
00909
00910 TODO
00911
00912
00913 if( mask & ( SettingFont | SettingButtons ))
00914 needHardReset = true;
00915
00916 if( mask & ( SettingFont | SettingColors )) {
00917 KWMTheme::delete_pixmaps();
00918 KWMTheme::create_pixmaps();
00919 }
00920
00921 if( !needHardReset )
00922 resetDecorations( mask );
00923 return needHardReset;
00924 }
00925
00926 }
00927
00928 extern "C"
00929 {
00930 KDecorationFactory *create_factory()
00931 {
00932 return new KWMTheme::KWMThemeFactory();
00933 }
00934 }
00935
00936 #include "kwmthemeclient.moc"