From a8b5c7365c47eb4686b0313b8da4b559882b4255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Fri, 19 Sep 2003 11:13:04 +0000 Subject: [PATCH] Keep workarea edge distance when turning on/off decoration. Reduce the maximum distance for keeping it at the edge to 1/10 of workarea size. Update edge distance when changing geometry. svn path=/trunk/kdebase/kwin/; revision=252349 --- client.cpp | 8 ++++++++ geometry.cpp | 12 ++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/client.cpp b/client.cpp index 8229663325..2da33380e0 100644 --- a/client.cpp +++ b/client.cpp @@ -267,7 +267,11 @@ void Client::updateDecoration( bool check_workspace_pos, bool force ) XReparentWindow( qt_xdisplay(), decoration->widget()->winId(), frameId(), 0, 0 ); decoration->widget()->lower(); decoration->borders( border_left, border_right, border_top, border_bottom ); + int save_workarea_diff_x = workarea_diff_x; + int save_workarea_diff_y = workarea_diff_y; setGeometry( QRect( calculateGravitation( false ), sizeForClientSize( clientSize()))); + workarea_diff_x = save_workarea_diff_x; + workarea_diff_y = save_workarea_diff_y; decoration->widget()->show(); } else @@ -287,7 +291,11 @@ void Client::destroyDecoration() border_left = border_right = border_top = border_bottom = 0; decoration = NULL; setMask( QRegion()); // reset shape mask + int save_workarea_diff_x = workarea_diff_x; + int save_workarea_diff_y = workarea_diff_y; setGeometry( QRect( calculateGravitation( true ), clientSize()), true ); + workarea_diff_x = save_workarea_diff_x; + workarea_diff_y = save_workarea_diff_y; } } diff --git a/geometry.cpp b/geometry.cpp index 82924a5f5e..82a5ea7daf 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -432,11 +432,12 @@ int Client::computeWorkareaDiff( int left, int right, int a_left, int a_right ) return INT_MIN; else // fully inside workarea in this direction direction { - int a_third = ( a_right - a_left ) / 3; + // max distance from edge where it's still considered to be close and is kept at that distance + int max_diff = ( a_right - a_left ) / 10; if( left_diff < right_diff ) - return left_diff < a_third ? -left_diff - 1 : INT_MAX; + return left_diff < max_diff ? -left_diff - 1 : INT_MAX; else if( left_diff > right_diff ) - return right_diff < a_third ? right_diff + 1 : INT_MAX; + return right_diff < max_diff ? right_diff + 1 : INT_MAX; return INT_MAX; // not close to workarea edge } } @@ -520,7 +521,7 @@ void Client::checkWorkspacePosition() } if( final_geom != geometry() ) setGeometry( final_geom ); - updateWorkareaDiffs( area ); +// updateWorkareaDiffs( area ); done already by setGeometry() } // Try to be smart about keeping the clients visible. @@ -807,6 +808,7 @@ void Client::setGeometry( int x, int y, int w, int h, bool force ) client_size = QSize( w - border_left - border_right, h - border_top - border_bottom ); else client_size = QSize( w - border_left - border_right, client_size.height()); + updateWorkareaDiffs(); if( block_geometry == 0 ) { XMoveResizeWindow( qt_xdisplay(), frameId(), x, y, w, h ); @@ -837,6 +839,7 @@ void Client::resize( int w, int h, bool force ) client_size = QSize( w - border_left - border_right, h - border_top - border_bottom ); else client_size = QSize( w - border_left - border_right, client_size.height()); + updateWorkareaDiffs(); if( block_geometry == 0 ) { // FRAME tady poradi tak, at neni flicker @@ -869,6 +872,7 @@ void Client::move( int x, int y, bool force ) if( !force && frame_geometry.topLeft() == QPoint( x, y )) return; frame_geometry.moveTopLeft( QPoint( x, y )); + updateWorkareaDiffs(); if( block_geometry == 0 ) { XMoveWindow( qt_xdisplay(), frameId(), x, y );