From 87246992146abddc26b5d0a29a4cab6b218b2a31 Mon Sep 17 00:00:00 2001 From: "Daniel M. Duley" Date: Fri, 24 Mar 2000 00:22:35 +0000 Subject: [PATCH] This I have had sitting on my HD for awhile, an ultra cool KWin style to go with the B2 widget style :) It uses Be-like shaped titlebars, KDE standard buttons, has a shaped resize handle, and automatically detects if you are on a highcolor display and if so uses gradients based off the current color scheme. BTW, the buttons don't necessarily match the titlebar but use the button foreground setting in KDE's display settings so you can change them to whatever you like. If no one objects I'll probably disable the old Be style. Unlike this style it uses Be-like buttons but the drawing isn't very fancy and Be's two buttons are a big restriction in KDE. You can see a screenshot at: http://www.mosfet.org/b2kwin.gif svn path=/trunk/kdebase/kwin/; revision=44420 --- clients/Makefile.am | 2 +- clients/b2/Makefile.am | 20 ++ clients/b2/b2.desktop | 3 + clients/b2/b2client.cpp | 671 ++++++++++++++++++++++++++++++++++++++++ clients/b2/b2client.h | 69 +++++ clients/b2/bitmaps.h | 98 ++++++ 6 files changed, 862 insertions(+), 1 deletion(-) create mode 100644 clients/b2/Makefile.am create mode 100644 clients/b2/b2.desktop create mode 100644 clients/b2/b2client.cpp create mode 100644 clients/b2/b2client.h create mode 100644 clients/b2/bitmaps.h diff --git a/clients/Makefile.am b/clients/Makefile.am index 85a5968377..05e9ba6afc 100644 --- a/clients/Makefile.am +++ b/clients/Makefile.am @@ -1 +1 @@ -SUBDIRS=be kstep system kwmtheme +SUBDIRS=be kstep system kwmtheme b2 diff --git a/clients/b2/Makefile.am b/clients/b2/Makefile.am new file mode 100644 index 0000000000..e50effe46d --- /dev/null +++ b/clients/b2/Makefile.am @@ -0,0 +1,20 @@ + +INCLUDES = $(all_includes) + +lib_LTLIBRARIES = libkwinb2.la + +libkwinb2_la_SOURCES = b2client.cpp + +METASOURCES = AUTO +noinst_HEADERS = b2client.h + +lnkdir = $(kde_datadir)/kwin/ +lnk_DATA = b2.desktop + +EXTRA_DIST = $(lnk_DATA) + +libkwinb2_la_LDFLAGS = $(all_libraries) -version-info 1:0:0 -module + +###KMAKE-start (don't edit or delete this block) + +###KMAKE-end diff --git a/clients/b2/b2.desktop b/clients/b2/b2.desktop new file mode 100644 index 0000000000..475f13111b --- /dev/null +++ b/clients/b2/b2.desktop @@ -0,0 +1,3 @@ +[Desktop Entry] +Name=B II +X-KDE-Library=libkwinb2 diff --git a/clients/b2/b2client.cpp b/clients/b2/b2client.cpp new file mode 100644 index 0000000000..f56d108960 --- /dev/null +++ b/clients/b2/b2client.cpp @@ -0,0 +1,671 @@ +#include "b2client.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../workspace.h" +#include "../../options.h" +#include "bitmaps.h" + +extern "C" +{ + Client *allocate(Workspace *ws, WId w) + { + return(new B2Client(ws, w)); + } +} + +// TODO: stick all these in an array +static KPixmap *aClosePix=0, *aClosePixDown; +static KPixmap *iClosePix, *iClosePixDown; +static KPixmap *aMaxPix, *aMaxPixDown; +static KPixmap *iMaxPix, *iMaxPixDown; +static KPixmap *aNormalizePix, *aNormalizePixDown; +static KPixmap *iNormalizePix, *iNormalizePixDown; +static KPixmap *aIconifyPix, *aIconifyPixDown; +static KPixmap *iIconifyPix, *iIconifyPixDown; +static KPixmap *aPinupPix, *aPinupPixDown; +static KPixmap *iPinupPix, *iPinupPixDown; +static KPixmap *aMenuPix, *aMenuPixDown; +static KPixmap *iMenuPix, *iMenuPixDown; +static KPixmap *aHelpPix, *aHelpPixDown; +static KPixmap *iHelpPix, *iHelpPixDown; + +static bool pixmaps_created = false; + +static void drawB2Rect(KPixmap *pix, const QColor &primary, bool down) +{ + QPainter p; + QColor hColor = primary.light(150); + QColor lColor = primary.dark(150); + + if(QPixmap::defaultDepth() > 8){ + if(down) + KPixmapEffect::gradient(*pix, lColor, hColor, + KPixmapEffect::DiagonalGradient); + else + KPixmapEffect::gradient(*pix, hColor, lColor, + KPixmapEffect::DiagonalGradient); + } + else + pix->fill(primary); + int x2 = pix->width()-1; + int y2 = pix->height()-1; + p.begin(pix); + p.setPen(down ? hColor : lColor); + p.drawLine(0, 0, x2, 0); + p.drawLine(0, 0, 0, y2); + p.drawLine(1, x2-1, y2-1, x2-1); + p.drawLine(x2-1, 1, x2-1, y2-1); + p.setPen(down ? lColor : hColor); + p.drawRect(1, 1, x2, y2); + p.end(); + +} + +static void create_pixmaps(); +static void redraw_pixmaps(); + +QPixmap* kwin_get_menu_pix_hack() +{ + create_pixmaps(); + //return menu_pix; FIXME + return aMenuPix; +} + +static void create_pixmaps() +{ + if ( pixmaps_created ) + return; + pixmaps_created = true; + + // TODO: Stick all these in an array + aClosePix = new KPixmap; + aClosePix->resize(16, 16); + aClosePixDown = new KPixmap; + aClosePixDown->resize(16, 16); + + iClosePix = new KPixmap; + iClosePix->resize(16, 16); + iClosePixDown = new KPixmap; + iClosePixDown->resize(16, 16); + + aMaxPix = new KPixmap; + aMaxPixDown = new KPixmap; + iMaxPix = new KPixmap; + iMaxPixDown = new KPixmap; + + aNormalizePix = new KPixmap(); + aNormalizePix->resize(16, 16); + aNormalizePixDown = new KPixmap(); + aNormalizePixDown->resize(16, 16); + + aIconifyPix = new KPixmap; + aIconifyPix->resize(10, 10); + aIconifyPixDown = new KPixmap; + aIconifyPixDown->resize(10, 10); + + iNormalizePix = new KPixmap(); + iNormalizePix->resize(16, 16); + iNormalizePixDown = new KPixmap(); + iNormalizePixDown->resize(16, 16); + + iIconifyPix = new KPixmap; + iIconifyPix->resize(10, 10); + iIconifyPixDown = new KPixmap; + iIconifyPixDown->resize(10, 10); + + aPinupPix = new KPixmap; + aPinupPix->resize(16, 16); + aPinupPixDown = new KPixmap; + aPinupPixDown->resize(16, 16); + + iPinupPix = new KPixmap; + iPinupPix->resize(16, 16); + iPinupPixDown = new KPixmap; + iPinupPixDown->resize(16, 16); + + aMenuPix = new KPixmap; + aMenuPix->resize(16, 16); + aMenuPixDown = new KPixmap; + aMenuPixDown->resize(16, 16); + + iMenuPix = new KPixmap; + iMenuPix->resize(16, 16); + iMenuPixDown = new KPixmap; + iMenuPixDown->resize(16, 16); + + aHelpPix = new KPixmap; + aHelpPix->resize(16, 16); + aHelpPixDown = new KPixmap; + aHelpPixDown->resize(16, 16); + iHelpPix = new KPixmap; + iHelpPix->resize(16, 16); + iHelpPixDown = new KPixmap; + iHelpPixDown->resize(16, 16); + + // there seems to be no way to load X bitmaps from data properly, so + // we need to create new ones for each mask :P + QBitmap pinupMask(16, 16, pinup_mask_bits, true); + aPinupPix->setMask(pinupMask); + iPinupPix->setMask(pinupMask); + QBitmap pindownMask(16, 16, pindown_mask_bits, true); + aPinupPixDown->setMask(pindownMask); + iPinupPixDown->setMask(pindownMask); + + QBitmap menuMask(16, 16, menu_mask_bits, true); + aMenuPix->setMask(menuMask); + iMenuPix->setMask(menuMask); + aMenuPixDown->setMask(menuMask); + iMenuPixDown->setMask(menuMask); + + QBitmap helpMask(16, 16, help_mask_bits, true); + aHelpPix->setMask(helpMask); + iHelpPix->setMask(helpMask); + aHelpPixDown->setMask(helpMask); + iHelpPixDown->setMask(helpMask); + redraw_pixmaps(); +} + +B2Button::B2Button(KPixmap *pix, KPixmap *pixDown, QWidget *parent, + const char *name) + : QButton(parent, name) +{ + pNorm = pix; + pDown = pixDown; + setFixedSize(16, 16); + setFocusPolicy(NoFocus); + resize(16, 16); +} + +QSize B2Button::sizeHint() const +{ + return(QSize(16, 16)); +} + +QSizePolicy B2Button::sizePolicy() const +{ + return(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); +} + + +void B2Button::drawButton(QPainter *p) +{ + p->fillRect(rect(), bg); + // hehe, nasty casts - I'm such a bad boy ;-) + if(useMiniIcon && !(((B2Client*)parent())->miniIcon().isNull())){ + QPixmap miniIcon = ((B2Client*)parent())->miniIcon(); + p->drawPixmap((width()-miniIcon.width())/2, + (height()-miniIcon.height())/2, miniIcon); + } + else{ + if(isOn() || isDown()) + p->drawPixmap((width()-pDown->width())/2, + (height()-pDown->height())/2, *pDown); + else + p->drawPixmap((width()-pNorm->width())/2, + (height()-pNorm->height())/2, *pNorm); + } +} + +void B2Button::setPixmaps(KPixmap *pix, KPixmap *pixDown) +{ + pNorm = pix; + pDown = pixDown; + repaint(false); +} + +B2Client::B2Client( Workspace *ws, WId w, QWidget *parent, + const char *name ) + : Client( ws, w, parent, name, WResizeNoErase ) +{ + + create_pixmaps(); + g = new QGridLayout( this, 0, 0); + g->addMultiCellWidget(windowWrapper(), 1, 1, 1, 2); + + g->addColSpacing(0, 4); + + g->addColSpacing(1, providesContextHelp() ? 102 : 85); + + g->setColStretch(2, 1); + + g->setRowStretch(1, 1); + g->addColSpacing(3, 4); + g->addRowSpacing(2, 8); + + // titlebar + g->addRowSpacing(0, 20); + + int i; + for(i=0; i < 6; ++i){ + button[i] = new B2Button(this); + button[i]->setFixedSize(16, 16); + } + + button[BtnSticky]->setToggle(); + button[BtnSticky]->setDown(isSticky()); + button[BtnMenu]->setUseMiniIcon(); + + if(!providesContextHelp()) + button[5]->hide(); + + if(isActive()){ + button[BtnMenu]->setPixmaps(aMenuPix, aMenuPixDown); + button[BtnSticky]->setPixmaps(aPinupPix, aPinupPixDown); + button[BtnIconify]->setPixmaps(aIconifyPix, aIconifyPixDown); + button[BtnClose]->setPixmaps(aClosePix, aClosePixDown); + button[BtnHelp]->setPixmaps(aHelpPix, aHelpPixDown); + + if(isMaximized()) + button[BtnMax]->setPixmaps(aNormalizePix, aNormalizePixDown); + else + button[BtnMax]->setPixmaps(aMaxPix, aMaxPixDown); + } + else{ + button[BtnMenu]->setPixmaps(iMenuPix, iMenuPixDown); // fixme + button[BtnSticky]->setPixmaps(iPinupPix, iPinupPixDown); + button[BtnIconify]->setPixmaps(iIconifyPix, iIconifyPixDown); + button[BtnClose]->setPixmaps(iClosePix, iClosePixDown); + button[BtnHelp]->setPixmaps(iHelpPix, iHelpPixDown); + + if(isMaximized()) + button[BtnMax]->setPixmaps(iNormalizePix, iNormalizePixDown); + else + button[BtnMax]->setPixmaps(iMaxPix, iMaxPixDown); + } + QColor c = options->colorGroup(Options::TitleBar, isActive()). + color(QColorGroup::Button); + for(i=0; i < 6; ++i) + button[i]->setBg(c); + + positionButtons(); + connect(button[BtnMenu], SIGNAL(clicked()), this, SLOT(menuButtonPressed())); + connect(button[BtnSticky], SIGNAL(clicked()), this, SLOT(toggleSticky())); + connect(button[BtnIconify], SIGNAL(clicked()), this, SLOT(iconify())); + connect(button[BtnMax], SIGNAL(clicked()), this, SLOT(maximize())); + connect(button[BtnClose], SIGNAL(clicked()), this, SLOT(closeWindow())); + connect(button[BtnHelp], SIGNAL(clicked()), this, SLOT(contextHelp())); + + connect(options, SIGNAL(resetClients()), this, SLOT(slotReset())); +} + +void B2Client::resizeEvent( QResizeEvent* e) +{ + Client::resizeEvent( e ); + positionButtons(); + doShape(); + if ( isVisibleToTLW() && !testWFlags( WNorthWestGravity )) { + QPainter p( this ); + QRect t = g->cellGeometry(0, 1); + t.setRight(button[BtnClose]->x()+17); + t.setHeight(20); + QRegion r = rect(); + r = r.subtract( t ); + p.setClipRegion( r ); + p.eraseRect( rect() ); + } +} + +void B2Client::captionChange( const QString &) +{ + positionButtons(); + doShape(); + repaint(); +} + +void B2Client::paintEvent( QPaintEvent* ) +{ + + QPainter p( this ); + + QRect t = g->cellGeometry(0, 1); + t.setRight(button[BtnClose]->x()+17); + t.setHeight(20); + + // inner window rect + p.drawRect(3, t.bottom(), width()-6, height()-t.height()-6); + + // outer frame rect + p.drawRect(0, t.bottom()-3, width(), height()-t.height()); + + + // frame shade panel + qDrawShadePanel(&p, 1, t.bottom()-2, width()-2, height()-t.height()-2, + options->colorGroup(Options::Frame, isActive()), + false); + + // black titlebar frame + p.setPen(Qt::black); + p.drawLine(0, 0, 0, height()-5); + p.drawLine(0, 0, t.right()+4, 0); + p.drawLine(t.right()+4, 0, t.right()+4, t.bottom()); + + // titlebar fill + qDrawShadeRect(&p, 1, 1, t.width()+6, t.height()-1, + options->colorGroup(Options::TitleBar, isActive()), + false, 1, 0, + &options->colorGroup(Options::TitleBar, isActive()). + brush(QColorGroup::Button)); + //bottom handle rect + int hx = width()-40; + int hw = 40; + + //p.drawRect(hx, height()-8, hw, 8); + p.drawLine(width()-1, height()-8, width()-1, height()-1); + p.drawLine(hx, height()-1, width()-1, height()-1); + p.drawLine(hx, height()-4, hx, height()-1); + + p.fillRect(hx+1, height()-7, hw-2, 6, + options->colorGroup(Options::Frame, isActive()) + .brush(QColorGroup::Button)); + + p.setPen(options->colorGroup(Options::Frame, isActive()).dark()); + p.drawLine(width()-2, height()-8, width()-2, height()-2); + p.drawLine(hx+1, height()-2, width()-2, height()-2); + p.setPen(options->colorGroup(Options::Frame, isActive()).light()); + p.drawLine(hx+1, height()-6, hx+1, height()-3); + p.drawLine(hx+1, height()-7, width()-3, height()-7); + + p.setPen(options->color(Options::Font, isActive())); + p.setFont(options->font(isActive())); + + t.setX(providesContextHelp() ? button[BtnHelp]->x()+17 : + button[BtnSticky]->x()+17); + t.setRight(button[BtnIconify]->x()-1); + p.drawText(t, AlignLeft | AlignVCenter, caption()); +} + +#define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2) + +void B2Client::doShape() +{ + QRect t = g->cellGeometry(0, 1); + t.setRight(button[BtnClose]->x()+17); + t.setHeight(20); + QRegion mask(QRect(0, 0, width(), height())); + // top to the tilebar right + mask -= QRect(t.width()+8, 0, width()-t.width()-8, t.height()-4); + mask -= QRect(width()-1, t.height()-4, 1, 1); // top right point + mask -= QRect(width()-1, height()-1, 1, 1); // bottom right point + mask -= QRect(0, height()-5, 1, 1); // bottom left point + mask -= QRect(width()-1, height()-1, 1, 1); // bottom right point + mask -= QRect(width()-40, height()-1, 1, 1); // handle left point + mask -= QRect(0, height()-4, width()-40, 4); // bottom left + + setMask(mask); +} + +void B2Client::showEvent(QShowEvent *ev) +{ + Client::showEvent(ev); + doShape(); + repaint(); +} + +void B2Client::windowWrapperShowEvent( QShowEvent* ) +{ + doShape(); +} + +void B2Client::mouseDoubleClickEvent( QMouseEvent * e ) +{ + if (e->pos().y() < 19) + setShade( !isShade() ); + workspace()->requestFocus( this ); +} + +void B2Client::stickyChange(bool on) +{ + button[1]->setDown(on); +} + +void B2Client::maximizeChange(bool m) +{ + if(m){ + if(isActive()) + button[BtnMax]->setPixmaps(aNormalizePix, aNormalizePixDown); + else + button[BtnMax]->setPixmaps(iNormalizePix, iNormalizePixDown); + } + else{ + if(isActive()) + button[BtnMax]->setPixmaps(aMaxPix, aMaxPixDown); + else + button[BtnMax]->setPixmaps(iMaxPix, iMaxPixDown); + } + button[BtnMax]->repaint(); +} + + +void B2Client::activeChange(bool on) +{ + if(on){ + button[BtnMenu]->setPixmaps(aMenuPix, aMenuPixDown); + button[BtnSticky]->setPixmaps(aPinupPix, aPinupPixDown); + button[BtnIconify]->setPixmaps(aIconifyPix, aIconifyPixDown); + button[BtnClose]->setPixmaps(aClosePix, aClosePixDown); + button[BtnHelp]->setPixmaps(aHelpPix, aHelpPixDown); + if(isMaximized()) + button[BtnMax]->setPixmaps(aNormalizePix, aNormalizePixDown); + else + button[BtnMax]->setPixmaps(aMaxPix, aMaxPixDown); + } + else{ + button[BtnMenu]->setPixmaps(iMenuPix, iMenuPixDown); + button[BtnSticky]->setPixmaps(iPinupPix, iPinupPixDown); + button[BtnIconify]->setPixmaps(iIconifyPix, iIconifyPixDown); + button[BtnClose]->setPixmaps(iClosePix, iClosePixDown); + button[BtnHelp]->setPixmaps(iHelpPix, iHelpPixDown); + if(isMaximized()) + button[BtnMax]->setPixmaps(iNormalizePix, iNormalizePixDown); + else + button[BtnMax]->setPixmaps(iMaxPix, iMaxPixDown); + } + int i; + QColor c = options->colorGroup(Options::TitleBar, on). + color(QColorGroup::Button); + for(i=0; i < 6; ++i){ + button[i]->setBg(c); + button[i]->repaint(); + } + Client::activeChange(on); +} + +void B2Client::init() +{ + // +} + +void B2Client::menuButtonPressed() +{ + workspace()->clientPopup(this)-> + popup(button[BtnMenu]->mapToGlobal(button[BtnMenu]-> + rect().bottomLeft())); +} + +void B2Client::slotReset() +{ + redraw_pixmaps(); + QColor c = options->colorGroup(Options::TitleBar, isActive()). + color(QColorGroup::Button); + int i; + for(i=0; i < 6; ++i){ + button[i]->setBg(c); + button[i]->repaint(false); + } + repaint(); +} + +static void redraw_pixmaps() +{ + QColorGroup aGrp = options->colorGroup(Options::ButtonSingleColor, true); + QColorGroup iGrp = options->colorGroup(Options::ButtonSingleColor, false); + + // close + drawB2Rect(aClosePix, aGrp.button(), false); + drawB2Rect(aClosePixDown, aGrp.button(), true); + + drawB2Rect(iClosePix, iGrp.button(), false); + drawB2Rect(iClosePixDown, iGrp.button(), true); + + // maximize + *aMaxPix = *aClosePix; + aMaxPix->detach(); + *aMaxPixDown = *aClosePixDown; + aMaxPixDown->detach(); + *iMaxPix = *iClosePix; + iMaxPix->detach(); + *iMaxPixDown = *iClosePixDown; + iMaxPixDown->detach(); + + // normalize + KPixmap smallBox; + smallBox.resize(10, 10); + KPixmap largeBox; + largeBox.resize(12, 12); + + drawB2Rect(&smallBox, aGrp.button(), false); + drawB2Rect(&largeBox, aGrp.button(), false); + aNormalizePix->fill(options->color(Options::TitleBar, true)); + bitBlt(aNormalizePix, 3, 3, &largeBox, 0, 0, 12, 12, Qt::CopyROP, true); + bitBlt(aNormalizePix, 0, 0, &smallBox, 0, 0, 10, 10, Qt::CopyROP, true); + + bitBlt(aIconifyPix, 0, 0, &smallBox, 0, 0, 10, 10, Qt::CopyROP, true); + + drawB2Rect(&smallBox, aGrp.button(), true); + drawB2Rect(&largeBox, aGrp.button(), true); + aNormalizePixDown->fill(options->color(Options::TitleBar, true)); + bitBlt(aNormalizePixDown, 3, 3, &largeBox, 0, 0, 12, 12, Qt::CopyROP, true); + bitBlt(aNormalizePixDown, 0, 0, &smallBox, 0, 0, 10, 10, Qt::CopyROP, true); + + bitBlt(aIconifyPixDown, 0, 0, &smallBox, 0, 0, 10, 10, Qt::CopyROP, true); + + drawB2Rect(&smallBox, iGrp.button(), false); + drawB2Rect(&largeBox, iGrp.button(), false); + iNormalizePix->fill(options->color(Options::TitleBar, false)); + bitBlt(iNormalizePix, 3, 3, &largeBox, 0, 0, 12, 12, Qt::CopyROP, true); + bitBlt(iNormalizePix, 0, 0, &smallBox, 0, 0, 10, 10, Qt::CopyROP, true); + + bitBlt(iIconifyPix, 0, 0, &smallBox, 0, 0, 10, 10, Qt::CopyROP, true); + + drawB2Rect(&smallBox, iGrp.button(), true); + drawB2Rect(&largeBox, iGrp.button(), true); + iNormalizePixDown->fill(options->color(Options::TitleBar, false)); + bitBlt(iNormalizePixDown, 3, 3, &largeBox, 0, 0, 12, 12, Qt::CopyROP, true); + bitBlt(iNormalizePixDown, 0, 0, &smallBox, 0, 0, 10, 10, Qt::CopyROP, true); + + bitBlt(iIconifyPixDown, 0, 0, &smallBox, 0, 0, 10, 10, Qt::CopyROP, true); + + QPainter p; + // x for close + p.begin(aClosePix); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, close_white_bits, + NULL, NULL, close_dgray_bits, NULL, NULL); + p.end(); + p.begin(aClosePixDown); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, close_white_bits, + NULL, NULL, close_dgray_bits, NULL, NULL); + p.end(); + p.begin(iClosePix); + kColorBitmaps(&p, iGrp, 0, 0, 16, 16, true, close_white_bits, + NULL, NULL, close_dgray_bits, NULL, NULL); + p.end(); + p.begin(iClosePixDown); + kColorBitmaps(&p, iGrp, 0, 0, 16, 16, true, close_white_bits, + NULL, NULL, close_dgray_bits, NULL, NULL); + p.end(); + + // pin + p.begin(aPinupPix); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, pinup_white_bits, + pinup_gray_bits, NULL, pinup_dgray_bits, NULL, NULL); + p.end(); + p.begin(aPinupPixDown); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, pindown_white_bits, + pindown_gray_bits, NULL, pindown_dgray_bits, NULL, NULL); + p.end(); + p.begin(iPinupPix); + kColorBitmaps(&p, iGrp, 0, 0, 16, 16, true, pinup_white_bits, + pinup_gray_bits, NULL, pinup_dgray_bits, NULL, NULL); + p.end(); + p.begin(iPinupPixDown); + kColorBitmaps(&p, iGrp, 0, 0, 16, 16, true, pindown_white_bits, + pindown_gray_bits, NULL, pindown_dgray_bits, NULL, NULL); + p.end(); + + // menu + p.begin(aMenuPix); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, menu_white_bits, + NULL, NULL, menu_dgray_bits, NULL, NULL); + p.end(); + p.begin(aMenuPixDown); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, menu_white_bits, + NULL, NULL, menu_dgray_bits, NULL, NULL); + p.end(); + p.begin(iMenuPix); + kColorBitmaps(&p, iGrp, 0, 0, 16, 16, true, menu_white_bits, + NULL, NULL, menu_dgray_bits, NULL, NULL); + p.end(); + p.begin(iMenuPixDown); + kColorBitmaps(&p, iGrp, 0, 0, 16, 16, true, menu_white_bits, + NULL, NULL, menu_dgray_bits, NULL, NULL); + p.end(); + + // help + p.begin(aHelpPix); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, help_light_bits, + NULL, NULL, help_dark_bits, NULL, NULL); + p.end(); + p.begin(aHelpPixDown); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, help_light_bits, + NULL, NULL, help_dark_bits, NULL, NULL); + p.end(); + p.begin(iHelpPix); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, help_light_bits, + NULL, NULL, help_dark_bits, NULL, NULL); + p.end(); + p.begin(iHelpPixDown); + kColorBitmaps(&p, aGrp, 0, 0, 16, 16, true, help_light_bits, + NULL, NULL, help_dark_bits, NULL, NULL); + p.end(); +} + +void B2Client::positionButtons() +{ + QFontMetrics fm(options->font(isActive())); + + int textLen = fm.width(caption()); + int xpos = 4; + button[BtnMenu]->move(xpos, 2); + xpos+=17; + button[BtnSticky]->move(xpos, 2); + xpos+=17; + if(providesContextHelp()){ + button[BtnHelp]->move(xpos, 2); + xpos+=17; + } + + if(xpos + textLen+52 < width()-8) + xpos += textLen+1; + else + xpos = width()-8-52; + + button[BtnIconify]->move(xpos, 2); + xpos+=17; + button[BtnMax]->move(xpos, 2); + xpos+=17; + button[BtnClose]->move(xpos, 2); +} + +#include "b2client.moc" + + + + diff --git a/clients/b2/b2client.h b/clients/b2/b2client.h new file mode 100644 index 0000000000..a76b9d1f6c --- /dev/null +++ b/clients/b2/b2client.h @@ -0,0 +1,69 @@ +#ifndef __B2CLIENT_H +#define __B2CLIENT_H + +#include +#include +#include +#include "../../client.h" +class QLabel; +//class QSpacerItem; +//class QHBoxLayout; +class QGridLayout; + +class B2Button : public QButton +{ +public: + B2Button(QWidget *parent=0, const char *name=0) + : QButton(parent, name){useMiniIcon = false;} + B2Button(KPixmap *pix, KPixmap *pixDown, QWidget *parent=0, const char *name=0); + void setBg(const QColor &c){bg = c;} + void setPixmaps(KPixmap *pix, KPixmap *pixDown); + void setToggle(){setToggleType(Toggle);} + void setActive(bool on){setOn(on);} + void setUseMiniIcon(){useMiniIcon = true;} + QSize sizeHint() const; + QSizePolicy sizePolicy() const; +protected: + virtual void drawButton(QPainter *p); + void drawButtonLabel(QPainter *){;} + bool useMiniIcon; + KPixmap *pNorm, *pDown; + QColor bg; //only use one color (the rest is pixmap) so forget QPalette ;) +}; + +class B2Client : public Client +{ + Q_OBJECT +public: + B2Client( Workspace *ws, WId w, QWidget *parent=0, const char *name=0 ); + ~B2Client(){;} +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 activeChange(bool on); + void maximizeChange(bool m); + void doShape(); +private slots: + void menuButtonPressed(); + void slotReset(); +private: + void positionButtons(); + enum ButtonType{BtnMenu=0, BtnSticky, BtnIconify, BtnMax, BtnClose, + BtnHelp}; + //B2Button* button[5]; + B2Button* button[6]; + //QSpacerItem* titlebar; + //QHBoxLayout *tLayout; + QGridLayout *g; +}; + + + + +#endif diff --git a/clients/b2/bitmaps.h b/clients/b2/bitmaps.h new file mode 100644 index 0000000000..9b7c31f7cc --- /dev/null +++ b/clients/b2/bitmaps.h @@ -0,0 +1,98 @@ +#ifndef __STDCLIENT_BITMAPS_H +#define __STDCLIENT_BITMAPS_H + +/** + * The standard client has the capability to color it's titlebar buttons + * according to the new color scheme. In order to do this it needs a bitmap + * for each shade which it draws into a pixmap with the appropriate color. + * These are all the bitmaps. + */ + +static unsigned char close_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x04, 0x08, 0x08, 0x04, 0x10, 0x02, + 0x20, 0x01, 0x40, 0x00, 0x40, 0x00, 0x20, 0x01, 0x10, 0x02, 0x08, 0x04, + 0x04, 0x08, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char close_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x18, 0x30, 0x30, 0x18, 0x60, 0x0c, + 0xc0, 0x06, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x06, 0x60, 0x0c, 0x30, 0x18, + 0x18, 0x30, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char menu_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x3f, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char menu_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char menu_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x3f, 0x04, 0x20, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char pindown_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x1f, 0xa0, 0x03, + 0xb0, 0x01, 0x30, 0x01, 0xf0, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char pindown_gray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x0e, 0x00, 0x06, 0x00, 0x00, 0x80, 0x07, 0xc0, 0x03, 0xe0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char pindown_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x10, 0x70, 0x20, 0x50, 0x20, + 0x48, 0x30, 0xc8, 0x38, 0x08, 0x1f, 0x08, 0x18, 0x10, 0x1c, 0x10, 0x0e, + 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char pindown_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x1f, 0xf0, 0x3f, 0xf0, 0x3f, + 0xf8, 0x3f, 0xf8, 0x3f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf0, 0x1f, 0xf0, 0x0f, + 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char pinup_white_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x11, + 0x3f, 0x15, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char pinup_gray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x0a, 0xbf, 0x0a, 0x80, 0x15, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char pinup_dgray_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x40, 0x31, 0x40, 0x2e, + 0x40, 0x20, 0x40, 0x20, 0x7f, 0x2a, 0x40, 0x3f, 0xc0, 0x31, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char pinup_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0xc0, 0x31, 0xc0, 0x3f, + 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xc0, 0x3f, 0xc0, 0x31, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +static unsigned char help_mask_bits[] = { + 0x00,0x00,0x00,0x00,0xe0,0x03,0xf0,0x07,0x70,0x0e,0x60,0x0e,0x00,0x0f,0x80, + 0x07,0xc0,0x03,0xc0,0x01,0x80,0x01,0xc0,0x00,0xc0,0x01,0x80,0x01,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x4c,0x0b,0x08,0x58,0x65,0x09,0x08,0x90,0x00,0x00, + 0x00,0x09,0x04,0x00,0x00,0x72,0x6f,0x6f,0x74,0x00,0x24,0x31,0x24,0x47,0x6b, + 0x65,0x44,0x78,0x63 }; + +static unsigned char help_dark_bits[] = { + 0x00,0x00,0x00,0x00,0xe0,0x03,0x30,0x06,0x30,0x06,0x00,0x06,0x00,0x03,0x80, + 0x01,0xc0,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0xc0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x65,0x64,0x28,0x29,0x00,0x00,0x00,0x00,0x90,0x00,0x00, + 0x00,0x21,0x00,0x00,0x00,0x34,0xfe,0x12,0x2b,0x00,0x00,0xff,0xff,0x58,0xc0, + 0x01,0x2b,0x45,0xfe }; + +static unsigned char help_light_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x40,0x08,0x60,0x08,0x00,0x0c,0x00, + 0x06,0x00,0x03,0x00,0x01,0x80,0x01,0x00,0x00,0x00,0x01,0x80,0x01,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x4c,0x0b,0x08,0x58,0x65,0x09,0x08,0x90,0x00,0x00, + 0x00,0x09,0x04,0x00,0x00,0x72,0x6f,0x6f,0x74,0x00,0x24,0x31,0x24,0x47,0x6b, + 0x65,0x44,0x78,0x63 }; + +#endif +