diff --git a/src/useractions.cpp b/src/useractions.cpp --- a/src/useractions.cpp +++ b/src/useractions.cpp @@ -63,6 +63,11 @@ namespace KWin { +struct ShowOnDesktopActionData { + uint desktop; + bool moveToSingle; +}; + UserActionsMenu::UserActionsMenu(QObject *parent) : QObject(parent) , m_menu(nullptr) @@ -539,7 +544,7 @@ } m_desktopMenu->addSeparator(); - action = m_desktopMenu->addAction(i18nc("Create a new desktop and move there the window", "&New Desktop")); + action = m_desktopMenu->addAction(i18nc("Create a new desktop and move the window there", "&New Desktop")); action->setData(vds->count() + 1); if (vds->count() >= vds->maximum()) @@ -557,7 +562,7 @@ m_multipleDesktopsMenu->setPalette(m_client->palette()); } QAction *action = m_multipleDesktopsMenu->addAction(i18n("&All Desktops")); - action->setData(0); + action->setData(QVariant::fromValue(ShowOnDesktopActionData{0, false})); action->setCheckable(true); QActionGroup *allDesktopsGroup = new QActionGroup(m_multipleDesktopsMenu); allDesktopsGroup->addAction(action); @@ -582,21 +587,34 @@ box->setBackgroundRole(m_multipleDesktopsMenu->backgroundRole()); box->setForegroundRole(m_multipleDesktopsMenu->foregroundRole()); box->setPalette(m_multipleDesktopsMenu->palette()); - connect(box, &QCheckBox::clicked, action, &QAction::triggered); m_multipleDesktopsMenu->addAction(action); - action->setData(i); + connect(box, &QCheckBox::clicked, [action, i]() { + bool moveToSingle = QApplication::keyboardModifiers() & Qt::ControlModifier; + action->setData(QVariant::fromValue(ShowOnDesktopActionData{i, moveToSingle})); + action->triggered(); + }); if (m_client && !m_client->isOnAllDesktops() && m_client->isOnDesktop(i)) { box->setChecked(true); } } m_multipleDesktopsMenu->addSeparator(); - action = m_multipleDesktopsMenu->addAction(i18nc("Create a new desktop and move there the window", "&New Desktop")); - action->setData(vds->count() + 1); - - if (vds->count() >= vds->maximum()) - action->setEnabled(false); + QWidgetAction *newDesktopAction = new QWidgetAction(m_multipleDesktopsMenu); + QPushButton *button = new QPushButton(i18nc("Create a new desktop and move the window there", "&New Desktop")); + button->setBackgroundRole(m_multipleDesktopsMenu->backgroundRole()); + button->setForegroundRole(m_multipleDesktopsMenu->foregroundRole()); + button->setFlat(true); + newDesktopAction->setDefaultWidget(button); + newDesktopAction->setEnabled(vds->count() < vds->maximum()); + + m_multipleDesktopsMenu->addAction(newDesktopAction); + uint countPlusOne = vds->count() + 1; + connect(button, &QPushButton::clicked, [newDesktopAction, countPlusOne]() { + bool moveToSingle = QApplication::keyboardModifiers() & Qt::ControlModifier; + newDesktopAction->setData(QVariant::fromValue(ShowOnDesktopActionData{countPlusOne, moveToSingle})); + newDesktopAction->triggered(); + }); } void UserActionsMenu::screenPopupAboutToShow() @@ -735,29 +753,33 @@ void UserActionsMenu::slotToggleOnVirtualDesktop(QAction *action) { - bool ok = false; - uint desk = action->data().toUInt(&ok); - if (!ok) { + if (m_client.isNull()) { return; } - if (m_client.isNull()) { + + if (!action->data().canConvert()) { return; } + ShowOnDesktopActionData data = action->data().value(); VirtualDesktopManager *vds = VirtualDesktopManager::self(); - if (desk == 0) { + if (data.desktop == 0) { // the 'on_all_desktops' menu entry m_client->setOnAllDesktops(!m_client->isOnAllDesktops()); return; - } else if (desk > vds->count()) { - vds->setCount(desk); + } else if (data.desktop > vds->count()) { + vds->setCount(data.desktop); } - VirtualDesktop *virtualDesktop = VirtualDesktopManager::self()->desktopForX11Id(desk); - if (m_client->desktops().contains(virtualDesktop)) { - m_client->leaveDesktop(virtualDesktop); + VirtualDesktop *virtualDesktop = vds->desktopForX11Id(data.desktop); + if (data.moveToSingle) { + m_client->setDesktop(data.desktop); } else { - m_client->enterDesktop(virtualDesktop); + if (m_client->desktops().contains(virtualDesktop)) { + m_client->leaveDesktop(virtualDesktop); + } else { + m_client->enterDesktop(virtualDesktop); + } } } @@ -1680,3 +1702,5 @@ } } // namespace + +Q_DECLARE_METATYPE(KWin::ShowOnDesktopActionData);