mirror of
https://github.com/Open-Shell/Open-Shell-Menu.git
synced 2026-04-16 05:39:06 +10:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1cc5d2eb53 | ||
|
|
687e50914f | ||
|
|
a165ba38a6 | ||
|
|
6b7cfc5ab2 | ||
|
|
1f2c3d43a6 | ||
|
|
5bee5ae143 | ||
|
|
f01c126b36 | ||
|
|
3d1fa11973 |
@@ -3722,7 +3722,7 @@ Menu.RestartUpdate = Atualizar e reiniciar
|
|||||||
Menu.Sleep = &Dormir
|
Menu.Sleep = &Dormir
|
||||||
Menu.Hibernate = &Hibernar
|
Menu.Hibernate = &Hibernar
|
||||||
Menu.ControlPanel = &Painel de controle
|
Menu.ControlPanel = &Painel de controle
|
||||||
Menu.PCSettings = Configurações do computador
|
Menu.PCSettings = Configurações
|
||||||
Menu.Security = Segurança do Windows
|
Menu.Security = Segurança do Windows
|
||||||
Menu.Network = Co&nexões de Rede
|
Menu.Network = Co&nexões de Rede
|
||||||
Menu.Printers = &Impressoras
|
Menu.Printers = &Impressoras
|
||||||
|
|||||||
@@ -2,11 +2,10 @@
|
|||||||
|
|
||||||
*Originally* **[Classic Shell](http://www.classicshell.net)** *by [Ivo Beltchev](https://sourceforge.net/u/ibeltchev/profile/)*
|
*Originally* **[Classic Shell](http://www.classicshell.net)** *by [Ivo Beltchev](https://sourceforge.net/u/ibeltchev/profile/)*
|
||||||
|
|
||||||
[](https://github.com/Open-Shell/Open-Shell-Menu/releases) [](https://github.com/Open-Shell/Open-Shell-Menu/releases) [](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master) [](https://gitq.com/passionate-coder/Classic-Start) [](https://gitter.im/open-shell/Lobby) [](https://discord.gg/7H6arr5)
|
[](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest) [](https://github.com/Open-Shell/Open-Shell-Menu/releases) [](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master) [](https://gitq.com/passionate-coder/Classic-Start) [](https://gitter.im/open-shell/Lobby) [](https://discord.gg/7H6arr5)
|
||||||
|
|
||||||
[Home Page](https://open-shell.github.io/Open-Shell-Menu)
|
[Home Page](https://open-shell.github.io/Open-Shell-Menu)
|
||||||
[Gitter Discussion room](https://gitter.im/Open-Shell)
|
[Gitter Discussion room](https://gitter.im/Open-Shell)
|
||||||
[Latest nightly build](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master/artifacts)
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
- Classic style Start Menu for Windows 7, 8, 8.1, 10
|
- Classic style Start Menu for Windows 7, 8, 8.1, 10
|
||||||
|
|||||||
@@ -344,7 +344,7 @@ static DWORD WINAPI ThreadVersionCheck( void *param )
|
|||||||
VersionData data;
|
VersionData data;
|
||||||
|
|
||||||
{
|
{
|
||||||
auto load = params.nightly ? data.LoadNightly() : data.Load();
|
auto load = data.Load(!params.nightly);
|
||||||
|
|
||||||
#ifdef UPDATE_LOG
|
#ifdef UPDATE_LOG
|
||||||
LogToFile(UPDATE_LOG, L"Load result: %d", load);
|
LogToFile(UPDATE_LOG, L"Load result: %d", load);
|
||||||
@@ -765,20 +765,38 @@ std::vector<char> DownloadUrl(const wchar_t* url)
|
|||||||
|
|
||||||
using namespace nlohmann;
|
using namespace nlohmann;
|
||||||
|
|
||||||
VersionData::TLoadResult VersionData::Load()
|
VersionData::TLoadResult VersionData::Load(bool official)
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
|
|
||||||
auto buf = DownloadUrl(L"https://api.github.com/repos/Open-Shell/Open-Shell-Menu/releases/latest");
|
std::wstring baseUrl = L"https://api.github.com/repos/Open-Shell/Open-Shell-Menu/releases";
|
||||||
|
if (official)
|
||||||
|
baseUrl += L"/latest";
|
||||||
|
|
||||||
|
auto buf = DownloadUrl(baseUrl.c_str());
|
||||||
if (buf.empty())
|
if (buf.empty())
|
||||||
return LOAD_ERROR;
|
return LOAD_ERROR;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
auto data = json::parse(buf.begin(), buf.end());
|
auto jsonData = json::parse(buf.begin(), buf.end());
|
||||||
|
auto& data = jsonData;
|
||||||
|
|
||||||
// skip prerelease versions
|
if (official)
|
||||||
if (data["prerelease"].get<bool>())
|
{
|
||||||
|
// skip prerelease versions (just in case)
|
||||||
|
if (data["prerelease"].get<bool>())
|
||||||
|
return LOAD_BAD_VERSION;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we've got list of versions (release and pre-release)
|
||||||
|
// lets pick first one (that should be the latest one)
|
||||||
|
data = jsonData[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure we didn't get draft release (for whatever reason)
|
||||||
|
if (data["draft"].get<bool>())
|
||||||
return LOAD_BAD_VERSION;
|
return LOAD_BAD_VERSION;
|
||||||
|
|
||||||
// get version from tag name
|
// get version from tag name
|
||||||
@@ -832,116 +850,6 @@ VersionData::TLoadResult VersionData::Load()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VersionData::TLoadResult VersionData::LoadNightly()
|
|
||||||
{
|
|
||||||
Clear();
|
|
||||||
|
|
||||||
auto buf = DownloadUrl(L"https://ci.appveyor.com/api/projects/passionate-coder/open-shell-menu/branch/master");
|
|
||||||
if (buf.empty())
|
|
||||||
return LOAD_ERROR;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
auto data = json::parse(buf.begin(), buf.end());
|
|
||||||
auto build = data["build"];
|
|
||||||
|
|
||||||
// get version
|
|
||||||
auto version = build["version"].get<std::string>();
|
|
||||||
if (version.empty())
|
|
||||||
return LOAD_BAD_FILE;
|
|
||||||
|
|
||||||
{
|
|
||||||
int v1, v2, v3;
|
|
||||||
if (sscanf_s(version.c_str(), "%d.%d.%d", &v1, &v2, &v3) != 3)
|
|
||||||
return LOAD_BAD_FILE;
|
|
||||||
|
|
||||||
newVersion = (v1 << 24) | (v2 << 16) | v3;
|
|
||||||
|
|
||||||
if (newVersion <= GetVersionEx(g_Instance))
|
|
||||||
return LOAD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// artifact url
|
|
||||||
{
|
|
||||||
auto jobId = build["jobs"][0]["jobId"].get<std::string>();
|
|
||||||
if (jobId.empty())
|
|
||||||
return LOAD_BAD_FILE;
|
|
||||||
|
|
||||||
std::wstring jobUrl(L"https://ci.appveyor.com/api/buildjobs/");
|
|
||||||
jobUrl += std::wstring(jobId.begin(), jobId.end());
|
|
||||||
jobUrl += L"/artifacts";
|
|
||||||
|
|
||||||
buf = DownloadUrl(jobUrl.c_str());
|
|
||||||
if (buf.empty())
|
|
||||||
return LOAD_ERROR;
|
|
||||||
|
|
||||||
auto artifacts = json::parse(buf.begin(), buf.end());
|
|
||||||
|
|
||||||
std::string fileName;
|
|
||||||
for (const auto& artifact : artifacts)
|
|
||||||
{
|
|
||||||
auto name = artifact["fileName"].get<std::string>();
|
|
||||||
if (name.find("OpenShellSetup") == 0)
|
|
||||||
{
|
|
||||||
fileName = name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fileName.empty())
|
|
||||||
return LOAD_BAD_FILE;
|
|
||||||
|
|
||||||
auto artifactUrl(jobUrl);
|
|
||||||
artifactUrl += L'/';
|
|
||||||
artifactUrl += std::wstring(fileName.begin(), fileName.end());
|
|
||||||
|
|
||||||
downloadUrl = artifactUrl.c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
// changelog
|
|
||||||
news.Append(CA2T(version.c_str()));
|
|
||||||
news.Append(L"\r\n\r\n");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// use Github API to compare commit that actual version was built from (APPVEYOR_REPO_COMMIT)
|
|
||||||
// and commit that AppVeyor version was built from (commitId)
|
|
||||||
auto commitId = build["commitId"].get<std::string>();
|
|
||||||
|
|
||||||
std::wstring compareUrl(L"https://api.github.com/repos/Open-Shell/Open-Shell-Menu/compare/");
|
|
||||||
compareUrl += _T(APPVEYOR_REPO_COMMIT);
|
|
||||||
compareUrl += L"...";
|
|
||||||
compareUrl += std::wstring(commitId.begin(), commitId.end());
|
|
||||||
|
|
||||||
buf = DownloadUrl(compareUrl.c_str());
|
|
||||||
auto compare = json::parse(buf.begin(), buf.end());
|
|
||||||
|
|
||||||
// then use first lines (subjects) of commit messages as changelog
|
|
||||||
auto commits = compare["commits"];
|
|
||||||
for (const auto& commit : commits)
|
|
||||||
{
|
|
||||||
auto message = commit["commit"]["message"].get<std::string>();
|
|
||||||
|
|
||||||
auto pos = message.find('\n');
|
|
||||||
if (pos != message.npos)
|
|
||||||
message.resize(pos);
|
|
||||||
|
|
||||||
news.Append(L"- ");
|
|
||||||
news.Append(CA2T(message.c_str()));
|
|
||||||
news.Append(L"\r\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
return LOAD_BAD_FILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return LOAD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
VersionData::TLoadResult VersionData::Load( const wchar_t *fname, bool bLoadFlags )
|
VersionData::TLoadResult VersionData::Load( const wchar_t *fname, bool bLoadFlags )
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
|
|||||||
@@ -59,8 +59,7 @@ struct VersionData
|
|||||||
LOAD_BAD_FILE, // the file is corrupted
|
LOAD_BAD_FILE, // the file is corrupted
|
||||||
};
|
};
|
||||||
|
|
||||||
TLoadResult Load();
|
TLoadResult Load(bool official);
|
||||||
TLoadResult LoadNightly();
|
|
||||||
TLoadResult Load( const wchar_t *fname, bool bLoadFlags );
|
TLoadResult Load( const wchar_t *fname, bool bLoadFlags );
|
||||||
private:
|
private:
|
||||||
void operator=( const VersionData& );
|
void operator=( const VersionData& );
|
||||||
|
|||||||
13789
Src/Lib/json.hpp
13789
Src/Lib/json.hpp
File diff suppressed because it is too large
Load Diff
@@ -903,7 +903,7 @@ HRESULT STDMETHODCALLTYPE CMenuContainer::Drop( IDataObject *pDataObj, DWORD grf
|
|||||||
else if (i<before)
|
else if (i<before)
|
||||||
skip++;
|
skip++;
|
||||||
}
|
}
|
||||||
SortMenuItem ins(L"",FNV_HASH0,false,false,false,folderIndex*2,0);
|
SortMenuItem ins(L"",FNV_HASH0,false,false,folderIndex*2,0);
|
||||||
items.insert(items.begin()+(before-skip),ins);
|
items.insert(items.begin()+(before-skip),ins);
|
||||||
SaveItemOrder(items);
|
SaveItemOrder(items);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -861,8 +861,7 @@ void CMenuContainer::AddFirstFolder( IShellItem *pFolder, std::vector<MenuItem>
|
|||||||
|
|
||||||
if (bLibrary) flags&=~SFGAO_STREAM;
|
if (bLibrary) flags&=~SFGAO_STREAM;
|
||||||
item.bLink=(flags&SFGAO_LINK)!=0;
|
item.bLink=(flags&SFGAO_LINK)!=0;
|
||||||
item.bFolderLink=(flags&SFGAO_FOLDER && (!(flags&(SFGAO_STREAM|SFGAO_LINK)) || (s_bExpandLinks && item.bLink)));
|
item.bFolder=(!(options&CONTAINER_CONTROLPANEL) && !(options&CONTAINER_NOSUBFOLDERS) && (flags&SFGAO_FOLDER) && (!(flags&(SFGAO_STREAM|SFGAO_LINK)) || (s_bExpandLinks && item.bLink)));
|
||||||
item.bFolder=(!(options&CONTAINER_CONTROLPANEL) && !(options&CONTAINER_NOSUBFOLDERS) && item.bFolderLink);
|
|
||||||
{
|
{
|
||||||
CItemManager::RWLock lock(&g_ItemManager,false,CItemManager::RWLOCK_ITEMS);
|
CItemManager::RWLock lock(&g_ItemManager,false,CItemManager::RWLOCK_ITEMS);
|
||||||
if (item.pItemInfo->IsMetroLink())
|
if (item.pItemInfo->IsMetroLink())
|
||||||
|
|||||||
@@ -453,7 +453,7 @@ private:
|
|||||||
drawType=MenuSkin::COLUMN1_ITEM;
|
drawType=MenuSkin::COLUMN1_ITEM;
|
||||||
column=row=0;
|
column=row=0;
|
||||||
memset(&itemRect,0,sizeof(itemRect));
|
memset(&itemRect,0,sizeof(itemRect));
|
||||||
bFolder=bLink=bFolderLink=bPrograms=bAlignBottom=bBreak=bInline=bInlineFirst=bInlineLast=bSplit=bHasJumpList=bMetroLink=bMetroApp=bBlankSeparator=bNew=bStartScreen=bCustomAccelerator=false;
|
bFolder=bLink=bPrograms=bAlignBottom=bBreak=bInline=bInlineFirst=bInlineLast=bSplit=bHasJumpList=bMetroLink=bMetroApp=bBlankSeparator=bNew=bStartScreen=bCustomAccelerator=false;
|
||||||
priority=0;
|
priority=0;
|
||||||
pItem1=pItem2=NULL;
|
pItem1=pItem2=NULL;
|
||||||
mfuHash=0;
|
mfuHash=0;
|
||||||
@@ -477,7 +477,6 @@ private:
|
|||||||
RECT itemRect;
|
RECT itemRect;
|
||||||
bool bFolder:1; // this is a folder - draw arrow
|
bool bFolder:1; // this is a folder - draw arrow
|
||||||
bool bLink:1; // this is a link (if a link to a folder is expanded it is always single-column)
|
bool bLink:1; // this is a link (if a link to a folder is expanded it is always single-column)
|
||||||
bool bFolderLink:1; // this is a folder that is not explicitly expandable - used for sorting the list-of-links style
|
|
||||||
bool bPrograms:1; // this item is part of the Start Menu folder hierarchy
|
bool bPrograms:1; // this item is part of the Start Menu folder hierarchy
|
||||||
bool bAlignBottom:1; // two-column menu: this item is aligned to the bottom
|
bool bAlignBottom:1; // two-column menu: this item is aligned to the bottom
|
||||||
bool bBreak:1; // two-column menu: this item starts the second column
|
bool bBreak:1; // two-column menu: this item starts the second column
|
||||||
@@ -513,8 +512,8 @@ private:
|
|||||||
if (priority>item.priority) return false;
|
if (priority>item.priority) return false;
|
||||||
if (row<item.row) return true;
|
if (row<item.row) return true;
|
||||||
if (row>item.row) return false;
|
if (row>item.row) return false;
|
||||||
if (((bFolder || bFolderLink) && !bHasJumpList) && !((item.bFolder || item.bFolderLink) && !item.bHasJumpList)) return true;
|
if ((bFolder && !bHasJumpList) && !(item.bFolder && !item.bHasJumpList)) return true;
|
||||||
if (!((bFolder || bFolderLink) && !bHasJumpList) && ((item.bFolder || item.bFolderLink) && !item.bHasJumpList)) return false;
|
if (!(bFolder && !bHasJumpList) && (item.bFolder && !item.bHasJumpList)) return false;
|
||||||
if (drive && !item.drive) return true;
|
if (drive && !item.drive) return true;
|
||||||
if (!drive && item.drive) return false;
|
if (!drive && item.drive) return false;
|
||||||
if (drive && item.drive) return drive<item.drive;
|
if (drive && item.drive) return drive<item.drive;
|
||||||
@@ -579,19 +578,18 @@ private:
|
|||||||
CString name;
|
CString name;
|
||||||
unsigned int nameHash;
|
unsigned int nameHash;
|
||||||
bool bFolder;
|
bool bFolder;
|
||||||
bool bFolderLink;
|
|
||||||
bool bHasJumpList;
|
bool bHasJumpList;
|
||||||
char priority;
|
char priority;
|
||||||
char drive;
|
char drive;
|
||||||
|
|
||||||
SortMenuItem( const CString &_name, unsigned _nameHash, bool _bFolder, bool _bFolderLink, bool _bHasJumpList, char _priority ,char _drive) { name=_name; nameHash=_nameHash; bFolder=_bFolder; bFolderLink=_bFolderLink; bHasJumpList=_bHasJumpList; priority=_priority; drive=_drive; }
|
SortMenuItem( const CString &_name, unsigned _nameHash, bool _bFolder, bool _bHasJumpList, char _priority ,char _drive) { name=_name; nameHash=_nameHash; bFolder=_bFolder; bHasJumpList=_bHasJumpList; priority=_priority; drive=_drive; }
|
||||||
SortMenuItem( const MenuItem &item ) { name=item.name; nameHash=item.nameHash; bFolder=item.bFolder; bFolderLink=item.bFolderLink; bHasJumpList=item.bHasJumpList; priority=item.priority; drive=item.drive; }
|
SortMenuItem( const MenuItem &item ) { name=item.name; nameHash=item.nameHash; bFolder=item.bFolder; bHasJumpList=item.bHasJumpList; priority=item.priority; drive=item.drive; }
|
||||||
bool operator<( const SortMenuItem &x ) const
|
bool operator<( const SortMenuItem &x ) const
|
||||||
{
|
{
|
||||||
if (priority<x.priority) return true;
|
if (priority<x.priority) return true;
|
||||||
if (priority>x.priority) return false;
|
if (priority>x.priority) return false;
|
||||||
if (((bFolder || bFolderLink) && !bHasJumpList) && !((x.bFolder || x.bFolderLink) && !x.bHasJumpList)) return true;
|
if ((bFolder && !bHasJumpList) && !(x.bFolder && !x.bHasJumpList)) return true;
|
||||||
if (!((bFolder || bFolderLink) && !bHasJumpList) && ((x.bFolder || x.bFolderLink) && !x.bHasJumpList)) return false;
|
if (!(bFolder && !bHasJumpList) && (x.bFolder && !x.bHasJumpList)) return false;
|
||||||
if (drive && !x.drive) return true;
|
if (drive && !x.drive) return true;
|
||||||
if (!drive && x.drive) return false;
|
if (!drive && x.drive) return false;
|
||||||
if (drive && x.drive) return drive<x.drive;
|
if (drive && x.drive) return drive<x.drive;
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ deploy:
|
|||||||
- provider: GitHub
|
- provider: GitHub
|
||||||
tag: v$(APPVEYOR_BUILD_VERSION)
|
tag: v$(APPVEYOR_BUILD_VERSION)
|
||||||
release: $(APPVEYOR_BUILD_VERSION)
|
release: $(APPVEYOR_BUILD_VERSION)
|
||||||
|
on:
|
||||||
|
APPVEYOR_ACCOUNT_NAME: passionate-coder
|
||||||
auth_token:
|
auth_token:
|
||||||
secure: 01CsOFRdj9KFb1hp/RlFK/F1UzGhzwGQfok6OoqcL1ipbOwRF//Phbdm7iaFVWIx
|
secure: D0QZnRZfea3qJlWOwrxE6M2jrbiSrOfz/6U7RzdeeG8N0qNDFKI7LFjYyw2I/PcR
|
||||||
prerelease: true
|
prerelease: true
|
||||||
|
|||||||
Reference in New Issue
Block a user