kwin/stdclient.cpp

335 lines
7.4 KiB
C++
Raw Normal View History

#include "stdclient.h"
#include <qapplication.h>
#include <qcursor.h>
#include <qabstractlayout.h>
#include <qlayout.h>
#include <qtoolbutton.h>
#include <qlabel.h>
#include <qdrawutil.h>
#include "workspace.h"
#include "options.h"
static const char * close_xpm[] = {
/* width height num_colors chars_per_pixel */
"16 16 3 1",
/* colors */
" s None c None",
". c white",
"X c #707070",
/* pixels */
" ",
" ",
" .X .X ",
" .XX .XX ",
" .XX .XX ",
" .XX .XX ",
" .XX.XX ",
" .XXX ",
" .XXX ",
" .XX.XX ",
" .XX .XX ",
" .XX .XX ",
" .XX .XX ",
" .X .X ",
" ",
" "};
static const char * maximize_xpm[] = {
/* width height num_colors chars_per_pixel */
"16 16 3 1",
/* colors */
" s None c None",
". c white",
"X c #707070",
/* pixels */
" ",
" ",
" ........... ",
" .XXXXXXXXXX ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X........X ",
" .XXXXXXXXXX ",
" ",
" ",
" "};
static const char * minimize_xpm[] = {
/* width height num_colors chars_per_pixel */
"16 16 3 1",
/* colors */
" s None c None",
". c white",
"X c #707070",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ... ",
" . X ",
" .XX ",
" ",
" ",
" ",
" ",
" ",
" ",
" "};
static const char * normalize_xpm[] = {
/* width height num_colors chars_per_pixel */
"16 16 3 1",
/* colors */
" s None c None",
". c #707070",
"X c white",
/* pixels */
" ",
" ",
" ........... ",
" .XXXXXXXXXX ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X........X ",
" .XXXXXXXXXX ",
" ",
" ",
" "};
static const char * pinup_xpm[] = {
/* width height num_colors chars_per_pixel */
"16 16 4 1",
/* colors */
" s None c None",
". c #707070",
"X c white",
"o c #a0a0a0",
/* pixels */
" ",
" ",
" ",
" .. . ",
" .X. .. ",
" .XX...X. ",
"XXXXXX.oXoXoX. ",
"oooooo.oXoXoX. ",
".......oo.o.o. ",
" .o...... ",
" ... .. ",
" .. . ",
" ",
" ",
" ",
" "};
static const char * pindown_xpm[] = {
/* width height num_colors chars_per_pixel */
"16 16 4 1",
/* colors */
" s None c None",
". c #707070",
"X c white",
"o c #a0a0a0",
/* pixels */
" ",
" ",
" .... ",
" ..XXXX. ",
" ...XXXXXX. ",
" .X.XXXooo. ",
" .XX.XXooo.. ",
" .XX..Xoo... ",
" .XXXX..... ",
" .XXXoooo.. ",
" .Xoooo... ",
" .oooo... ",
" ...... ",
" ",
" ",
" "};
static QPixmap* close_pix = 0;
static QPixmap* maximize_pix = 0;
static QPixmap* minimize_pix = 0;
static QPixmap* normalize_pix = 0;
static QPixmap* pinup_pix = 0;
static QPixmap* pindown_pix = 0;
static bool pixmaps_created = FALSE;
static void create_pixmaps()
{
if ( pixmaps_created )
return;
pixmaps_created = true;
close_pix = new QPixmap( close_xpm );
maximize_pix = new QPixmap( maximize_xpm );
minimize_pix = new QPixmap( minimize_xpm );
normalize_pix = new QPixmap( normalize_xpm );
pinup_pix = new QPixmap( pinup_xpm );
pindown_pix = new QPixmap( pindown_xpm );
}
StdClient::StdClient( Workspace *ws, WId w, QWidget *parent, const char *name )
: Client( ws, w, parent, name, WResizeNoErase )
{
create_pixmaps();
QGridLayout* g = new QGridLayout( this, 0, 0, 2 );
g->setRowStretch( 1, 10 );
g->addWidget( windowWrapper(), 1, 1 );
g->addColSpacing(0, 2);
g->addColSpacing(2, 2);
g->addRowSpacing(2, 2);
button[0] = new QToolButton( this );
button[1] = new QToolButton( this );
button[2] = new QToolButton( this );
button[3] = new QToolButton( this );
button[4] = new QToolButton( this );
button[5] = new QToolButton( this );
QHBoxLayout* hb = new QHBoxLayout;
g->addLayout( hb, 0, 1 );
hb->addWidget( button[0] );
hb->addWidget( button[1] );
hb->addWidget( button[2] );
int fh = fontMetrics().lineSpacing();
titlebar = new QSpacerItem(10, fh, QSizePolicy::Expanding,
QSizePolicy::Minimum );
hb->addItem( titlebar );
hb->addWidget( button[3] );
hb->addWidget( button[4] );
hb->addWidget( button[5] );
for ( int i = 0; i < 6; i++) {
button[i]->setMouseTracking( TRUE );
button[i]->setFixedSize( 20, 20 );
}
button[0]->setIconSet( miniIcon() );
button[1]->setIconSet( isSticky()?*pindown_pix:*pinup_pix );
connect( button[1], SIGNAL( clicked() ), this, ( SLOT( toggleSticky() ) ) );
button[2]->hide();
button[3]->setIconSet( *minimize_pix );
connect( button[3], SIGNAL( clicked() ), this, ( SLOT( iconify() ) ) );
button[4]->setIconSet( *maximize_pix );
connect( button[4], SIGNAL( clicked() ), this, ( SLOT( maximize() ) ) );
button[5]->setIconSet( *close_pix );
connect( button[5], SIGNAL( clicked() ), this, ( SLOT( closeWindow() ) ) );
}
StdClient::~StdClient()
{
}
void StdClient::resizeEvent( QResizeEvent* e)
{
Client::resizeEvent( e );
if ( isVisibleToTLW() ) {
// manual clearing without the titlebar (we selected WResizeNoErase )
QPainter p( this );
QRect t = titlebar->geometry();
t.setTop( 0 );
QRegion r = rect();
r = r.subtract( t );
p.setClipRegion( r );
p.eraseRect( rect() );
}
}
/*!\reimp
*/
void StdClient::captionChange( const QString& )
{
repaint( titlebar->geometry(), FALSE );
}
/*!\reimp
*/
void StdClient::maximizeChange( bool m )
{
button[4]->setIconSet( m?*normalize_pix:*maximize_pix );
}
/*!\reimp
*/
void StdClient::stickyChange( bool s)
{
button[1]->setIconSet( s?*pindown_pix:*pinup_pix );
}
void StdClient::paintEvent( QPaintEvent* )
{
QPainter p( this );
QRect t = titlebar->geometry();
t.setTop( 0 );
QRegion r = rect();
r = r.subtract( t );
p.setClipRegion( r );
qDrawWinPanel( &p, rect(), options->colorGroup(Options::Frame, isActive()));
p.setClipping( FALSE );
p.fillRect( t, options->color(Options::TitleBar, isActive()));
qDrawShadePanel( &p, t.x(), t.y(), t.width(), t.height(),
options->colorGroup(Options::TitleBar, isActive()), true);
t.setTop( 2 );
t.setLeft( t.left() + 4 );
t.setRight( t.right() - 2 );
p.setPen(options->color(Options::Font, isActive()));
p.setFont(options->font(isActive()));
p.drawText( t, AlignLeft|AlignVCenter, caption() );
}
void StdClient::mouseDoubleClickEvent( QMouseEvent * e )
{
if ( titlebar->geometry().contains( e->pos() ) )
setShade( !isShade() );
workspace()->requestFocus( this );
}
void StdClient::init()
{
button[0]->setIconSet( miniIcon() );
// ### TODO transient etc.
}
void StdClient::iconChange()
{
button[0]->setIconSet( miniIcon() );
button[0]->repaint( FALSE );
}