This commit is contained in:
DavidXanatos 2023-05-21 19:23:43 +02:00
parent 9def497615
commit 6ecdc9788b
6 changed files with 76 additions and 42 deletions

View File

@ -17,6 +17,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Added ### Added
- added more documentation links to the Plus UI - added more documentation links to the Plus UI
- added tray menu option to dismiss a pending update notification - added tray menu option to dismiss a pending update notification
- added Pin/Favourite files to Tray [#2913](https://github.com/sandboxie-plus/Sandboxie/issues/2913)
### Changed ### Changed
- improved compatibility template for Privacy Enhanced box types (thanks offhub) [#2899](https://github.com/sandboxie-plus/Sandboxie/pull/2899) - improved compatibility template for Privacy Enhanced box types (thanks offhub) [#2899](https://github.com/sandboxie-plus/Sandboxie/pull/2899)

View File

@ -1030,6 +1030,17 @@ void CSandBoxPlus::OnCancelAsync()
pProgress->Cancel(); pProgress->Cancel();
} }
QString CSandBoxPlus::MakeBoxCommand(const QString& FileName)
{
QString BoxFileName = FileName;
//if (BoxFileName.indexOf(m_FilePath, Qt::CaseInsensitive) == 0) {
// BoxFileName.remove(0, m_FilePath.length());
// if (BoxFileName.at(0) != '\\')
// BoxFileName.prepend('\\');
//}
return BoxFileName.replace(m_FilePath, "%BoxRoot%", Qt::CaseInsensitive);
}
QString CSandBoxPlus::GetCommandFile(const QString& Command) QString CSandBoxPlus::GetCommandFile(const QString& Command)
{ {
QString Path = Command; QString Path = Command;
@ -1041,9 +1052,17 @@ QString CSandBoxPlus::GetCommandFile(const QString& Command)
int End = Path.indexOf(" "); int End = Path.indexOf(" ");
if (End != -1) Path.truncate(End); if (End != -1) Path.truncate(End);
} }
//if (Path.left(1) == "\\")
if (Path.left(1) == "\\") // Path.prepend(m_FilePath);
Path.prepend(m_FilePath); return Path.replace("%BoxRoot%", m_FilePath, Qt::CaseInsensitive);
}
return Path;
QString CSandBoxPlus::GetFullCommand(const QString& Command)
{
QString FullCmd = Command;
//if(FullCmd.left(1) == "\\")
// FullCmd.prepend(m_FilePath);
//else if(FullCmd.left(2) == "\"\\")
// FullCmd.insert(1, m_FilePath);
return FullCmd.replace("%BoxRoot%", m_FilePath, Qt::CaseInsensitive);
} }

View File

@ -125,7 +125,9 @@ public:
virtual bool IsRecoverySuspended() const { return m_SuspendRecovery; } virtual bool IsRecoverySuspended() const { return m_SuspendRecovery; }
virtual void SetSuspendRecovery(bool bSet = true) { m_SuspendRecovery = bSet; } virtual void SetSuspendRecovery(bool bSet = true) { m_SuspendRecovery = bSet; }
virtual QString MakeBoxCommand(const QString& FileName);
virtual QString GetCommandFile(const QString& Command); virtual QString GetCommandFile(const QString& Command);
virtual QString GetFullCommand(const QString& Command);
const QSet<QString>& GetRecentPrograms() { return m_RecentPrograms; } const QSet<QString>& GetRecentPrograms() { return m_RecentPrograms; }

View File

@ -1,6 +1,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "FileView.h" #include "FileView.h"
#include "SandMan.h" #include "SandMan.h"
#include "../MiscHelpers/Common/Common.h"
#include "../MiscHelpers/Common/Settings.h" #include "../MiscHelpers/Common/Settings.h"
#include "../MiscHelpers/Common/TreeItemModel.h" #include "../MiscHelpers/Common/TreeItemModel.h"
#include "../MiscHelpers/Common/OtherFunctions.h" #include "../MiscHelpers/Common/OtherFunctions.h"
@ -105,6 +106,7 @@ void CFileView::OnAboutToBeModified()
#define MENU_RECOVER_TO_ANY 2 #define MENU_RECOVER_TO_ANY 2
#define MENU_CREATE_SHORTCUT 3 #define MENU_CREATE_SHORTCUT 3
#define MENU_CHECK_FILE 4 #define MENU_CHECK_FILE 4
#define MENU_PIN_FILE 5
void addSeparatorToShellContextMenu(HMENU hMenu) void addSeparatorToShellContextMenu(HMENU hMenu)
{ {
@ -116,18 +118,22 @@ void addSeparatorToShellContextMenu(HMENU hMenu)
InsertMenuItem(hMenu, 0, TRUE, &menu_item_info); InsertMenuItem(hMenu, 0, TRUE, &menu_item_info);
} }
void addItemToShellContextMenu(HMENU hMenu, const wchar_t *name, int ID) void addItemToShellContextMenu(HMENU hMenu, const wchar_t *name, int ID, bool bChecked = false)
{ {
MENUITEMINFO menu_item_info; MENUITEMINFO menu_item_info;
memset(&menu_item_info, 0, sizeof(MENUITEMINFO)); memset(&menu_item_info, 0, sizeof(MENUITEMINFO));
menu_item_info.cbSize = sizeof(MENUITEMINFO); menu_item_info.cbSize = sizeof(MENUITEMINFO);
menu_item_info.fMask = MIIM_ID | MIIM_STRING | MIIM_DATA; menu_item_info.fMask = MIIM_ID | MIIM_STRING | MIIM_DATA;
if (bChecked) {
menu_item_info.fMask |= MIIM_STATE;
menu_item_info.fState |= MFS_CHECKED;
}
menu_item_info.wID = 0xF000 + ID; menu_item_info.wID = 0xF000 + ID;
menu_item_info.dwTypeData = (wchar_t*)name; menu_item_info.dwTypeData = (wchar_t*)name;
InsertMenuItem(hMenu, 0, TRUE, &menu_item_info); InsertMenuItem(hMenu, 0, TRUE, &menu_item_info);
} }
int openShellContextMenu(const QStringList& Files, void* parentWindow, const CSandBoxPtr& pBox) int openShellContextMenu(const QStringList& Files, void* parentWindow, const CSandBoxPtr& pBox, QString* pPin = NULL)
{ {
CComPtr<IShellFolder> pDesktop; CComPtr<IShellFolder> pDesktop;
if (!SUCCEEDED(SHGetDesktopFolder(&pDesktop))) if (!SUCCEEDED(SHGetDesktopFolder(&pDesktop)))
@ -195,6 +201,27 @@ int openShellContextMenu(const QStringList& Files, void* parentWindow, const CSa
addItemToShellContextMenu(hMenu, Str4.c_str(), MENU_CHECK_FILE); addItemToShellContextMenu(hMenu, Str4.c_str(), MENU_CHECK_FILE);
} }
if (pPin && Files.count() == 1)
{
auto pBoxPlus = pBox.objectCast<CSandBoxPlus>();
QStringList RunOptions = pBox->GetTextList("RunCommand", true);
QString FoundPin;
QString FileName = Files.first();
foreach(const QString & RunOption, RunOptions) {
QString CmdFile = pBoxPlus->GetCommandFile(Split2(RunOption, "|").second);
if(CmdFile.compare(FileName, Qt::CaseInsensitive) == 0) {
FoundPin = RunOption;
break;
}
}
*pPin = FoundPin;
std::wstring Str5 = CFileView::tr("Pin to Box Run Menu").toStdWString();
addItemToShellContextMenu(hMenu, Str5.c_str(), MENU_PIN_FILE, !FoundPin.isEmpty());
}
POINT point; POINT point;
GetCursorPos(&point); GetCursorPos(&point);
int iCmd = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, point.x, point.y, (HWND)parentWindow, NULL); int iCmd = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, point.x, point.y, (HWND)parentWindow, NULL);
@ -246,7 +273,8 @@ void CFileView::OnFileMenu(const QPoint&)
if (Files.isEmpty()) if (Files.isEmpty())
return; return;
int iCmd = openShellContextMenu(Files, (void*)this->winId(), m_pBox); QString FoundPin;
int iCmd = openShellContextMenu(Files, (void*)this->winId(), m_pBox, &FoundPin);
if (iCmd == 0) if (iCmd == 0)
return; return;
@ -296,6 +324,15 @@ void CFileView::OnFileMenu(const QPoint&)
theGUI->AddAsyncOp(Status.GetValue()); theGUI->AddAsyncOp(Status.GetValue());
break; break;
} }
case MENU_PIN_FILE:
{
auto pBoxPlus = m_pBox.objectCast<CSandBoxPlus>();
if (FoundPin.isEmpty())
pBoxPlus->InsertText("RunCommand", Split2(Files.first(), "\\", true).second + "|\"" + pBoxPlus->MakeBoxCommand(Files.first()) + "\"");
else
pBoxPlus->DelValue("RunCommand", FoundPin);
break;
}
case MENU_CREATE_SHORTCUT: case MENU_CREATE_SHORTCUT:
{ {
QString BoxName = m_pBox->GetName(); QString BoxName = m_pBox->GetName();

View File

@ -600,22 +600,12 @@ void CSbieView::UpdateProcMenu(const CBoxedProcessPtr& pProcess, int iProcessCou
QString FoundPin; QString FoundPin;
QString FileName = pProcess->GetFileName(); QString FileName = pProcess->GetFileName();
foreach(const QString& RunOption, RunOptions) { foreach(const QString& RunOption, RunOptions) {
QString Cmd = Split2(RunOption, "|").second; QString CmdFile = pBoxPlus->GetCommandFile(Split2(RunOption, "|").second);
int pos = Cmd.indexOf(FileName); if(CmdFile.compare(FileName, Qt::CaseInsensitive) == 0) {
if (pos == 0 || pos == 1) { // 1 for "
FoundPin = RunOption; FoundPin = RunOption;
break; break;
} }
} }
if (FoundPin.isEmpty() && FileName.indexOf(pBoxPlus->GetFileRoot(), Qt::CaseInsensitive) == 0) {
FileName.remove(0, pBoxPlus->GetFileRoot().length());
foreach(const QString& RunOption, RunOptions) {
if (Split2(RunOption, "|").second.indexOf(FileName) == 0) {
FoundPin = RunOption;
break;
}
}
}
if (m_pMenuPreset) { if (m_pMenuPreset) {
m_pMenuPinToRun->setChecked(!FoundPin.isEmpty()); m_pMenuPinToRun->setChecked(!FoundPin.isEmpty());
@ -1451,11 +1441,9 @@ void CSbieView::OnSandBoxAction(QAction* Action, const QList<CSandBoxPtr>& SandB
QString Command = Action->data().toString(); QString Command = Action->data().toString();
if (Command.isEmpty()) if (Command.isEmpty())
Results.append(SandBoxes.first()->RunStart("start_menu")); Results.append(SandBoxes.first()->RunStart("start_menu"));
else else {
{ auto pBoxEx = SandBoxes.first().objectCast<CSandBoxPlus>();
if (Command.left(1) == "\\" && !SandBoxes.isEmpty()) Results.append(SandBoxes.first()->RunStart(pBoxEx->GetFullCommand(Command)));
Command.prepend(SandBoxes.first()->GetFileRoot());
Results.append(SandBoxes.first()->RunStart(Command));
} }
} }
@ -1519,18 +1507,8 @@ void CSbieView::OnProcessAction(QAction* Action, const QList<CBoxedProcessPtr>&
else if (Action == m_pMenuPinToRun) else if (Action == m_pMenuPinToRun)
{ {
CSandBoxPlus* pBoxPlus = pProcess.objectCast<CSbieProcess>()->GetBox(); CSandBoxPlus* pBoxPlus = pProcess.objectCast<CSbieProcess>()->GetBox();
if (m_pMenuPinToRun->isChecked()) if (m_pMenuPinToRun->isChecked())
{ pBoxPlus->InsertText("RunCommand", pProcess->GetProcessName() + "|\"" + pBoxPlus->MakeBoxCommand(pProcess->GetFileName()) + "\"");
QString FileName = pProcess->GetFileName();
if (FileName.indexOf(pBoxPlus->GetFileRoot(), Qt::CaseInsensitive) == 0) {
FileName.remove(0, pBoxPlus->GetFileRoot().length());
if (FileName.at(0) != '\\')
FileName.prepend('\\');
}
pBoxPlus->InsertText("RunCommand", pProcess->GetProcessName() + "|\"" + pProcess->GetFileName().replace(pBoxPlus->GetFileRoot(), "%BoxRoot%", Qt::CaseInsensitive) +"\"");
}
else if(!m_pMenuPinToRun->data().toString().isEmpty()) else if(!m_pMenuPinToRun->data().toString().isEmpty())
pBoxPlus->DelValue("RunCommand", m_pMenuPinToRun->data().toString()); pBoxPlus->DelValue("RunCommand", m_pMenuPinToRun->data().toString());
} }
@ -1774,10 +1752,7 @@ void CSbieView::UpdateRunMenu(const CSandBoxPtr& pBox)
} else } else
pMenu = GetMenuFolder(FolderName.first.replace("\\", "/"), m_pMenuRun, m_RunFolders); pMenu = GetMenuFolder(FolderName.first.replace("\\", "/"), m_pMenuRun, m_RunFolders);
NameCmd.second.replace("%BoxRoot%", pBoxEx->GetFileRoot(), Qt::CaseInsensitive);
StrPair IconIndex = Split2(NameIcon.second, ",", true); StrPair IconIndex = Split2(NameIcon.second, ",", true);
IconIndex.first.replace("%BoxRoot%", pBoxEx->GetFileRoot(), Qt::CaseInsensitive);
QAction* pAction = pMenu->addAction(FolderName.second, this, SLOT(OnSandBoxAction())); QAction* pAction = pMenu->addAction(FolderName.second, this, SLOT(OnSandBoxAction()));
if (IconIndex.first.isEmpty()) if (IconIndex.first.isEmpty())
@ -1785,7 +1760,7 @@ void CSbieView::UpdateRunMenu(const CSandBoxPtr& pBox)
else if(IconIndex.second.isEmpty()) else if(IconIndex.second.isEmpty())
pAction->setIcon(LoadWindowsIcon(pBoxEx->GetCommandFile(NameCmd.second), IconIndex.first.toInt())); pAction->setIcon(LoadWindowsIcon(pBoxEx->GetCommandFile(NameCmd.second), IconIndex.first.toInt()));
else else
pAction->setIcon(LoadWindowsIcon(IconIndex.first, IconIndex.second.toInt())); pAction->setIcon(LoadWindowsIcon(pBoxEx->GetCommandFile(IconIndex.first), IconIndex.second.toInt()));
pAction->setData(NameCmd.second); pAction->setData(NameCmd.second);
} }

View File

@ -892,12 +892,12 @@ void COptionsWindow::OnBrowsePath()
if (Value.isEmpty()) if (Value.isEmpty())
return; return;
QString Name = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter a menu title"), QLineEdit::Normal); QString Name = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter a menu title"), QLineEdit::Normal, Split2(Value, "\\", true).second);
if (Name.isEmpty()) if (Name.isEmpty())
return; return;
CSandBoxPlus* pBoxEx = qobject_cast<CSandBoxPlus*>(m_pBox.data()); CSandBoxPlus* pBoxEx = qobject_cast<CSandBoxPlus*>(m_pBox.data());
AddRunItem(Name, "", "\"" + (pBoxEx ? Value.replace(pBoxEx->GetFileRoot(), "%BoxRoot%", Qt::CaseInsensitive) : Value) + "\""); AddRunItem(Name, "", "\"" + (pBoxEx ? pBoxEx->MakeBoxCommand(Value) : Value) + "\"");
m_GeneralChanged = true; m_GeneralChanged = true;
OnOptChanged(); OnOptChanged();
} }