Commit dd28e15a authored by Lucas Murray's avatar Lucas Murray
Browse files

Allow desktop effects to access the new DesktopLayout class. Replaced

all code that used calcDesktopLayout() so the function could be removed.
Minor changes to the DesktopLayout class itself.

svn path=/trunk/KDE/kdebase/workspace/; revision=925930
parent 4681129e
......@@ -59,20 +59,21 @@ void DesktopLayout::setNETDesktopLayout( Qt::Orientation orientation, int width,
height = ( m_count + width - 1 ) / width;
// Set private variables
m_gridSize = QSize( width, height );
delete[] m_grid;
m_grid = new int[width * height];
m_gridSize = QSize( width, height );
int size = width * height;
m_grid = new int[size];
// Populate grid
int desktop = 1;
if( orientation == Qt::Horizontal )
for( int y = 0; y < height; y++ )
for( int x = 0; x < width; x++ )
m_grid[y * height + x] = (desktop <= m_count ? desktop++ : 0);
m_grid[y * width + x] = (desktop <= m_count ? desktop++ : 0);
else
for( int x = 0; x < width; x++ )
for( int y = 0; y < height; y++ )
m_grid[y * height + x] = (desktop <= m_count ? desktop++ : 0);
m_grid[y * width + x] = (desktop <= m_count ? desktop++ : 0);
}
QPoint DesktopLayout::desktopGridCoords( int id ) const
......
......@@ -46,6 +46,10 @@ class DesktopLayout
*/
void setNumberOfDesktops( int count );
/**
* @returns The size of desktop layout in grid units.
*/
QSize gridSize() const;
/**
* @returns The width of desktop layout in grid units.
*/
......@@ -146,6 +150,11 @@ inline int DesktopLayout::numberOfDesktops() const
return m_count;
}
inline QSize DesktopLayout::gridSize() const
{
return m_gridSize;
}
inline int DesktopLayout::gridWidth() const
{
return m_gridSize.width();
......@@ -180,7 +189,7 @@ inline void DesktopLayout::setCurrentDesktop( int current )
inline int DesktopLayout::desktopAtCoords( QPoint coords ) const
{
return m_grid[coords.y() * m_gridSize.height() + coords.x()];
return m_grid[coords.y() * m_gridSize.width() + coords.x()];
}
inline bool DesktopLayout::isDynamic() const
......
......@@ -446,39 +446,89 @@ void EffectsHandlerImpl::setCurrentDesktop( int desktop )
Workspace::self()->setCurrentDesktop( desktop );
}
QString EffectsHandlerImpl::desktopName( int desktop ) const
QSize EffectsHandlerImpl::desktopGridSize() const
{
return Workspace::self()->desktopName( desktop );
return Workspace::self()->getDesktopLayout()->gridSize();
}
void EffectsHandlerImpl::calcDesktopLayout(int* x, int* y, Qt::Orientation* orientation) const
int EffectsHandlerImpl::desktopGridWidth() const
{
Workspace::self()->calcDesktopLayout( x, y, orientation );
return Workspace::self()->getDesktopLayout()->gridWidth();
}
bool EffectsHandlerImpl::optionRollOverDesktops() const
int EffectsHandlerImpl::desktopGridHeight() const
{
return options->rollOverDesktops;
return Workspace::self()->getDesktopLayout()->gridHeight();
}
int EffectsHandlerImpl::desktopToLeft( int desktop, bool wrap ) const
int EffectsHandlerImpl::workspaceWidth() const
{
return Workspace::self()->getDesktopLayout()->width();
}
int EffectsHandlerImpl::workspaceHeight() const
{
return Workspace::self()->getDesktopLayout()->height();
}
int EffectsHandlerImpl::desktopAtCoords( QPoint coords ) const
{
return Workspace::self()->getDesktopLayout()->desktopAtCoords( coords );
}
QPoint EffectsHandlerImpl::desktopGridCoords( int id ) const
{
return Workspace::self()->getDesktopLayout()->desktopGridCoords( id );
}
QPoint EffectsHandlerImpl::desktopCoords( int id ) const
{
return Workspace::self()->getDesktopLayout()->desktopCoords( id );
}
int EffectsHandlerImpl::desktopAbove( int desktop, bool wrap ) const
{
return Workspace::self()->desktopToLeft( desktop, wrap );
return Workspace::self()->getDesktopLayout()->desktopAbove( desktop, wrap );
}
int EffectsHandlerImpl::desktopToRight( int desktop, bool wrap ) const
{
return Workspace::self()->desktopToRight( desktop, wrap );
return Workspace::self()->getDesktopLayout()->desktopToRight( desktop, wrap );
}
int EffectsHandlerImpl::desktopUp( int desktop, bool wrap ) const
int EffectsHandlerImpl::desktopBelow( int desktop, bool wrap ) const
{
return Workspace::self()->desktopUp( desktop, wrap );
return Workspace::self()->getDesktopLayout()->desktopBelow( desktop, wrap );
}
int EffectsHandlerImpl::desktopDown( int desktop, bool wrap ) const
int EffectsHandlerImpl::desktopToLeft( int desktop, bool wrap ) const
{
return Workspace::self()->getDesktopLayout()->desktopToLeft( desktop, wrap );
}
bool EffectsHandlerImpl::desktopLayoutIsDynamic() const
{
return Workspace::self()->getDesktopLayout()->isDynamic();
}
int EffectsHandlerImpl::addDesktop( QPoint coords )
{
return Workspace::self()->getDesktopLayout()->addDesktop( coords );
}
void EffectsHandlerImpl::deleteDesktop( int id )
{
return Workspace::self()->desktopDown( desktop, wrap );
Workspace::self()->getDesktopLayout()->deleteDesktop( id );
}
QString EffectsHandlerImpl::desktopName( int desktop ) const
{
return Workspace::self()->desktopName( desktop );
}
bool EffectsHandlerImpl::optionRollOverDesktops() const
{
return options->rollOverDesktops;
}
double EffectsHandlerImpl::animationTimeFactor() const
......
......@@ -23,6 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "kwineffects.h"
#include "desktoplayout.h"
#include "scene.h"
#include <QStack>
......@@ -59,7 +60,24 @@ class EffectsHandlerImpl : public EffectsHandler
virtual int currentDesktop() const;
virtual int numberOfDesktops() const;
virtual void setCurrentDesktop( int desktop );
virtual QSize desktopGridSize() const;
virtual int desktopGridWidth() const;
virtual int desktopGridHeight() const;
virtual int workspaceWidth() const;
virtual int workspaceHeight() const;
virtual int desktopAtCoords( QPoint coords ) const;
virtual QPoint desktopGridCoords( int id ) const;
virtual QPoint desktopCoords( int id ) const;
virtual int desktopAbove( int desktop = 0, bool wrap = true ) const;
virtual int desktopToRight( int desktop = 0, bool wrap = true ) const;
virtual int desktopBelow( int desktop = 0, bool wrap = true ) const;
virtual int desktopToLeft( int desktop = 0, bool wrap = true ) const;
virtual bool desktopLayoutIsDynamic() const;
virtual int addDesktop( QPoint coords );
virtual void deleteDesktop( int id );
virtual QString desktopName( int desktop ) const;
virtual bool optionRollOverDesktops() const;
virtual int displayWidth() const;
virtual int displayHeight() const;
virtual QPoint cursorPos() const;
......@@ -98,12 +116,6 @@ class EffectsHandlerImpl : public EffectsHandler
virtual QRect clientArea( clientAreaOption, int screen, int desktop ) const;
virtual QRect clientArea( clientAreaOption, const EffectWindow* c ) const;
virtual QRect clientArea( clientAreaOption, const QPoint& p, int desktop ) const;
virtual void calcDesktopLayout(int* x, int* y, Qt::Orientation* orientation) const;
virtual bool optionRollOverDesktops() const;
virtual int desktopToLeft( int desktop, bool wrap ) const;
virtual int desktopToRight( int desktop, bool wrap ) const;
virtual int desktopUp( int desktop, bool wrap ) const;
virtual int desktopDown( int desktop, bool wrap ) const;
virtual double animationTimeFactor() const;
virtual WindowQuadType newWindowQuadType();
......
......@@ -148,7 +148,7 @@ void CubeSlideEffect::paintSlideCube(int mask, QRegion region, ScreenPaintData&
case Upwards:
firstFaceRot.axis = RotationData::XAxis;
secondFaceRot.axis = RotationData::XAxis;
secondDesktop = effects->desktopUp( front_desktop, true);
secondDesktop = effects->desktopAbove( front_desktop, true);
firstFaceRot.angle = -90.0f*timeLine.value();
secondFaceRot.angle = 90.0f*(1.0f - timeLine.value());
point = rect.height()/2*tan(45.0f*M_PI/180.0f);
......@@ -156,7 +156,7 @@ void CubeSlideEffect::paintSlideCube(int mask, QRegion region, ScreenPaintData&
case Downwards:
firstFaceRot.axis = RotationData::XAxis;
secondFaceRot.axis = RotationData::XAxis;
secondDesktop = effects->desktopDown( front_desktop, true );
secondDesktop = effects->desktopBelow( front_desktop, true );
firstFaceRot.angle = 90.0f*timeLine.value();
secondFaceRot.angle = -90.0f*(1.0f - timeLine.value());
point = rect.height()/2*tan(45.0f*M_PI/180.0f);
......@@ -233,10 +233,10 @@ void CubeSlideEffect::postPaintScreen()
front_desktop = effects->desktopToRight( front_desktop, true );
break;
case Upwards:
front_desktop = effects->desktopUp( front_desktop, true );
front_desktop = effects->desktopAbove( front_desktop, true );
break;
case Downwards:
front_desktop = effects->desktopDown( front_desktop, true );
front_desktop = effects->desktopBelow( front_desktop, true );
break;
}
timeLine.setProgress( 0.0 );
......@@ -265,47 +265,43 @@ void CubeSlideEffect::desktopChanged( int old )
slideRotations.enqueue( direction );
}
// calculate distance in respect to pager
int x, y;
Qt::Orientation orientation;
effects->calcDesktopLayout( &x, &y, &orientation );
int x_distance = (( effects->currentDesktop() - 1 ) % x ) - (( old - 1 ) % x );
if( qAbs( x_distance ) > x/2 )
QPoint diff = effects->desktopGridCoords( effects->currentDesktop() ) - effects->desktopGridCoords( old );
if( qAbs( diff.x() ) > effects->desktopGridWidth()/2 )
{
int sign = -1 * (x_distance/qAbs( x_distance ));
x_distance = sign * ( x - qAbs( x_distance ));
int sign = -1 * (diff.x()/qAbs( diff.x() ));
diff.setX( sign * ( effects->desktopGridWidth() - qAbs( diff.x() )));
}
if( x_distance > 0 )
if( diff.x() > 0 )
{
for( int i=0; i<x_distance; i++ )
for( int i=0; i<diff.x(); i++ )
{
slideRotations.enqueue( Right );
}
}
else if( x_distance < 0 )
else if( diff.x() < 0 )
{
x_distance *= -1;
for( int i=0; i<x_distance; i++ )
diff.setX( -diff.x() );
for( int i=0; i<diff.x(); i++ )
{
slideRotations.enqueue( Left );
}
}
int y_distance = (( effects->currentDesktop() -1 ) / x ) - (( old - 1 ) / x );
if( qAbs( y_distance ) > y/2 )
if( qAbs( diff.y() ) > effects->desktopGridHeight()/2 )
{
int sign = -1 * (y_distance/qAbs( y_distance ));
y_distance = sign * ( y - qAbs( y_distance ));
int sign = -1 * (diff.y()/qAbs( diff.y() ));
diff.setY( sign * ( effects->desktopGridHeight() - qAbs( diff.y() )));
}
if( y_distance > 0 )
if( diff.y() > 0 )
{
for( int i=0; i<y_distance; i++ )
for( int i=0; i<diff.y(); i++ )
{
slideRotations.enqueue( Downwards );
}
}
if( y_distance < 0 )
if( diff.y() < 0 )
{
y_distance *= -1;
for( int i=0; i<y_distance; i++ )
diff.setY( -diff.y() );
for( int i=0; i<diff.y(); i++ )
{
slideRotations.enqueue( Upwards );
}
......
......@@ -37,6 +37,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
namespace KWin
{
// WARNING, TODO: This effect relies on the desktop layout being EWMH-compliant.
KWIN_EFFECT( desktopgrid, DesktopGridEffect )
DesktopGridEffect::DesktopGridEffect()
......@@ -755,7 +757,8 @@ void DesktopGridEffect::setup()
{
default:
case LayoutPager:
effects->calcDesktopLayout( &gridSize.rwidth(), &gridSize.rheight(), &orientation );
orientation = Qt::Horizontal;
gridSize = effects->desktopGridSize();
break;
case LayoutAutomatic:
y = sqrt( numDesktops ) + 0.5;
......@@ -767,7 +770,7 @@ void DesktopGridEffect::setup()
gridSize.setHeight( y );
break;
case LayoutCustom:
effects->calcDesktopLayout( &gridSize.rwidth(), &gridSize.rheight(), &orientation );
orientation = Qt::Horizontal;
gridSize.setWidth( ceil( effects->numberOfDesktops() / double( customLayoutRows )));
gridSize.setHeight( customLayoutRows );
break;
......
......@@ -162,26 +162,8 @@ void HighlightWindowEffect::propertyNotify( EffectWindow* w, long a )
thumbRect = m_highlightedWindow->geometry();
// Determine position of desktop relative to the current one
QSize grid;
Qt::Orientation orientation;
effects->calcDesktopLayout( &grid.rwidth(), &grid.rheight(), &orientation );
QPoint currentDesktop;
QPoint targetDesktop;
if( orientation == Qt::Horizontal )
{
currentDesktop.setX(( effects->currentDesktop() - 1 ) % grid.width() + 1 );
currentDesktop.setY(( effects->currentDesktop() - 1 ) / grid.width() + 1 );
targetDesktop.setX(( m_highlightedWindow->desktop() - 1 ) % grid.width() + 1 );
targetDesktop.setY(( m_highlightedWindow->desktop() - 1 ) / grid.width() + 1 );
}
else
{
currentDesktop.setX(( effects->currentDesktop() - 1 ) / grid.height() + 1 );
currentDesktop.setY(( effects->currentDesktop() - 1 ) % grid.height() + 1 );
targetDesktop.setX(( m_highlightedWindow->desktop() - 1 ) / grid.height() + 1 );
targetDesktop.setY(( m_highlightedWindow->desktop() - 1 ) % grid.height() + 1 );
}
QPoint direction = targetDesktop - currentDesktop;
QPoint direction = effects->desktopGridCoords( m_highlightedWindow->desktop() ) -
effects->desktopGridCoords( effects->currentDesktop() );
// Draw a line from the center of the current desktop to the center of the target desktop.
QPointF desktopLine( 0, 0, direction.x() * screenArea.width(), direction.y() * screenArea.height() );
......
......@@ -92,17 +92,14 @@ void SlideEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
of it, the destination is computed from the current desktop. Positions of desktops
are done using their topleft corner.
*/
QPoint destPos = desktopRect( effects->currentDesktop(), false ).topLeft();
QPoint destPos = desktopRect( effects->currentDesktop() ).topLeft();
QPoint diffPos = destPos - slide_start_pos;
int w = 0;
int h = 0;
if( effects->optionRollOverDesktops())
{
int x, y;
Qt::Orientation orientation;
effects->calcDesktopLayout( &x, &y, &orientation );
w = x * displayWidth();
h = y * displayHeight();
w = effects->workspaceWidth();
h = effects->workspaceHeight();
// wrap around if shorter
if( diffPos.x() > 0 && diffPos.x() > w / 2 )
diffPos.setX( diffPos.x() - w );
......@@ -128,7 +125,7 @@ void SlideEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
desktop <= effects->numberOfDesktops();
++desktop )
{
QRect rect = desktopRect( desktop, false );
QRect rect = desktopRect( desktop );
if( currentRegion.contains( rect )) // part of the desktop needs painting
{
painting_desktop = desktop;
......@@ -176,27 +173,10 @@ void SlideEffect::postPaintScreen()
}
// Gives a position of the given desktop when all desktops are arranged in a grid
QRect SlideEffect::desktopRect( int desktop, bool scaled ) const
QRect SlideEffect::desktopRect( int desktop ) const
{
int x, y;
Qt::Orientation orientation;
effects->calcDesktopLayout( &x, &y, &orientation );
--desktop; // make it start with 0
QRect rect;
if( orientation == Qt::Horizontal )
rect = QRect(( desktop % x ) * displayWidth(), ( desktop / x ) * displayHeight(),
displayWidth(), displayHeight());
else
rect = QRect(( desktop / y ) * displayWidth(), ( desktop % y ) * displayHeight(),
displayWidth(), displayHeight());
if( !scaled )
return rect;
QRect current = desktopRect( effects->currentDesktop(), false );
double progress = mTimeLine.value();
rect = QRect( qRound( interpolate( rect.x() - current.x(), rect.x() / double( x ), progress )),
qRound( interpolate( rect.y() - current.y(), rect.y() / double( y ), progress )),
qRound( interpolate( rect.width(), displayWidth() / double( x ), progress )),
qRound( interpolate( rect.height(), displayHeight() / double( y ), progress )));
QRect rect( 0, 0, displayWidth(), displayHeight() );
rect.translate( effects->desktopCoords( desktop ));
return rect;
}
......@@ -207,16 +187,13 @@ void SlideEffect::desktopChanged( int old )
if( slide ) // old slide still in progress
{
QPoint diffPos = desktopRect( old, false ).topLeft() - slide_start_pos;
QPoint diffPos = desktopRect( old ).topLeft() - slide_start_pos;
int w = 0;
int h = 0;
if( effects->optionRollOverDesktops())
{
int x, y;
Qt::Orientation orientation;
effects->calcDesktopLayout( &x, &y, &orientation );
w = x * displayWidth();
h = y * displayHeight();
w = effects->workspaceWidth();
h = effects->workspaceHeight();
// wrap around if shorter
if( diffPos.x() > 0 && diffPos.x() > w / 2 )
diffPos.setX( diffPos.x() - w );
......@@ -236,7 +213,7 @@ void SlideEffect::desktopChanged( int old )
currentRegion |= ( currentRegion & QRect( w, 0, w, h )).translated( -w, 0 );
currentRegion |= ( currentRegion & QRect( 0, h, w, h )).translated( 0, -h );
}
QRect rect = desktopRect( effects->currentDesktop(), false );
QRect rect = desktopRect( effects->currentDesktop() );
if( currentRegion.contains( rect ))
{ // current position is in new current desktop (e.g. quickly changing back),
// don't do full progress
......@@ -265,7 +242,7 @@ void SlideEffect::desktopChanged( int old )
if( effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this )
return;
mTimeLine.setProgress(0);
slide_start_pos = desktopRect( old, false ).topLeft();
slide_start_pos = desktopRect( old ).topLeft();
slide = true;
effects->setActiveFullScreenEffect( this );
}
......
......@@ -42,7 +42,7 @@ class SlideEffect
virtual void paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data );
virtual void desktopChanged( int old );
private:
QRect desktopRect( int desktop, bool scaled ) const;
QRect desktopRect( int desktop ) const;
TimeLine mTimeLine;
int painting_desktop;
bool slide;
......
......@@ -164,7 +164,7 @@ X-KDE-Library=kwin4_effect_cooleffect
#define KWIN_EFFECT_API_MAKE_VERSION( major, minor ) (( major ) << 8 | ( minor ))
#define KWIN_EFFECT_API_VERSION_MAJOR 0
#define KWIN_EFFECT_API_VERSION_MINOR 60
#define KWIN_EFFECT_API_VERSION_MINOR 61
#define KWIN_EFFECT_API_VERSION KWIN_EFFECT_API_MAKE_VERSION( \
KWIN_EFFECT_API_VERSION_MAJOR, KWIN_EFFECT_API_VERSION_MINOR )
......@@ -547,23 +547,96 @@ class KWIN_EXPORT EffectsHandler
virtual EffectWindow* activeWindow() const = 0 ;
virtual void moveWindow( EffectWindow* w, const QPoint& pos ) = 0;
virtual void windowToDesktop( EffectWindow* w, int desktop ) = 0;
//
// Desktops
/**
* @returns The ID of the current desktop.
*/
virtual int currentDesktop() const = 0;
/**
* @returns Total number of desktops currently in existance.
*/
virtual int numberOfDesktops() const = 0;
/**
* Set the current desktop to @a desktop.
*/
virtual void setCurrentDesktop( int desktop ) = 0;
/**
* @returns The size of desktop layout in grid units.
*/
virtual QSize desktopGridSize() const = 0;
/**
* @returns The width of desktop layout in grid units.
*/
virtual int desktopGridWidth() const = 0;
/**
* @returns The height of desktop layout in grid units.
*/
virtual int desktopGridHeight() const = 0;
/**
* @returns The width of desktop layout in pixels.
*/
virtual int workspaceWidth() const = 0;
/**
* @returns The height of desktop layout in pixels.
*/
virtual int workspaceHeight() const = 0;
/**
* @returns The ID of the desktop at the point @a coords or 0 if no desktop exists at that
* point. @a coords is to be in grid units.
*/
virtual int desktopAtCoords( QPoint coords ) const = 0;
/**
* @returns The coords of desktop @a id in grid units.
*/
virtual QPoint desktopGridCoords( int id ) const = 0;
/**
* @returns The coords of the top-left corner of desktop @a id in pixels.
*/
virtual QPoint desktopCoords( int id ) const = 0;
/**
* @returns The ID of the desktop above desktop @a id. Wraps around to the bottom of
* the layout if @a wrap is set. If @a id is not set use the current one.
*/
virtual int desktopAbove( int desktop = 0, bool wrap = true ) const = 0;
/**
* @returns The ID of the desktop to the right of desktop @a id. Wraps around to the
* left of the layout if @a wrap is set. If @a id is not set use the current one.
*/
virtual int desktopToRight( int desktop = 0, bool wrap = true ) const = 0;
/**
* @returns The ID of the desktop below desktop @a id. Wraps around to the top of the
* layout if @a wrap is set. If @a id is not set use the current one.
*/
virtual int desktopBelow( int desktop = 0, bool wrap = true ) const = 0;
/**
* @returns The ID of the desktop to the left of desktop @a id. Wraps around to the
* right of the layout if @a wrap is set. If @a id is not set use the current one.
*/
virtual int desktopToLeft( int desktop = 0, bool wrap = true ) const = 0;
/**
* @returns Whether or not the desktop layout is allowed to be modified by the user.
*/
virtual bool desktopLayoutIsDynamic() const = 0;
/**
* Create new desktop at the point @a coords
* @returns The ID of the created desktop
*/
virtual int addDesktop( QPoint coords ) = 0;
/**
* Deletes the desktop with the ID @a id. All desktops with an ID greater than the one that
* was deleted will have their IDs' decremented.
*/
virtual void deleteDesktop( int id ) = 0;
virtual QString desktopName( int desktop ) const = 0;
virtual bool optionRollOverDesktops() const = 0;
virtual int activeScreen() const = 0; // Xinerama
virtual int numScreens() const = 0; // Xinerama
virtual int screenNumber( const QPoint& pos ) const = 0; // Xinerama
virtual QRect clientArea( clientAreaOption, int screen, int desktop ) const = 0;
virtual QRect clientArea( clientAreaOption, const EffectWindow* c ) const = 0;
virtual QRect clientArea( clientAreaOption, const QPoint& p, int desktop ) const = 0;
virtual void calcDesktopLayout(int* x, int* y, Qt::Orientation* orientation) const = 0;
virtual bool optionRollOverDesktops() const = 0;
virtual int desktopToLeft( int desktop, bool wrap ) const = 0;
virtual int desktopToRight( int desktop, bool wrap ) const = 0;
virtual int desktopUp( int desktop, bool wrap ) const = 0;
virtual int desktopDown( int desktop, bool wrap ) const = 0;
/**
* Factor by which animation speed in the effect should be modified (multiplied).
* If configurable in the effect itself, the option should have also 'default'
......
......@@ -124,7 +124,6 @@ Workspace::Workspace( bool restore )
, global_shortcuts_disabled_for_client( false )
, workspaceInit( true )
, startup( 0 )
, layoutOrientation( Qt::Vertical )
, managing_topmenus( false )
, topmenu_selection( NULL )
, topmenu_watcher( NULL )
......@@ -1607,32 +1606,12 @@ void Workspace::updateDesktopLayout()
int height = rootInfo->desktopLayoutColumnsRows().height();
if( width == 0 && height == 0 ) // Not given, set default layout
height = 2;
layoutOrientation = rootInfo->desktopLayoutOrientation() == NET::OrientationHorizontal ?
Qt::Horizontal : Qt::Vertical;
desktopLayout.setNETDesktopLayout(
layoutOrientation, width, height,
0 //rootInfo->desktopLayoutCorner() // Not really worth implementing right now.