diff --git a/dbusinterface.cpp b/dbusinterface.cpp --- a/dbusinterface.cpp +++ b/dbusinterface.cpp @@ -488,7 +488,7 @@ void VirtualDesktopManagerDBusInterface::createDesktop(uint position, const QString &name) { - m_manager->createVirtualDesktop(position + 1, name); + m_manager->createVirtualDesktop(position, name); } void VirtualDesktopManagerDBusInterface::setDesktopName(const QString &id, const QString &name) diff --git a/virtualdesktops.h b/virtualdesktops.h --- a/virtualdesktops.h +++ b/virtualdesktops.h @@ -291,13 +291,11 @@ /** * Create a new virtual desktop at the requested position. * The difference with setCount is that setCount always adds new desktops at the end of the chain. The Id is automatically generated. - * @param x11DesktopNumber number for the desktop. The desktop created will have an - * x11DesktopNumber guaranteed to be between 1 and numberOfDesktops(). - * Existing desktops will eventually have their x11DesktopNumber increased. + * @param position The position of the desktop. It should be in range [0, count]. * @param name The name for the new desktop, if empty the default name will be used. * @returns the new VirtualDesktop, nullptr if we reached the maximum number of desktops */ - VirtualDesktop *createVirtualDesktop(uint x11DesktopNumber, const QString &name = QString()); + VirtualDesktop *createVirtualDesktop(uint position, const QString &name = QString()); /** * Remove the virtual desktop identified by id, if it exists diff --git a/virtualdesktops.cpp b/virtualdesktops.cpp --- a/virtualdesktops.cpp +++ b/virtualdesktops.cpp @@ -445,16 +445,17 @@ return nullptr; } -VirtualDesktop *VirtualDesktopManager::createVirtualDesktop(uint number, const QString &name) +VirtualDesktop *VirtualDesktopManager::createVirtualDesktop(uint position, const QString &name) { //too many, can't insert new ones if ((uint)m_desktops.count() == VirtualDesktopManager::maximum()) { return nullptr; } - const uint actualNumber = qBound(0, number, VirtualDesktopManager::maximum()); + position = qBound(0u, position, static_cast(m_desktops.count())); + auto *vd = new VirtualDesktop(this); - vd->setX11DesktopNumber(actualNumber); + vd->setX11DesktopNumber(position + 1); //TODO: depend on Qt 5.11, use toString(QUuid::WithoutBraces) vd->setId(QUuid::createUuid().toString().toUtf8()); vd->setName(name); @@ -471,15 +472,16 @@ m_rootInfo->setDesktopName(vd->x11DesktopNumber(), vd->name().toUtf8().data()); } + m_desktops.insert(position, vd); + //update the id of displaced desktops - for (uint i = actualNumber; i < (uint)m_desktops.count(); ++i) { + for (uint i = position + 1; i < (uint)m_desktops.count(); ++i) { m_desktops[i]->setX11DesktopNumber(i + 1); if (m_rootInfo) { m_rootInfo->setDesktopName(i + 1, m_desktops[i]->name().toUtf8().data()); } } - m_desktops.insert(actualNumber - 1, vd); save(); updateRootInfo();