Try to reduce damage caused by window moving.
svn path=/branches/work/kwin_composite/; revision=606266
This commit is contained in:
parent
09781249b9
commit
951448b575
2 changed files with 24 additions and 18 deletions
1
client.h
1
client.h
|
@ -492,6 +492,7 @@ class Client
|
||||||
QSize client_size;
|
QSize client_size;
|
||||||
int block_geometry_updates; // >0 - new geometry is remembered, but not actually set
|
int block_geometry_updates; // >0 - new geometry is remembered, but not actually set
|
||||||
bool pending_geometry_update;
|
bool pending_geometry_update;
|
||||||
|
QRect geom_before_block;
|
||||||
bool shade_geometry_change;
|
bool shade_geometry_change;
|
||||||
int border_left, border_right, border_top, border_bottom;
|
int border_left, border_right, border_top, border_bottom;
|
||||||
QRegion _mask;
|
QRegion _mask;
|
||||||
|
|
41
geometry.cpp
41
geometry.cpp
|
@ -1660,8 +1660,6 @@ void Client::setGeometry( int x, int y, int w, int h, ForceGeometry_t force )
|
||||||
}
|
}
|
||||||
if( force == NormalGeometrySet && geom == QRect( x, y, w, h ))
|
if( force == NormalGeometrySet && geom == QRect( x, y, w, h ))
|
||||||
return;
|
return;
|
||||||
// TODO add damage only if not obscured
|
|
||||||
workspace()->addDamage( geometry()); // TODO cache the previous real geometry
|
|
||||||
geom = QRect( x, y, w, h );
|
geom = QRect( x, y, w, h );
|
||||||
updateWorkareaDiffs();
|
updateWorkareaDiffs();
|
||||||
if( block_geometry_updates != 0 )
|
if( block_geometry_updates != 0 )
|
||||||
|
@ -1669,24 +1667,31 @@ void Client::setGeometry( int x, int y, int w, int h, ForceGeometry_t force )
|
||||||
pending_geometry_update = true;
|
pending_geometry_update = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
resizeDecoration( QSize( w, h ));
|
if( geom_before_block.size() != geom.size())
|
||||||
XMoveResizeWindow( display(), frameId(), x, y, w, h );
|
|
||||||
// resizeDecoration( QSize( w, h ));
|
|
||||||
if( !isShade())
|
|
||||||
{
|
{
|
||||||
QSize cs = clientSize();
|
resizeDecoration( QSize( w, h ));
|
||||||
XMoveResizeWindow( display(), wrapperId(), clientPos().x(), clientPos().y(),
|
XMoveResizeWindow( display(), frameId(), x, y, w, h );
|
||||||
cs.width(), cs.height());
|
if( !isShade())
|
||||||
XMoveResizeWindow( display(), window(), 0, 0, cs.width(), cs.height());
|
{
|
||||||
|
QSize cs = clientSize();
|
||||||
|
XMoveResizeWindow( display(), wrapperId(), clientPos().x(), clientPos().y(),
|
||||||
|
cs.width(), cs.height());
|
||||||
|
XMoveResizeWindow( display(), window(), 0, 0, cs.width(), cs.height());
|
||||||
|
}
|
||||||
|
if( shape())
|
||||||
|
updateShape();
|
||||||
}
|
}
|
||||||
if( shape())
|
else
|
||||||
updateShape();
|
XMoveWindow( display(), frameId(), x, y );
|
||||||
// SELI TODO won't this be too expensive?
|
// SELI TODO won't this be too expensive?
|
||||||
updateWorkareaDiffs();
|
updateWorkareaDiffs();
|
||||||
sendSyntheticConfigureNotify();
|
sendSyntheticConfigureNotify();
|
||||||
updateWindowRules();
|
updateWindowRules();
|
||||||
checkMaximizeGeometry();
|
checkMaximizeGeometry();
|
||||||
addDamageFull();
|
if( geom_before_block.size() != geom.size())
|
||||||
|
addDamageFull(); // damage window only if it actually was a resize
|
||||||
|
workspace()->addDamage( geom_before_block ); // TODO add damage only if not obscured
|
||||||
|
geom_before_block = geom;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::plainResize( int w, int h, ForceGeometry_t force )
|
void Client::plainResize( int w, int h, ForceGeometry_t force )
|
||||||
|
@ -1718,7 +1723,6 @@ void Client::plainResize( int w, int h, ForceGeometry_t force )
|
||||||
}
|
}
|
||||||
if( force == NormalGeometrySet && geom.size() == QSize( w, h ))
|
if( force == NormalGeometrySet && geom.size() == QSize( w, h ))
|
||||||
return;
|
return;
|
||||||
workspace()->addDamage( geometry()); // TODO cache the previous real geometry
|
|
||||||
geom.setSize( QSize( w, h ));
|
geom.setSize( QSize( w, h ));
|
||||||
updateWorkareaDiffs();
|
updateWorkareaDiffs();
|
||||||
if( block_geometry_updates != 0 )
|
if( block_geometry_updates != 0 )
|
||||||
|
@ -1742,8 +1746,9 @@ void Client::plainResize( int w, int h, ForceGeometry_t force )
|
||||||
sendSyntheticConfigureNotify();
|
sendSyntheticConfigureNotify();
|
||||||
updateWindowRules();
|
updateWindowRules();
|
||||||
checkMaximizeGeometry();
|
checkMaximizeGeometry();
|
||||||
// TODO add damage only in added area?
|
addDamageFull(); // TODO add damage only in added area?
|
||||||
addDamageFull();
|
workspace()->addDamage( geom_before_block ); // TODO add damage only if not obscured
|
||||||
|
geom_before_block = geom;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -1753,7 +1758,6 @@ void Client::move( int x, int y, ForceGeometry_t force )
|
||||||
{
|
{
|
||||||
if( force == NormalGeometrySet && geom.topLeft() == QPoint( x, y ))
|
if( force == NormalGeometrySet && geom.topLeft() == QPoint( x, y ))
|
||||||
return;
|
return;
|
||||||
workspace()->addDamage( geometry()); // TODO cache the previous real geometry
|
|
||||||
geom.moveTopLeft( QPoint( x, y ));
|
geom.moveTopLeft( QPoint( x, y ));
|
||||||
updateWorkareaDiffs();
|
updateWorkareaDiffs();
|
||||||
if( block_geometry_updates != 0 )
|
if( block_geometry_updates != 0 )
|
||||||
|
@ -1766,7 +1770,8 @@ void Client::move( int x, int y, ForceGeometry_t force )
|
||||||
updateWindowRules();
|
updateWindowRules();
|
||||||
checkMaximizeGeometry();
|
checkMaximizeGeometry();
|
||||||
// client itself is not damaged
|
// client itself is not damaged
|
||||||
workspace()->addDamage( geometry());
|
workspace()->addDamage( geom_before_block ); // TODO add damage only if not obscured
|
||||||
|
geom_before_block = geom;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::blockGeometryUpdates( bool block )
|
void Client::blockGeometryUpdates( bool block )
|
||||||
|
|
Loading…
Reference in a new issue