1.9.4
This commit is contained in:
parent
9def497615
commit
6ecdc9788b
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue