kwin/clients/b2/b2client.cpp
Daniel M. Duley 8724699214 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
2000-03-24 00:22:35 +00:00

671 lines
20 KiB
C++

#include "b2client.h"
#include <qapplication.h>
#include <qcursor.h>
#include <qabstractlayout.h>
#include <qlayout.h>
#include <qtoolbutton.h>
#include <qlabel.h>
#include <qdrawutil.h>
#include <kpixmapeffect.h>
#include <kdrawutil.h>
#include <qbitmap.h>
#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"