Adding Mike's patch. See post on kde-devel for more info.
svn path=/trunk/kdebase/kwin/; revision=45191
This commit is contained in:
parent
15b9b5a736
commit
dde9cbced3
2 changed files with 106 additions and 9 deletions
|
@ -225,7 +225,9 @@ B2Client::B2Client( Workspace *ws, WId w, QWidget *parent,
|
||||||
const char *name )
|
const char *name )
|
||||||
: Client( ws, w, parent, name, WResizeNoErase )
|
: Client( ws, w, parent, name, WResizeNoErase )
|
||||||
{
|
{
|
||||||
|
bar_x_ofs = 0;
|
||||||
|
shift_move = FALSE;
|
||||||
|
|
||||||
create_pixmaps();
|
create_pixmaps();
|
||||||
g = new QGridLayout( this, 0, 0);
|
g = new QGridLayout( this, 0, 0);
|
||||||
g->addMultiCellWidget(windowWrapper(), 1, 1, 1, 2);
|
g->addMultiCellWidget(windowWrapper(), 1, 1, 1, 2);
|
||||||
|
@ -343,12 +345,12 @@ void B2Client::paintEvent( QPaintEvent* )
|
||||||
|
|
||||||
// black titlebar frame
|
// black titlebar frame
|
||||||
p.setPen(Qt::black);
|
p.setPen(Qt::black);
|
||||||
p.drawLine(0, 0, 0, height()-5);
|
p.drawLine(bar_x_ofs, 0, bar_x_ofs, t.bottom() );
|
||||||
p.drawLine(0, 0, t.right()+4, 0);
|
p.drawLine(bar_x_ofs, 0, t.right()+4, 0);
|
||||||
p.drawLine(t.right()+4, 0, t.right()+4, t.bottom());
|
p.drawLine(t.right()+4, 0, t.right()+4, t.bottom());
|
||||||
|
|
||||||
// titlebar fill
|
// titlebar fill
|
||||||
qDrawShadeRect(&p, 1, 1, t.width()+6, t.height()-1,
|
qDrawShadeRect(&p, 1+bar_x_ofs, 1, t.width()+6-bar_x_ofs, t.height()-1,
|
||||||
options->colorGroup(Options::TitleBar, isActive()),
|
options->colorGroup(Options::TitleBar, isActive()),
|
||||||
false, 1, 0,
|
false, 1, 0,
|
||||||
&options->colorGroup(Options::TitleBar, isActive()).
|
&options->colorGroup(Options::TitleBar, isActive()).
|
||||||
|
@ -391,8 +393,14 @@ void B2Client::doShape()
|
||||||
t.setHeight(20);
|
t.setHeight(20);
|
||||||
QRegion mask(QRect(0, 0, width(), height()));
|
QRegion mask(QRect(0, 0, width(), height()));
|
||||||
// top to the tilebar right
|
// top to the tilebar right
|
||||||
mask -= QRect(t.width()+8, 0, width()-t.width()-8, t.height()-4);
|
if (bar_x_ofs) {
|
||||||
mask -= QRect(width()-1, t.height()-4, 1, 1); // top right point
|
mask -= QRect(0, 0, bar_x_ofs, t.height()-4); //left from bar
|
||||||
|
mask -= QRect(0, t.height()-4, 1, 1); //top left point
|
||||||
|
}
|
||||||
|
if (t.right() < width() - 5) {
|
||||||
|
mask -= QRect(width()-1, t.height()-4, 1, 1); // top right point
|
||||||
|
mask -= QRect(t.width()+8, 0, width()-t.width()-7, t.height()-4);
|
||||||
|
}
|
||||||
mask -= QRect(width()-1, height()-1, 1, 1); // bottom 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(0, height()-5, 1, 1); // bottom left point
|
||||||
mask -= QRect(width()-1, height()-1, 1, 1); // bottom right point
|
mask -= QRect(width()-1, height()-1, 1, 1); // bottom right point
|
||||||
|
@ -421,6 +429,88 @@ void B2Client::mouseDoubleClickEvent( QMouseEvent * e )
|
||||||
workspace()->requestFocus( this );
|
workspace()->requestFocus( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Client::MousePosition B2Client::mousePosition( const QPoint& p ) const
|
||||||
|
{
|
||||||
|
const int range = 16;
|
||||||
|
const int border = 4;
|
||||||
|
QRect t = g->cellGeometry(0, 1);
|
||||||
|
t.setRight(button[BtnClose]->x()+17);
|
||||||
|
t.setHeight(20-border);
|
||||||
|
int ly = t.bottom();
|
||||||
|
int lx = t.right();
|
||||||
|
|
||||||
|
if ( p.x() > t.right() ) {
|
||||||
|
if ( p.y() <= ly + range && p.x() >= width()-range)
|
||||||
|
return TopRight;
|
||||||
|
else if ( p.y() <= ly + border )
|
||||||
|
return Top;
|
||||||
|
} else if ( p.x() < bar_x_ofs ) {
|
||||||
|
if ( p.y() <= ly + range && p.x() <= range )
|
||||||
|
return TopLeft;
|
||||||
|
else if ( p.y() <= ly+border )
|
||||||
|
return Top;
|
||||||
|
} else if ( p.y() < ly ) {
|
||||||
|
if ( p.x() > bar_x_ofs+border && p.x() < lx-border && p.y() > border )
|
||||||
|
return Client::mousePosition( p );
|
||||||
|
if ( p.x() > bar_x_ofs+range && p.x() < lx - range)
|
||||||
|
return Top;
|
||||||
|
if ( p.y() <= range ) {
|
||||||
|
if ( p.x() <= bar_x_ofs+range )
|
||||||
|
return TopLeft;
|
||||||
|
else return TopRight;
|
||||||
|
} else {
|
||||||
|
if ( p.x() <= bar_x_ofs+range )
|
||||||
|
return Left;
|
||||||
|
else return Right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Client::mousePosition( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void B2Client::mousePressEvent( QMouseEvent * e )
|
||||||
|
{
|
||||||
|
shift_move = e->state() & ShiftButton;
|
||||||
|
if (shift_move ) {
|
||||||
|
moveOffset = e->pos();
|
||||||
|
if (moveOffset.y() >= 19) shift_move=FALSE;
|
||||||
|
}
|
||||||
|
Client::mousePressEvent( e );
|
||||||
|
}
|
||||||
|
|
||||||
|
void B2Client::mouseReleaseEvent( QMouseEvent * e )
|
||||||
|
{
|
||||||
|
Client::mouseReleaseEvent( e );
|
||||||
|
shift_move = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void B2Client::mouseMoveEvent( QMouseEvent * e)
|
||||||
|
{
|
||||||
|
int x = e->pos().x();
|
||||||
|
if (shift_move) {
|
||||||
|
int old_ofs = bar_x_ofs;
|
||||||
|
int oldx = moveOffset.x();
|
||||||
|
int xdiff = x - oldx;
|
||||||
|
moveOffset = e->pos();
|
||||||
|
QRect t = g->cellGeometry(0, 1);
|
||||||
|
t.setRight(button[BtnClose]->x()+17);
|
||||||
|
t.setHeight(20);
|
||||||
|
if (oldx >= bar_x_ofs && oldx <= t.right()) {
|
||||||
|
bar_x_ofs += xdiff;
|
||||||
|
if (bar_x_ofs < 0) bar_x_ofs = 0;
|
||||||
|
if ( t.right() + xdiff >= width()-4)
|
||||||
|
bar_x_ofs = old_ofs;
|
||||||
|
if (bar_x_ofs != old_ofs) {
|
||||||
|
positionButtons();
|
||||||
|
doShape();
|
||||||
|
repaint( 0, 0, width(), t.height(), true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
Client::mouseMoveEvent(e);
|
||||||
|
}
|
||||||
|
|
||||||
void B2Client::stickyChange(bool on)
|
void B2Client::stickyChange(bool on)
|
||||||
{
|
{
|
||||||
button[1]->setDown(on);
|
button[1]->setDown(on);
|
||||||
|
@ -642,7 +732,7 @@ void B2Client::positionButtons()
|
||||||
QFontMetrics fm(options->font(isActive()));
|
QFontMetrics fm(options->font(isActive()));
|
||||||
|
|
||||||
int textLen = fm.width(caption());
|
int textLen = fm.width(caption());
|
||||||
int xpos = 4;
|
int xpos = bar_x_ofs+4;
|
||||||
button[BtnMenu]->move(xpos, 2);
|
button[BtnMenu]->move(xpos, 2);
|
||||||
xpos+=17;
|
xpos+=17;
|
||||||
button[BtnSticky]->move(xpos, 2);
|
button[BtnSticky]->move(xpos, 2);
|
||||||
|
@ -652,10 +742,10 @@ void B2Client::positionButtons()
|
||||||
xpos+=17;
|
xpos+=17;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(xpos + textLen+52 < width()-8)
|
if(xpos + textLen+52 < width()-3)
|
||||||
xpos += textLen+1;
|
xpos += textLen+1;
|
||||||
else
|
else
|
||||||
xpos = width()-8-52;
|
xpos = width()-3-52;
|
||||||
|
|
||||||
button[BtnIconify]->move(xpos, 2);
|
button[BtnIconify]->move(xpos, 2);
|
||||||
xpos+=17;
|
xpos+=17;
|
||||||
|
|
|
@ -43,12 +43,16 @@ protected:
|
||||||
void showEvent( QShowEvent* );
|
void showEvent( QShowEvent* );
|
||||||
void windowWrapperShowEvent( QShowEvent* );
|
void windowWrapperShowEvent( QShowEvent* );
|
||||||
void mouseDoubleClickEvent( QMouseEvent * );
|
void mouseDoubleClickEvent( QMouseEvent * );
|
||||||
|
void mousePressEvent( QMouseEvent * );
|
||||||
|
void mouseReleaseEvent( QMouseEvent * );
|
||||||
|
void mouseMoveEvent(QMouseEvent *);
|
||||||
void init();
|
void init();
|
||||||
void captionChange( const QString& name );
|
void captionChange( const QString& name );
|
||||||
void stickyChange(bool on);
|
void stickyChange(bool on);
|
||||||
void activeChange(bool on);
|
void activeChange(bool on);
|
||||||
void maximizeChange(bool m);
|
void maximizeChange(bool m);
|
||||||
void doShape();
|
void doShape();
|
||||||
|
MousePosition mousePosition( const QPoint& p ) const;
|
||||||
private slots:
|
private slots:
|
||||||
void menuButtonPressed();
|
void menuButtonPressed();
|
||||||
void slotReset();
|
void slotReset();
|
||||||
|
@ -61,6 +65,9 @@ private:
|
||||||
//QSpacerItem* titlebar;
|
//QSpacerItem* titlebar;
|
||||||
//QHBoxLayout *tLayout;
|
//QHBoxLayout *tLayout;
|
||||||
QGridLayout *g;
|
QGridLayout *g;
|
||||||
|
int bar_x_ofs;
|
||||||
|
bool shift_move;
|
||||||
|
QPoint moveOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue