From ebd1de8b7e4f4908157646e78f5080b8ac0eeaee Mon Sep 17 00:00:00 2001 From: Lennart Kudling Date: Wed, 20 Jun 2001 11:17:03 +0000 Subject: [PATCH] added this nice code and made _IMPORTANT_ modifications, so that it's copyrighted by Mosfet and me. :) svn path=/trunk/kdebase/kwin/; revision=103158 --- clients/Makefile.am | 2 +- clients/laptop/Makefile.am | 21 + clients/laptop/laptop.desktop | 31 ++ clients/laptop/laptopclient.cpp | 704 ++++++++++++++++++++++++++++++++ clients/laptop/laptopclient.h | 86 ++++ 5 files changed, 843 insertions(+), 1 deletion(-) create mode 100644 clients/laptop/Makefile.am create mode 100644 clients/laptop/laptop.desktop create mode 100644 clients/laptop/laptopclient.cpp create mode 100644 clients/laptop/laptopclient.h diff --git a/clients/Makefile.am b/clients/Makefile.am index 8e0182d297..767a217c23 100644 --- a/clients/Makefile.am +++ b/clients/Makefile.am @@ -1 +1 @@ -SUBDIRS = default kde1 riscos win2k quartz icewm web mwm b2 modernsystem +SUBDIRS = default kde1 riscos win2k quartz icewm web mwm b2 modernsystem laptop diff --git a/clients/laptop/Makefile.am b/clients/laptop/Makefile.am new file mode 100644 index 0000000000..624de53472 --- /dev/null +++ b/clients/laptop/Makefile.am @@ -0,0 +1,21 @@ + +INCLUDES = $(all_includes) + +kde_module_LTLIBRARIES = libkwinlaptop.la + +libkwinlaptop_la_SOURCES = laptopclient.cpp +libkwinlaptop_la_LIBADD = ../../kwin.la +libkwinlaptop_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) + +METASOURCES = AUTO +noinst_HEADERS = laptopclient.h + +lnkdir = $(kde_datadir)/kwin/ +lnk_DATA = laptop.desktop + +EXTRA_DIST = $(lnk_DATA) + + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/clients/laptop/laptop.desktop b/clients/laptop/laptop.desktop new file mode 100644 index 0000000000..f4eed318e2 --- /dev/null +++ b/clients/laptop/laptop.desktop @@ -0,0 +1,31 @@ +[Desktop Entry] +Name=Laptop +Name[az]=Dizüstü +Name[br]=Hezoug +Name[ca]=Portàtil +Name[da]=Bærbar +Name[el]=Φορητό +Name[eo]=Portkomputilo +Name[es]=Portátil +Name[eu]=Eramangarria +Name[fi]=Kannettava +Name[fr]=Ordinateur portable +Name[gl]=Portátil +Name[is]=Ferðavél +Name[it]=Portatile +Name[ja]=ラップトップ +Name[ko]=랩탑 +Name[lv]=Laptops +Name[mk]=Лаптоп +Name[nl]=Schootcomputer +Name[no]=Bærbar +Name[no_NY]=Bærbar +Name[oc]=Portatil +Name[pt]=Portátil +Name[sl]=Prenosnik +Name[sv]=Bärbar dator +Name[tr]=Dizst +Name[uk]=Мобільний комп'ютер (лептоп) +Name[zh_CN.GB2312]=膝上计算机 +Name[zh_TW.Big5]=膝上型電腦 +X-KDE-Library=libkwinlaptop diff --git a/clients/laptop/laptopclient.cpp b/clients/laptop/laptopclient.cpp new file mode 100644 index 0000000000..47511ebfb0 --- /dev/null +++ b/clients/laptop/laptopclient.cpp @@ -0,0 +1,704 @@ + +#include // up here to avoid X11 header conflict :P +#include "laptopclient.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../workspace.h" +#include "../../options.h" + +using namespace KWinInternal; + + + +static unsigned char iconify_bits[] = { + 0xff, 0xff, 0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18}; + +static unsigned char close_bits[] = { + 0x42, 0xe7, 0x7e, 0x3c, 0x3c, 0x7e, 0xe7, 0x42}; + +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 question_bits[] = { + 0x3c, 0x66, 0x60, 0x30, 0x18, 0x00, 0x18, 0x18}; + +static unsigned char unsticky_bits[] = { + 0x3c, 0x42, 0x99, 0xbd, 0xbd, 0x99, 0x42, 0x3c}; + +static unsigned char sticky_bits[] = { + 0x3c, 0x42, 0x81, 0x81, 0x81, 0x81, 0x42, 0x3c}; + +static QPixmap *titlePix=0; +static KPixmap *aUpperGradient=0; +static KPixmap *iUpperGradient=0; +// buttons active, inactive, up, down, and 2 sizes :P +static KPixmap *btnPix1=0; +static KPixmap *iBtnPix1=0; +static KPixmap *btnDownPix1=0; +static KPixmap *iBtnDownPix1=0; +static KPixmap *btnPix2=0; +static KPixmap *btnDownPix2=0; +static KPixmap *iBtnPix2=0; +static KPixmap *iBtnDownPix2=0; +static QColor btnForeground; + +static bool pixmaps_created = false; + +static int titleHeight = 14; // configurable title height not implemented yet +static int btnWidth1 = 17; +static int btnWidth2 = 27; + + +static void drawButtonFrame(KPixmap *pix, const QColorGroup &g, bool sunken) +{ + QPainter p; + int w = pix->width(); + int h = pix->height(); + int x2 = w-1; + int y2 = h-1; + p.begin(pix); + + if(sunken){ + qDrawShadePanel(&p, 0, 0, w, h, g, true, 2); + } + else{ + p.setPen(g.dark()); + p.drawRect(0, 0, w-1, h-1); + p.setPen(g.light()); + p.drawLine(x2, 0, x2, y2); + p.drawLine(0, y2, x2, y2); + p.drawLine(1, 1, x2-2, 1); + p.drawLine(1, 1, 1, y2-2); + p.end(); + } +} + +static void create_pixmaps() +{ + if(pixmaps_created) + return; + pixmaps_created = true; + + // titlebar + QPainter p; + QPainter maskPainter; + int i, x, y; + titlePix = new QPixmap(33, 12); + QBitmap mask(33, 12); + mask.fill(Qt::color0); + + p.begin(titlePix); + maskPainter.begin(&mask); + maskPainter.setPen(Qt::color1); + for(i=0, y=2; i < 3; ++i, y+=4){ + for(x=1; x <= 33; x+=3){ + p.setPen(options->color(Options::TitleBar, true).light(150)); + p.drawPoint(x, y); + maskPainter.drawPoint(x, y); + p.setPen(options->color(Options::TitleBar, true).dark(150)); + p.drawPoint(x+1, y+1); + maskPainter.drawPoint(x+1, y+1); + } + } + p.end(); + maskPainter.end(); + titlePix->setMask(mask); + + if(QPixmap::defaultDepth() > 8){ + aUpperGradient = new KPixmap; + aUpperGradient->resize(32, titleHeight+2); + iUpperGradient = new KPixmap; + iUpperGradient->resize(32, titleHeight+2); + QColor bgColor = options->color(Options::TitleBar, true); + KPixmapEffect::gradient(*aUpperGradient, + bgColor.light(120), + bgColor.dark(120), + KPixmapEffect::VerticalGradient); + bgColor = options->color(Options::TitleBar, false); + KPixmapEffect::gradient(*iUpperGradient, + bgColor.light(120), + bgColor.dark(120), + KPixmapEffect::VerticalGradient); + } + // buttons (active/inactive, sunken/unsunken, 2 sizes each) + QColorGroup g = options->colorGroup(Options::ButtonBg, true); + QColor c = g.background(); + btnPix1 = new KPixmap; + btnPix1->resize(btnWidth1, titleHeight); + btnDownPix1 = new KPixmap; + btnDownPix1->resize(btnWidth1, titleHeight); + btnPix2 = new KPixmap; + btnPix2->resize(btnWidth2, titleHeight); + btnDownPix2 = new KPixmap; + btnDownPix2->resize(btnWidth2, titleHeight); + iBtnPix1 = new KPixmap; + iBtnPix1->resize(btnWidth1, titleHeight); + iBtnDownPix1 = new KPixmap; + iBtnDownPix1->resize(btnWidth1, titleHeight); + iBtnPix2 = new KPixmap; + iBtnPix2->resize(btnWidth2, titleHeight); + iBtnDownPix2 = new KPixmap; + iBtnDownPix2->resize(btnWidth2, titleHeight); + if(QPixmap::defaultDepth() > 8){ + KPixmapEffect::gradient(*btnPix1, c.light(120), c.dark(130), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(*btnDownPix1, c.dark(130), c.light(120), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(*btnPix2, c.light(120), c.dark(130), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(*btnDownPix2, c.dark(130), c.light(120), + KPixmapEffect::DiagonalGradient); + g = options->colorGroup(Options::ButtonBg, false); + c = g.background(); + KPixmapEffect::gradient(*iBtnPix1, c.light(120), c.dark(130), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(*iBtnDownPix1, c.dark(130), c.light(120), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(*iBtnPix2, c.light(120), c.dark(130), + KPixmapEffect::DiagonalGradient); + KPixmapEffect::gradient(*iBtnDownPix2, c.dark(130), c.light(120), + KPixmapEffect::DiagonalGradient); + } + else{ + btnPix1->fill(c.rgb()); + btnDownPix1->fill(c.rgb()); + btnPix2->fill(c.rgb()); + btnDownPix2->fill(c.rgb()); + g = options->colorGroup(Options::ButtonBg, false); + c = g.background(); + iBtnPix1->fill(c.rgb()); + iBtnDownPix1->fill(c.rgb()); + iBtnPix2->fill(c.rgb()); + iBtnDownPix2->fill(c.rgb()); + } + g = options->colorGroup(Options::ButtonBg, true); + c = g.background(); + drawButtonFrame(btnPix1, g, false); + drawButtonFrame(btnDownPix1, g, true); + drawButtonFrame(btnPix2, g, false); + drawButtonFrame(btnDownPix2, g, true); + g = options->colorGroup(Options::ButtonBg, false); + c = g.background(); + drawButtonFrame(iBtnPix1, g, false); + drawButtonFrame(iBtnDownPix1, g, true); + drawButtonFrame(iBtnPix2, g, false); + drawButtonFrame(iBtnDownPix2, g, true); + + if(qGray(options->color(Options::ButtonBg, true).rgb()) > 128) + btnForeground = Qt::black; + else + btnForeground = Qt::white; +} + +static void delete_pixmaps() +{ + delete titlePix; + if(aUpperGradient){ + delete aUpperGradient; + delete iUpperGradient; + delete btnPix1; + delete btnDownPix1; + delete iBtnPix1; + delete iBtnDownPix1; + delete btnPix2; + delete btnDownPix2; + delete iBtnPix2; + delete iBtnDownPix2; + } + pixmaps_created = false; +} + + +LaptopClientButton::LaptopClientButton(int w, int h, Client *parent, const char *name, + const unsigned char *bitmap) + : QButton(parent, name) +{ + client = parent; + defaultSize = QSize(w, h); + setFixedHeight(h); + resize(defaultSize); + if(bitmap) + setBitmap(bitmap); + //setBackgroundMode(QWidget::NoBackground); +} + +QSize LaptopClientButton::sizeHint() const +{ + return(defaultSize); +} + +void LaptopClientButton::reset() +{ + repaint(false); +} + +void LaptopClientButton::setBitmap(const unsigned char *bitmap) +{ + deco = QBitmap(8, 8, bitmap, true); + deco.setMask(deco); + repaint(); +} + +void LaptopClientButton::drawButton(QPainter *p) +{ + bool smallBtn = width() == btnWidth1; + if(btnPix1){ + if(client->isActive()){ + if(isDown()) + p->drawPixmap(0, 0, smallBtn ? *btnDownPix1 : *btnDownPix2); + else + p->drawPixmap(0, 0, smallBtn ? *btnPix1 : *btnPix2); + } + else{ + if(isDown()) + p->drawPixmap(0, 0, smallBtn ? *iBtnDownPix1 : *iBtnDownPix2); + else + p->drawPixmap(0, 0, smallBtn ? *iBtnPix1 : *iBtnPix2); + } + } + else{ + QColorGroup g = options->colorGroup(Options::ButtonBg, + client->isActive()); + int w = width(); + int h = height(); + p->fillRect(1, 1, w-2, h-2, isDown() ? g.mid() : g.button()); + p->setPen(isDown() ? g.dark() : g.light()); + p->drawLine(0, 0, w-1, 0); + p->drawLine(0, 0, 0, w-1); + p->setPen(isDown() ? g.light() : g.dark()); + p->drawLine(w-1, 0, w-1, h-1); + p->drawLine(0, h-1, w-1, h-1); + } + + p->setPen(btnForeground); + int xOff = (width()-8)/2; + int yOff = (height()-8)/2; + p->drawPixmap(isDown() ? xOff+1: xOff, isDown() ? yOff+1 : yOff, deco); +} + +void LaptopClient::slotReset() +{ + int i; + for(i=0; i < 5; ++i){ + if(button[i]) + button[i]->reset(); + } + repaint(); +} + +LaptopClient::LaptopClient( Workspace *ws, WId w, QWidget *parent, + const char *name ) + : Client( ws, w, parent, name, WResizeNoErase | WNorthWestGravity ) +{ + lastButtonWidth = 0; + lastBufferWidth = 0; + + connect(options, SIGNAL(resetClients()), this, SLOT(slotReset())); + bool help = providesContextHelp(); + + + QGridLayout* g = new QGridLayout(this, 0, 0, 0); + g->setResizeMode(QLayout::FreeResize); + g->addRowSpacing(0, 3); + g->addRowSpacing(2, 1); + g->addWidget(windowWrapper(), 3, 1); + g->setRowStretch(3, 10); + g->addRowSpacing(4, 8); // bottom handles + g->addColSpacing(0, 4); + g->addColSpacing(2, 4); + + int th = titleHeight; + if ( isTool() ) + th -= 2; + + button[BtnClose] = new LaptopClientButton(27, th, this, "close", close_bits); + button[BtnSticky] = new LaptopClientButton(17, th, this, "sticky"); + if(isSticky()) + button[BtnSticky]->setBitmap(unsticky_bits); + else + button[BtnSticky]->setBitmap(sticky_bits); + button[BtnIconify] = new LaptopClientButton(27, th, this, "iconify", + iconify_bits); + button[BtnMax] = new LaptopClientButton(27, th, this, "maximize", + maximize_bits); + if(help){ + button[BtnHelp] = new LaptopClientButton(17, th, this, "help", + question_bits); + connect(button[BtnHelp], SIGNAL( clicked() ), this, ( SLOT( contextHelp() ) ) ); + } + else + button[BtnHelp] = NULL; + + connect( button[BtnClose], SIGNAL( clicked() ), this, ( SLOT( closeWindow() ) ) ); + connect( button[BtnSticky], SIGNAL( clicked() ), this, ( SLOT( toggleSticky() ) ) ); + connect( button[BtnIconify], SIGNAL( clicked() ), this, ( SLOT( iconify() ) ) ); + connect( button[BtnMax], SIGNAL( clicked() ), this, ( SLOT( slotMaximize() ) ) ); + + hb = new QHBoxLayout(); + hb->setResizeMode(QLayout::FreeResize); + g->addLayout( hb, 1, 1 ); + hb->addWidget( button[BtnClose]); + hb->addSpacing(1); + titlebar = new QSpacerItem(10, th, QSizePolicy::Expanding, + QSizePolicy::Minimum); + hb->addItem(titlebar); + hb->addSpacing(1); + if(help){ + hb->addWidget( button[BtnHelp]); + } + hb->addWidget( button[BtnSticky]); + hb->addWidget( button[BtnIconify]); + hb->addWidget( button[BtnMax]); + + if ( isTransient() || isTool() ) + button[BtnSticky]->hide(); + if ( !isMinimizable() ) + button[BtnIconify]->hide(); + if ( !isMaximizable() ) + button[BtnMax]->hide(); + + hiddenItems = false; + bufferDirty = true; +} + +void LaptopClient::slotMaximize() +{ + if ( button[BtnMax]->last_button == MidButton ) + maximize( MaximizeVertical ); + else if ( button[BtnMax]->last_button == RightButton ) + maximize( MaximizeHorizontal ); + else + maximize(); +} + +void LaptopClient::resizeEvent( QResizeEvent* e) +{ + Client::resizeEvent( e ); + + doShape(); + calcHiddenButtons(); + if ( isVisibleToTLW() ) { + int dx = 0; + int dy = 0; + if ( e->oldSize().width() != width() ) + dx = 32 + QABS( e->oldSize().width() - width() ); + if ( e->oldSize().height() != height() ) + dy = 8 + QABS( e->oldSize().height() - height() ); + if ( dy ) + update( 0, height() - dy + 1, width(), dy ); + if ( dx ) { + update( width() - dx + 1, 0, dx, height() ); + update( QRect( QPoint(4,4), titlebar->geometry().bottomLeft() - QPoint(1,0) ) ); + update( QRect( titlebar->geometry().topRight(), QPoint( width() - 4, titlebar->geometry().bottom() ) ) ); + // titlebar needs no background + QApplication::postEvent( this, new QPaintEvent( titlebar->geometry(), FALSE ) ); + } + } +} + +void LaptopClient::captionChange( const QString& ) +{ + bufferDirty = true; + repaint( titlebar->geometry(), false ); +} + +void LaptopClient::paintEvent( QPaintEvent* ) +{ + QPainter p(this); + QColorGroup g = options->colorGroup(Options::Frame, isActive()); + + QRect r(rect()); + p.setPen(Qt::black); + p.drawRect(r); + // outer frame + p.setPen(g.light()); + p.drawLine(r.x()+1, r.y()+1, r.right()-1, r.y()+1); + p.drawLine(r.x()+1, r.y()+1, r.x()+1, r.bottom()-1); + p.setPen(g.dark()); + p.drawLine(r.right()-1, r.y()+1, r.right()-1, r.bottom()-1); + p.drawLine(r.x()+1, r.bottom()-1, r.right()-1, r.bottom()-1); + + int th = titleHeight; + if ( isTool() ) + th -= 2; + + // inner rect + p.drawRect(r.x()+3, r.y()+th+3, r.width()-6, + r.height()-th-10); + // handles + if(r.width() > 44){ + qDrawShadePanel(&p, r.x()+1, r.bottom()-6, 20, + 6, g, false, 1, &g.brush(QColorGroup::Mid)); + qDrawShadePanel(&p, r.x()+21, r.bottom()-6, r.width()-42, 6, + g, false, 1, isActive() ? + &g.brush(QColorGroup::Background) : + &g.brush(QColorGroup::Mid)); + qDrawShadePanel(&p, r.right()-20, r.bottom()-6, 20, 6, + g, false, 1, &g.brush(QColorGroup::Mid)); + } + else + qDrawShadePanel(&p, r.x()+1, r.bottom()-6, r.width()-2, 6, g, + false, 1, isActive() ? + &g.brush(QColorGroup::Background) : + &g.brush(QColorGroup::Mid)); + + r = titlebar->geometry(); + r.setRight(r.right()-1); + + if(isActive()){ + updateActiveBuffer(); + p.drawPixmap(r.x(), r.y(), activeBuffer); + } + else{ + if(iUpperGradient) + p.drawTiledPixmap(r.x(), r.y(), r.width(), r.height()-1, + *iUpperGradient); + else + p.fillRect(r.x(), r.y(), r.width(), r.height()-1, + options->color(Options::TitleBar, false)); + + p.setFont(options->font(false, isTool() )); + QFontMetrics fm(options->font(false)); + g = options->colorGroup(Options::TitleBar, false); + if(iUpperGradient) + p.drawTiledPixmap(r.x()+((r.width()-fm.width(caption()))/2)-4, + r.y(), fm.width(caption())+8, r.height()-1, + *iUpperGradient); + else + p.fillRect(r.x()+((r.width()-fm.width(caption()))/2)-4, r.y(), + fm.width(caption())+8, r.height()-1, + g.brush(QColorGroup::Background)); + p.setPen(g.mid()); + p.drawLine(r.x(), r.y(), r.right(), r.y()); + p.drawLine(r.x(), r.y(), r.x(), r.bottom()); + p.setPen(g.button()); + p.drawLine(r.right(), r.y(), r.right(), r.bottom()); + p.drawLine(r.x(), r.bottom(), r.right(), r.bottom()); + p.setPen(options->color(Options::Font, false)); + p.drawText(r.x(), r.y(), r.width(), r.height()-1, + AlignCenter, caption() ); + g = options->colorGroup(Options::Frame, true); + p.setPen(g.background()); + p.drawPoint(r.x(), r.y()); + p.drawPoint(r.right(), r.y()); + p.drawLine(r.right()+1, r.y(), r.right()+1, r.bottom()); + } +} + +#define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2) + +void LaptopClient::doShape() +{ + QRegion mask(QRect(0, 0, width(), height())); + mask -= QRect(0, 0, 1, 1); + mask -= QRect(width()-1, 0, 1, 1); + mask -= QRect(0, height()-1, 1, 1); + mask -= QRect(width()-1, height()-1, 1, 1); + + setMask(mask); +} + +void LaptopClient::showEvent(QShowEvent *ev) +{ + Client::showEvent(ev); + doShape(); + repaint(); +} + +void LaptopClient::windowWrapperShowEvent( QShowEvent* ) +{ + doShape(); +} + +void LaptopClient::mouseDoubleClickEvent( QMouseEvent * e ) +{ + if (titlebar->geometry().contains( e->pos() ) ) + workspace()->performWindowOperation( this, options->operationTitlebarDblClick() ); + workspace()->requestFocus( this ); +} + +void LaptopClient::stickyChange(bool on) +{ + button[BtnSticky]->setBitmap(on ? unsticky_bits : sticky_bits); +} + +void LaptopClient::maximizeChange(bool m) +{ + button[BtnMax]->setBitmap(m ? minmax_bits : maximize_bits); +} + +void LaptopClient::init() +{ + // +} + +void LaptopClient::activeChange(bool) +{ + repaint(false); + int i; + for(i=0; i < 5; ++i){ + if(button[i]) + button[i]->reset(); + } +} + + +void LaptopClient::calcHiddenButtons() +{ + // order of hiding is help, sticky, maximize, minimize, close; + // buttons can have + int minWidth = 32 + btnWidth2*3 + (providesContextHelp() ? btnWidth1*2 : + btnWidth1); + + if(lastButtonWidth > width()){ // shrinking + lastButtonWidth = width(); + if(width() < minWidth){ + hiddenItems = true; + int i; + for(i=0; i<5; ++i){ + if(button[i]){ + if( !button[i]->isHidden() ) { + button[i]->hide(); + } + minWidth-=button[i]->sizeHint().width(); + if(width() >= minWidth) + return; + } + } + } + } + else if(hiddenItems){ // expanding + lastButtonWidth = width(); + int i; + int totalSize=32; + for(i=4; i>=0; --i){ + if(button[i]){ + if(button[i]->sizeHint().width() + totalSize <= width()){ + totalSize+=button[i]->sizeHint().width(); + if(button[i]->isHidden() && + ( !isTransient() || !isTransient() || i != BtnSticky ) && + ( isMinimizable() || i != BtnIconify ) && + ( isMaximizable() || ( i != BtnIconify && i != BtnSticky && i != BtnMax ) ) + + ) { + button[i]->resize(button[i]->sizeHint()); + button[i]->show(); + } + } + else + return; + } + } + // all items shown now + hiddenItems = false; + } + else + lastButtonWidth = width(); +} + +void LaptopClient::updateActiveBuffer( ) +{ + if( !bufferDirty && (lastBufferWidth == titlebar->geometry().width())) + return; + if ( titlebar->geometry().width() <= 0 || titlebar->geometry().height() <= 0 ) + return; + lastBufferWidth = titlebar->geometry().width(); + bufferDirty = false; + + activeBuffer.resize(titlebar->geometry().width(), + titlebar->geometry().height()); + QPainter p; + QRect r(0, 0, activeBuffer.width()-1, activeBuffer.height()); + p.begin(&activeBuffer); + if(aUpperGradient){ + p.drawTiledPixmap(r, *aUpperGradient); + } + else{ + p.fillRect(r, options->color(Options::TitleBar, true)); + } + if(titlePix) + p.drawTiledPixmap(r, *titlePix); + + p.setFont(options->font(true, isTool() )); + QFontMetrics fm(options->font(true)); + QColorGroup g = options->colorGroup(Options::TitleBar, true); + if(aUpperGradient) + p.drawTiledPixmap(r.x()+((r.width()-fm.width(caption()))/2)-4, + r.y(), fm.width(caption())+8, r.height()-1, + *aUpperGradient); + else + p.fillRect(r.x()+((r.width()-fm.width(caption()))/2)-4, 0, + fm.width(caption())+8, r.height(), + g.brush(QColorGroup::Background)); + p.setPen(g.mid()); + p.drawLine(r.x(), r.y(), r.right(), r.y()); + p.drawLine(r.x(), r.y(), r.x(), r.bottom()); + p.setPen(g.button()); + p.drawLine(r.right(), r.y(), r.right(), r.bottom()); + p.drawLine(r.x(), r.bottom(), r.right(), r.bottom()); + p.setPen(options->color(Options::Font, true)); + p.drawText(r.x(), r.y(), r.width(), r.height()-1, + AlignCenter, caption() ); + g = options->colorGroup(Options::Frame, true); + p.setPen(g.background()); + p.drawPoint(r.x(), r.y()); + p.drawPoint(r.right(), r.y()); + p.drawLine(r.right()+1, r.y(), r.right()+1, r.bottom()); + p.end(); +} + + Client::MousePosition +LaptopClient::mousePosition( const QPoint& p ) const +{ + MousePosition m = Nowhere; + + if (p.y() < (height() - 7)) + m = Client::mousePosition(p); + + else { + if (p.x() >= (width() - 20)) + m = BottomRight; + else if (p.x() <= 20) + m = BottomLeft; + else + m = Bottom; + } + + return m; +} + +extern "C" +{ + Client *allocate(Workspace *ws, WId w, int) + { + return(new LaptopClient(ws, w)); + } + void init() + { + create_pixmaps(); + } + void reset() + { + delete_pixmaps(); + create_pixmaps(); + } + void deinit() + { + delete_pixmaps(); + } +} + +#include "laptopclient.moc" diff --git a/clients/laptop/laptopclient.h b/clients/laptop/laptopclient.h new file mode 100644 index 0000000000..616319dc7c --- /dev/null +++ b/clients/laptop/laptopclient.h @@ -0,0 +1,86 @@ +#ifndef __KDECLIENT_H +#define __KDECLIENT_H + +#include +#include +#include +#include "../../client.h" +class QLabel; +class QSpacerItem; +class QHBoxLayout; + +namespace KWinInternal { + +// get rid of autohide :P +class LaptopClientButton : public QButton +{ +public: + LaptopClientButton(int w, int h, Client *parent=0, const char *name=0, + const unsigned char *bitmap=NULL); + void setBitmap(const unsigned char *bitmap); + void reset(); + QSize sizeHint() const; + int last_button; + +protected: + void mousePressEvent( QMouseEvent* e ) + { + last_button = e->button(); + QMouseEvent me ( e->type(), e->pos(), e->globalPos(), LeftButton, e->state() ); + QButton::mousePressEvent( &me ); + } + void mouseReleaseEvent( QMouseEvent* e ) + { + last_button = e->button(); + QMouseEvent me ( e->type(), e->pos(), e->globalPos(), LeftButton, e->state() ); + QButton::mouseReleaseEvent( &me ); + } + virtual void drawButton(QPainter *p); + void drawButtonLabel(QPainter *) {} + QSize defaultSize; + QBitmap deco; + Client *client; +}; + +class LaptopClient : public KWinInternal::Client +{ + Q_OBJECT +public: + enum Buttons{BtnHelp=0, BtnSticky, BtnMax, BtnIconify, BtnClose}; + LaptopClient( Workspace *ws, WId w, QWidget *parent=0, const char *name=0 ); + ~LaptopClient() {} +protected: + 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(); + void activeChange(bool); + + void calcHiddenButtons(); + void updateActiveBuffer(); + + MousePosition mousePosition(const QPoint &) const; + +protected slots: + void slotReset(); + void slotMaximize(); +private: + LaptopClientButton* button[5]; + int lastButtonWidth; + QSpacerItem* titlebar; + bool hiddenItems; + QHBoxLayout* hb; + KPixmap activeBuffer; + bool bufferDirty; + int lastBufferWidth; +}; + +}; + +#endif