From e0a4d8e5e94a4044da39f9969d78c85eb08227b3 Mon Sep 17 00:00:00 2001 From: Lucas Murray Date: Sat, 13 Dec 2008 09:20:02 +0000 Subject: [PATCH] Use the correct desktop layout when navigating the desktop grid with the cursor keys. BUG: 176498 svn path=/trunk/KDE/kdebase/workspace/; revision=896318 --- effects/desktopgrid.cpp | 124 ++++++++++++++++++++++++++++++++++++++-- effects/desktopgrid.h | 4 ++ 2 files changed, 124 insertions(+), 4 deletions(-) diff --git a/effects/desktopgrid.cpp b/effects/desktopgrid.cpp index 115aee9fdd..b038b6ee01 100644 --- a/effects/desktopgrid.cpp +++ b/effects/desktopgrid.cpp @@ -374,16 +374,16 @@ void DesktopGridEffect::grabbedKeyboardEvent( QKeyEvent* e ) switch( e->key()) { // Wrap only on autorepeat case Qt::Key_Left: - setHighlightedDesktop( effects->desktopToLeft( highlightedDesktop, !e->isAutoRepeat())); + setHighlightedDesktop( desktopToLeft( highlightedDesktop, !e->isAutoRepeat())); break; case Qt::Key_Right: - setHighlightedDesktop( effects->desktopToRight( highlightedDesktop, !e->isAutoRepeat())); + setHighlightedDesktop( desktopToRight( highlightedDesktop, !e->isAutoRepeat())); break; case Qt::Key_Up: - setHighlightedDesktop( effects->desktopUp( highlightedDesktop, !e->isAutoRepeat())); + setHighlightedDesktop( desktopUp( highlightedDesktop, !e->isAutoRepeat())); break; case Qt::Key_Down: - setHighlightedDesktop( effects->desktopDown( highlightedDesktop, !e->isAutoRepeat())); + setHighlightedDesktop( desktopDown( highlightedDesktop, !e->isAutoRepeat())); break; case Qt::Key_Escape: setActive( false ); @@ -577,6 +577,122 @@ void DesktopGridEffect::setHighlightedDesktop( int d ) effects->addRepaintFull(); } +int DesktopGridEffect::desktopToRight( int desktop, bool wrap ) const + { // Copied from Workspace::desktopToRight() + int dt = desktop - 1; + if( orientation == Qt::Vertical ) + { + dt += gridSize.height(); + if( dt >= effects->numberOfDesktops() ) + { + if( wrap ) + dt -= effects->numberOfDesktops(); + else + return desktop; + } + } + else + { + int d = ( dt % gridSize.width() ) + 1; + if( d >= gridSize.width() ) + { + if( wrap ) + d -= gridSize.width(); + else + return desktop; + } + dt = dt - ( dt % gridSize.width() ) + d; + } + return dt + 1; + } + +int DesktopGridEffect::desktopToLeft( int desktop, bool wrap ) const + { // Copied from Workspace::desktopToLeft() + int dt = desktop - 1; + if( orientation == Qt::Vertical ) + { + dt -= gridSize.height(); + if( dt < 0 ) + { + if( wrap ) + dt += effects->numberOfDesktops(); + else + return desktop; + } + } + else + { + int d = ( dt % gridSize.width() ) - 1; + if( d < 0 ) + { + if( wrap ) + d += gridSize.width(); + else + return desktop; + } + dt = dt - ( dt % gridSize.width() ) + d; + } + return dt + 1; + } + +int DesktopGridEffect::desktopUp( int desktop, bool wrap ) const + { // Copied from Workspace::desktopUp() + int dt = desktop - 1; + if( orientation == Qt::Horizontal ) + { + dt -= gridSize.width(); + if( dt < 0 ) + { + if( wrap ) + dt += effects->numberOfDesktops(); + else + return desktop; + } + } + else + { + int d = ( dt % gridSize.height() ) - 1; + if( d < 0 ) + { + if( wrap ) + d += gridSize.height(); + else + return desktop; + } + dt = dt - ( dt % gridSize.height() ) + d; + } + return dt + 1; + } + +int DesktopGridEffect::desktopDown( int desktop, bool wrap ) const + { // Copied from Workspace::desktopDown() + int dt = desktop - 1; + if( orientation == Qt::Horizontal ) + { + dt += gridSize.width(); + if( dt >= effects->numberOfDesktops() ) + { + if( wrap ) + dt -= effects->numberOfDesktops(); + else + return desktop; + } + } + else + { + int d = ( dt % gridSize.height() ) + 1; + if( d >= gridSize.height() ) + { + if( wrap ) + d -= gridSize.height(); + else + return desktop; + } + dt = dt - ( dt % gridSize.height() ) + d; + } + return dt + 1; + } + //----------------------------------------------------------------------------- // Activation diff --git a/effects/desktopgrid.h b/effects/desktopgrid.h index 10a6645569..0e68115491 100644 --- a/effects/desktopgrid.h +++ b/effects/desktopgrid.h @@ -58,6 +58,10 @@ class DesktopGridEffect EffectWindow* windowAt( QPoint pos ) const; void setCurrentDesktop( int desktop ); void setHighlightedDesktop( int desktop ); + int desktopToRight( int desktop, bool wrap = true ) const; + int desktopToLeft( int desktop, bool wrap = true ) const; + int desktopUp( int desktop, bool wrap = true ) const; + int desktopDown( int desktop, bool wrap = true ) const; void setActive( bool active ); void setup(); void finish();