diff --git a/effects/desktopgrid/desktopgrid.cpp b/effects/desktopgrid/desktopgrid.cpp index df8b3ee652..886a709fd5 100644 --- a/effects/desktopgrid/desktopgrid.cpp +++ b/effects/desktopgrid/desktopgrid.cpp @@ -46,6 +46,7 @@ DesktopGridEffect::DesktopGridEffect() , timeline() , keyboardGrab( false ) , wasWindowMove( false ) + , wasDesktopMove( false ) , windowMove( NULL ) , windowMoveDiff() , gridSize() @@ -334,17 +335,41 @@ void DesktopGridEffect::windowInputMouseEvent( Window, QEvent* e ) effects->windowToDesktop( windowMove, d ); // Not true all desktop move } if( d != highlightedDesktop ) // Highlight desktop + { + if ( (me->buttons() & Qt::LeftButton) && !wasWindowMove ) + { + wasDesktopMove = true; + EffectWindowList windows = effects->stackingOrder(); + EffectWindowList stack; + foreach( EffectWindow* w, windows ) + { + if( w->isOnAllDesktops() ) + continue; + if( w->isOnDesktop( highlightedDesktop ) ) + effects->windowToDesktop( w, d ); + else if( w->isOnDesktop( d ) ) + stack << w; + } + foreach( EffectWindow* w, stack ) + effects->windowToDesktop( w, highlightedDesktop ); + } setHighlightedDesktop( d ); + } } if( e->type() == QEvent::MouseButtonPress ) { if( me->buttons() == Qt::LeftButton ) { - QRect rect; - EffectWindow* w = windowAt( me->pos()); - if( w != NULL && (w->isMovable() || w->isMovableAcrossScreens()) ) +// QRect rect; + bool isDesktop = (me->modifiers() & Qt::ControlModifier); + EffectWindow* w = isDesktop ? NULL : windowAt( me->pos()); + if ( w != NULL ) + isDesktop = w->isDesktop(); + if ( isDesktop ) + XDefineCursor( display(), input, QCursor( Qt::ClosedHandCursor ).handle() ); + else if( w != NULL && w->isMovable() || w->isMovableAcrossScreens() ) { // Prepare it for moving - XDefineCursor( display(), input, QCursor( Qt::SizeAllCursor ).handle() ); + XDefineCursor( display(), input, QCursor( Qt::ClosedHandCursor ).handle() ); windowMoveDiff = w->pos() - unscalePos( me->pos(), NULL ); windowMove = w; effects->setElevatedWindow( windowMove, true ); @@ -365,7 +390,7 @@ void DesktopGridEffect::windowInputMouseEvent( Window, QEvent* e ) } if( e->type() == QEvent::MouseButtonRelease && me->button() == Qt::LeftButton ) { - if( !wasWindowMove ) + if( !wasWindowMove && !wasDesktopMove ) { setCurrentDesktop( highlightedDesktop ); setActive( false ); @@ -378,7 +403,10 @@ void DesktopGridEffect::windowInputMouseEvent( Window, QEvent* e ) windowMove = NULL; XDefineCursor( display(), input, QCursor( Qt::PointingHandCursor ).handle() ); } + else if ( wasDesktopMove ) + XDefineCursor( display(), input, QCursor( Qt::PointingHandCursor ).handle() ); wasWindowMove = false; + wasDesktopMove = false; } } diff --git a/effects/desktopgrid/desktopgrid.h b/effects/desktopgrid/desktopgrid.h index 106ca40057..0d7cc328fc 100644 --- a/effects/desktopgrid/desktopgrid.h +++ b/effects/desktopgrid/desktopgrid.h @@ -83,7 +83,7 @@ class DesktopGridEffect int highlightedDesktop; Window input; bool keyboardGrab; - bool wasWindowMove; + bool wasWindowMove, wasDesktopMove; EffectWindow* windowMove; QPoint windowMoveDiff;