diff --git a/CHANGELOG.md b/CHANGELOG.md index 84c313a4ac..c224ee94b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - added "LingerExemptWnds=n" to make the lingering process monitor mechanism no longer exempt lingering processes with windows from termination - Added option 'SharedTemplate' to Box Wizard [#3737](https://github.com/sandboxie-plus/Sandboxie/pull/3737) (thanks offhub) - Added an option to force the protection of an encrypted sandbox to be enabled. [#3736](https://github.com/sandboxie-plus/Sandboxie/pull/3736) (thanks Yeyixiao) +- Added a menu and button/icon to suspend all processes [#3741] (https://github.com/sandboxie-plus/Sandboxie/issues/3741) ### Changed - option "LingerLeniency=n" now also disabled the 5 sec grace period for freshly started lingerers [#1892](https://github.com/sandboxie-plus/Sandboxie/issues/1892) diff --git a/SandboxiePlus/SandMan/Resources/Actions/Pause.png b/SandboxiePlus/SandMan/Resources/Actions/Pause.png new file mode 100644 index 0000000000..6f8889a63c Binary files /dev/null and b/SandboxiePlus/SandMan/Resources/Actions/Pause.png differ diff --git a/SandboxiePlus/SandMan/Resources/SandMan.qrc b/SandboxiePlus/SandMan/Resources/SandMan.qrc index 7de8decbb6..acf7546b21 100644 --- a/SandboxiePlus/SandMan/Resources/SandMan.qrc +++ b/SandboxiePlus/SandMan/Resources/SandMan.qrc @@ -181,6 +181,7 @@ SideLogoDM.png Actions/TaskBar.png Actions/Desktop.png + Actions/Pause.png Boxes/BusyOverlay.png diff --git a/SandboxiePlus/SandMan/SandMan.cpp b/SandboxiePlus/SandMan/SandMan.cpp index 3ad2037c21..755ca75751 100644 --- a/SandboxiePlus/SandMan/SandMan.cpp +++ b/SandboxiePlus/SandMan/SandMan.cpp @@ -510,6 +510,7 @@ void CSandMan::CreateMenus(bool bAdvanced) m_pImportBox->setEnabled(CArchive::IsInit()); m_pMenuFile->addSeparator(); m_pRunBoxed = m_pMenuFile->addAction(CSandMan::GetIcon("Run"), tr("Run Sandboxed"), this, SLOT(OnSandBoxAction())); + m_pPauseAll = m_pMenuFile->addAction(CSandMan::GetIcon("Pause"), tr("Suspend All Processes"), this, SLOT(OnPauseAll())); m_pEmptyAll = m_pMenuFile->addAction(CSandMan::GetIcon("EmptyAll"), tr("Terminate All Processes"), this, SLOT(OnEmptyAll())); m_pLockAll = m_pMenuFile->addAction(CSandMan::GetIcon("LockClosed"), tr("Lock All Encrypted Boxes"), this, SLOT(OnLockAll())); m_pMenuFile->addSeparator(); @@ -653,6 +654,7 @@ void CSandMan::CreateOldMenus() m_pMenuFile = m_pMenuBar->addMenu(tr("&File")); m_pRunBoxed = m_pMenuFile->addAction(CSandMan::GetIcon("Run"), tr("Run Sandboxed"), this, SLOT(OnSandBoxAction())); + m_pPauseAll = m_pMenuFile->addAction(CSandMan::GetIcon("Pause"), tr("Suspend All Processes"), this, SLOT(OnPauseAll())); m_pEmptyAll = m_pMenuFile->addAction(CSandMan::GetIcon("EmptyAll"), tr("Terminate All Processes"), this, SLOT(OnEmptyAll())); m_pLockAll = m_pMenuFile->addAction(CSandMan::GetIcon("LockClosed"), tr("Lock All Encrypted Boxes"), this, SLOT(OnLockAll())); m_pDisableForce = m_pMenuFile->addAction(CSandMan::GetIcon("PauseForce"), tr("Pause Forcing Programs"), this, SLOT(OnDisableForce())); @@ -830,6 +832,7 @@ QList CSandMan::GetAvailableToolBarActions() ToolBarAction{ "", nullptr }, // separator ToolBarAction{ "RunBoxed", m_pRunBoxed }, ToolBarAction{ "IsBoxed", m_pWndFinder }, + ToolBarAction{ "SuspendAll", m_pPauseAll }, ToolBarAction{ "TerminateAll", m_pEmptyAll }, ToolBarAction{ "LockAll", m_pLockAll }, ToolBarAction{ "", nullptr }, // separator @@ -2577,6 +2580,7 @@ void CSandMan::UpdateState() m_pNewBox->setEnabled(isConnected); m_pNewGroup->setEnabled(isConnected); m_pImportBox->setEnabled(isConnected); + m_pPauseAll->setEnabled(isConnected); m_pEmptyAll->setEnabled(isConnected); m_pLockAll->setEnabled(isConnected); m_pDisableForce->setEnabled(isConnected); @@ -3184,6 +3188,15 @@ void CSandMan::OnEmptyAll() theAPI->TerminateAll(); } +void CSandMan::OnPauseAll() +{ + for (auto pBox: theAPI->GetAllBoxes()) { + pBox->SetSuspendedAll(TRUE); + for (auto pProcess : pBox->GetProcessList()) + pProcess->TestSuspended(); + } +} + void CSandMan::OnLockAll() { if (theConf->GetInt("Options/WarnLockAll", -1) == -1) diff --git a/SandboxiePlus/SandMan/SandMan.h b/SandboxiePlus/SandMan/SandMan.h index d7af590d8f..612a47b69f 100644 --- a/SandboxiePlus/SandMan/SandMan.h +++ b/SandboxiePlus/SandMan/SandMan.h @@ -251,6 +251,7 @@ private slots: void OnSandBoxAction(); void OnSettingsAction(); + void OnPauseAll(); void OnEmptyAll(); void OnLockAll(); void OnWndFinder(); @@ -373,6 +374,7 @@ private slots: QAction* m_pNewBox; QAction* m_pNewGroup; QAction* m_pImportBox; + QAction* m_pPauseAll; QAction* m_pEmptyAll; QAction* m_pLockAll; QAction* m_pWndFinder;