mirror of
https://github.com/Open-Shell/Open-Shell-Menu.git
synced 2026-08-09 17:41:11 +10:00
Compare commits
20
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95bbb17faf | ||
|
|
37fdea7964 | ||
|
|
8502d4bd7b | ||
|
|
8713a69200 | ||
|
|
b264f96525 | ||
|
|
07ead0baf8 | ||
|
|
566bb81c7e | ||
|
|
4fd5545485 | ||
|
|
86e8a24b16 | ||
|
|
9518c3b650 | ||
|
|
f15a0fbd75 | ||
|
|
7baba47baf | ||
|
|
f5fa8f0ea3 | ||
|
|
dfb307b3b7 | ||
|
|
b2070640ff | ||
|
|
7566280973 | ||
|
|
32ad90f17d | ||
|
|
e2758ec376 | ||
|
|
dd57854da1 | ||
|
|
40d8f5b119 |
@@ -0,0 +1,208 @@
|
|||||||
|
name: Build
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # Default to secure
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- 'Src/**'
|
||||||
|
- 'Localization/**'
|
||||||
|
- '.github/workflows/build.yml'
|
||||||
|
|
||||||
|
workflow_dispatch: # allows manual trigger for main/master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: windows-2025-vs2026
|
||||||
|
outputs:
|
||||||
|
new_version: ${{ steps.versioning.outputs.NEW_VERSION }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # Essential to see all tags
|
||||||
|
|
||||||
|
- name: Prepare version
|
||||||
|
id: versioning
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
# Fetch latest tag
|
||||||
|
$latestTag = git describe --tags --abbrev=0 2>$null
|
||||||
|
|
||||||
|
if ($latestTag -notmatch '^v\d+\.\d+\.\d+$') {
|
||||||
|
Write-Error "Error: Could not find a valid vX.Y.Z tag in history. Found: '$latestTag'"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse and Increment
|
||||||
|
$version = [version]$latestTag.Substring(1)
|
||||||
|
$baseVersion = "$($version.Major).$($version.Minor).$($version.Build + 1)"
|
||||||
|
|
||||||
|
# Handle PR Suffix
|
||||||
|
if ("${{ github.event_name }}" -eq "pull_request") {
|
||||||
|
$shortSha = "${{ github.event.pull_request.head.sha }}".Substring(0, 7)
|
||||||
|
$finalVersion = "$baseVersion-pr-$shortSha"
|
||||||
|
} else {
|
||||||
|
$finalVersion = $baseVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export
|
||||||
|
"NEW_VERSION=$finalVersion" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||||
|
Write-Host "Building version: $finalVersion"
|
||||||
|
|
||||||
|
- name: Build binaries
|
||||||
|
shell: cmd
|
||||||
|
env:
|
||||||
|
CS_VERSION: ${{ steps.versioning.outputs.NEW_VERSION }}
|
||||||
|
run: Src\Setup\BuildBinaries.bat
|
||||||
|
|
||||||
|
- name: Upload binaries
|
||||||
|
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds
|
||||||
|
id: upload-binaries
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: Binaries
|
||||||
|
path: |
|
||||||
|
Src/Setup/Output/
|
||||||
|
!Src/Setup/Output/*.skin
|
||||||
|
!Src/Setup/Output/*.skin7
|
||||||
|
!Src/Setup/Output/*.zip
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
- name: Sign binaries with SignPath
|
||||||
|
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds
|
||||||
|
uses: signpath/github-action-submit-signing-request@v2
|
||||||
|
with:
|
||||||
|
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
|
||||||
|
organization-id: 'b34b60e3-e5bf-4a6e-a13c-dcf641b4362c'
|
||||||
|
project-slug: 'Open-Shell-Menu'
|
||||||
|
signing-policy-slug: 'release-signing'
|
||||||
|
artifact-configuration-slug: 'Binaries'
|
||||||
|
github-artifact-id: '${{ steps.upload-binaries.outputs.artifact-id }}'
|
||||||
|
wait-for-completion: true
|
||||||
|
output-artifact-directory: 'Src/Setup/Output/'
|
||||||
|
|
||||||
|
- name: Build installers
|
||||||
|
shell: cmd
|
||||||
|
env:
|
||||||
|
CS_VERSION: ${{ steps.versioning.outputs.NEW_VERSION }}
|
||||||
|
run: Src\Setup\_BuildEnglish.bat
|
||||||
|
|
||||||
|
- name: Upload installers
|
||||||
|
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds
|
||||||
|
id: upload-installers
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: MSI
|
||||||
|
path: |
|
||||||
|
Src/Setup/Temp/*.msi
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
- name: Sign installers with SignPath
|
||||||
|
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds
|
||||||
|
uses: signpath/github-action-submit-signing-request@v2
|
||||||
|
with:
|
||||||
|
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
|
||||||
|
organization-id: 'b34b60e3-e5bf-4a6e-a13c-dcf641b4362c'
|
||||||
|
project-slug: 'Open-Shell-Menu'
|
||||||
|
signing-policy-slug: 'release-signing'
|
||||||
|
artifact-configuration-slug: 'Installers'
|
||||||
|
github-artifact-id: '${{ steps.upload-installers.outputs.artifact-id }}'
|
||||||
|
wait-for-completion: true
|
||||||
|
output-artifact-directory: 'Src/Setup/Temp/'
|
||||||
|
|
||||||
|
- name: Build setup and symbols
|
||||||
|
shell: cmd
|
||||||
|
env:
|
||||||
|
CS_VERSION: ${{ steps.versioning.outputs.NEW_VERSION }}
|
||||||
|
run: Src\Setup\BuildArchives.bat
|
||||||
|
|
||||||
|
- name: Upload symbols
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
Src/Setup/Final/OpenShellSymbols*.7z
|
||||||
|
archive: false
|
||||||
|
|
||||||
|
- name: Upload utility
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
Src/Setup/Final/Utility.exe
|
||||||
|
archive: false
|
||||||
|
|
||||||
|
- name: Upload setup
|
||||||
|
id: upload-setup
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
Src/Setup/Final/OpenShellSetup*.exe
|
||||||
|
archive: false
|
||||||
|
|
||||||
|
- name: Sign setup with SignPath
|
||||||
|
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds
|
||||||
|
uses: signpath/github-action-submit-signing-request@v2
|
||||||
|
with:
|
||||||
|
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
|
||||||
|
organization-id: 'b34b60e3-e5bf-4a6e-a13c-dcf641b4362c'
|
||||||
|
project-slug: 'Open-Shell-Menu'
|
||||||
|
signing-policy-slug: 'release-signing'
|
||||||
|
github-artifact-id: '${{ steps.upload-setup.outputs.artifact-id }}'
|
||||||
|
wait-for-completion: true
|
||||||
|
skip-decompress: true
|
||||||
|
output-artifact-directory: 'Src/Setup/Final/'
|
||||||
|
|
||||||
|
# `overwrite: true` doesn't work with `archive: false`, so we have to delete the original first
|
||||||
|
# https://github.com/actions/upload-artifact/issues/769
|
||||||
|
# https://github.com/actions/upload-artifact/issues/785
|
||||||
|
- name: Delete setup
|
||||||
|
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds
|
||||||
|
uses: geekyeggo/delete-artifact@v6
|
||||||
|
with:
|
||||||
|
name: OpenShellSetup*.exe
|
||||||
|
|
||||||
|
- name: Upload setup (signed)
|
||||||
|
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
Src/Setup/Final/OpenShellSetup*.exe
|
||||||
|
archive: false
|
||||||
|
overwrite: true
|
||||||
|
|
||||||
|
release:
|
||||||
|
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-latest # Cheaper/faster than windows for just uploading
|
||||||
|
permissions:
|
||||||
|
contents: write # Elevate permissions ONLY for this job
|
||||||
|
steps:
|
||||||
|
- name: Download setup
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
pattern: OpenShellSetup*.exe
|
||||||
|
- name: Download symbols
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
pattern: OpenShellSymbols*.7z
|
||||||
|
- name: Download utility
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
pattern: Utility.exe
|
||||||
|
|
||||||
|
- name: Create GitHub Release
|
||||||
|
uses: softprops/action-gh-release@v3
|
||||||
|
with:
|
||||||
|
tag_name: v${{ needs.build.outputs.new_version }}
|
||||||
|
name: ${{ needs.build.outputs.new_version }}
|
||||||
|
generate_release_notes: true
|
||||||
|
prerelease: true
|
||||||
|
files: |
|
||||||
|
OpenShellSetup*.exe
|
||||||
|
OpenShellSymbols_*.7z
|
||||||
|
Utility.exe
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -7,7 +7,7 @@ A collection of utilities bringing back classic features to Windows.
|
|||||||
|
|
||||||
*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/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)
|
[](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest) [](https://github.com/Open-Shell/Open-Shell-Menu/releases) [](https://github.com/Open-Shell/Open-Shell-Menu/actions/workflows/build.yml) [](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)
|
||||||
|
|
||||||
[Open-Shell Homepage](https://open-shell.github.io/Open-Shell-Menu)
|
[Open-Shell Homepage](https://open-shell.github.io/Open-Shell-Menu)
|
||||||
|
|
||||||
@@ -23,6 +23,9 @@ You can find the latest stable version here:
|
|||||||
|
|
||||||
[](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest)
|
[](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest)
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Free code signing provided by [SignPath.io](https://about.signpath.io/), certificate by [SignPath Foundation](https://signpath.org/)
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> #### Windows for ARM compatibility
|
> #### Windows for ARM compatibility
|
||||||
> Open-Shell is compatible with Windows for ARM since version [4.4.196](https://github.com/Open-Shell/Open-Shell-Menu/releases/tag/v4.4.196).
|
> Open-Shell is compatible with Windows for ARM since version [4.4.196](https://github.com/Open-Shell/Open-Shell-Menu/releases/tag/v4.4.196).
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ for other languages.
|
|||||||
The final files (installers, archives) are saved to the Setup\Final folder.
|
The final files (installers, archives) are saved to the Setup\Final folder.
|
||||||
|
|
||||||
You need the following tools:
|
You need the following tools:
|
||||||
Visual Studio 2022 (Community Edition is enough)
|
Visual Studio 2026 (Community Edition is enough)
|
||||||
- Desktop development with C++ workload
|
- Desktop development with C++ workload
|
||||||
- Windows 11 SDK (10.0.22621.0) for Desktop C++
|
- Windows 11 SDK (10.0.22621.0) for Desktop C++
|
||||||
- Visual C++ ATL support
|
- Visual C++ ATL support
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@
|
|||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Midl>
|
<Midl>
|
||||||
<MkTypLibCompatible>false</MkTypLibCompatible>
|
<MkTypLibCompatible>false</MkTypLibCompatible>
|
||||||
|
|||||||
@@ -1670,7 +1670,7 @@ LRESULT CSettingsDlg::OnBackup( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL&
|
|||||||
ofn.lpstrTitle=title;
|
ofn.lpstrTitle=title;
|
||||||
ofn.lpstrDefExt=L".xml";
|
ofn.lpstrDefExt=L".xml";
|
||||||
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
||||||
if (GetSaveFileName(&ofn))
|
if (GetSaveFileNameSafe(&ofn))
|
||||||
{
|
{
|
||||||
CString err=g_SettingsManager.SaveSettingsXml(path);
|
CString err=g_SettingsManager.SaveSettingsXml(path);
|
||||||
if (!err.IsEmpty())
|
if (!err.IsEmpty())
|
||||||
@@ -1699,7 +1699,7 @@ LRESULT CSettingsDlg::OnBackup( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL&
|
|||||||
CString title=LoadStringEx(IDS_XML_TITLE_LOAD);
|
CString title=LoadStringEx(IDS_XML_TITLE_LOAD);
|
||||||
ofn.lpstrTitle=title;
|
ofn.lpstrTitle=title;
|
||||||
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
||||||
if (GetOpenFileName(&ofn))
|
if (GetOpenFileNameSafe(&ofn))
|
||||||
{
|
{
|
||||||
SetCurTab(m_Index,true); // reload tab once to force-close any active edit boxes
|
SetCurTab(m_Index,true); // reload tab once to force-close any active edit boxes
|
||||||
CString error=g_SettingsManager.LoadSettingsXml(path);
|
CString error=g_SettingsManager.LoadSettingsXml(path);
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <uxtheme.h>
|
#include <uxtheme.h>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
const KNOWNFOLDERID FOLDERID_DesktopRoot={'DESK', 'TO', 'P', {'D', 'E', 'S', 'K', 'T', 'O', 'P', 0x00}};
|
const KNOWNFOLDERID FOLDERID_DesktopRoot={'DESK', 'TO', 'P', {'D', 'E', 'S', 'K', 'T', 'O', 'P', 0x00}};
|
||||||
|
|
||||||
@@ -1193,7 +1194,7 @@ bool BrowseCommandHelper( HWND parent, wchar_t *text )
|
|||||||
ofn.lpstrFile=text;
|
ofn.lpstrFile=text;
|
||||||
ofn.nMaxFile=_MAX_PATH;
|
ofn.nMaxFile=_MAX_PATH;
|
||||||
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_NODEREFERENCELINKS;
|
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_NODEREFERENCELINKS;
|
||||||
if (GetOpenFileName(&ofn))
|
if (GetOpenFileNameSafe(&ofn))
|
||||||
{
|
{
|
||||||
wchar_t buf[_MAX_PATH];
|
wchar_t buf[_MAX_PATH];
|
||||||
UnExpandEnvStrings(text,buf,_countof(buf));
|
UnExpandEnvStrings(text,buf,_countof(buf));
|
||||||
@@ -1216,7 +1217,8 @@ bool BrowseCommandHelper( HWND parent, wchar_t *text )
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BrowseLinkHelper( HWND parent, wchar_t *text, bool bFoldersOnly )
|
// Internal implementation that must be run on an STA thread with COM initialized.
|
||||||
|
static bool BrowseLinkHelperImpl( HWND parent, wchar_t *text, bool bFoldersOnly )
|
||||||
{
|
{
|
||||||
DoEnvironmentSubst(text,_MAX_PATH);
|
DoEnvironmentSubst(text,_MAX_PATH);
|
||||||
|
|
||||||
@@ -1276,6 +1278,41 @@ bool BrowseLinkHelper( HWND parent, wchar_t *text, bool bFoldersOnly )
|
|||||||
return pResult!=NULL;
|
return pResult!=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Run IFileOpenDialog on a separate STA thread and pump messages on the caller while waiting.
|
||||||
|
bool BrowseLinkHelper( HWND parent, wchar_t *text, bool bFoldersOnly )
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
std::thread worker([&parent, &text, &bFoldersOnly, &result]() mutable {
|
||||||
|
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
||||||
|
result = BrowseLinkHelperImpl(parent, text, bFoldersOnly);
|
||||||
|
CoUninitialize();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Pump messages while waiting for the worker (dialog) to finish
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
HANDLE hWorker = worker.native_handle();
|
||||||
|
if (MsgWaitForMultipleObjects(1, &hWorker, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
MSG msg;
|
||||||
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
||||||
|
{
|
||||||
|
if (msg.message == WM_QUIT)
|
||||||
|
{
|
||||||
|
PostQuitMessage((int)msg.wParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
worker.join();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
bool BrowseIconHelper( HWND parent, wchar_t *text )
|
bool BrowseIconHelper( HWND parent, wchar_t *text )
|
||||||
{
|
{
|
||||||
int id=0;
|
int id=0;
|
||||||
@@ -2011,7 +2048,7 @@ LRESULT CBrowseForIconDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, B
|
|||||||
CString title=LoadStringEx(IDS_ICON_TITLE);
|
CString title=LoadStringEx(IDS_ICON_TITLE);
|
||||||
ofn.lpstrTitle=title;
|
ofn.lpstrTitle=title;
|
||||||
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
||||||
if (GetOpenFileName(&ofn))
|
if (GetOpenFileNameSafe(&ofn))
|
||||||
{
|
{
|
||||||
wchar_t buf[_MAX_PATH];
|
wchar_t buf[_MAX_PATH];
|
||||||
UnExpandEnvStrings(path,buf,_countof(buf));
|
UnExpandEnvStrings(path,buf,_countof(buf));
|
||||||
@@ -2210,7 +2247,7 @@ bool BrowseForBitmap( HWND hWndParent, wchar_t *path, bool bAllowJpeg )
|
|||||||
CString title=LoadStringEx(IDS_BMP_TITLE);
|
CString title=LoadStringEx(IDS_BMP_TITLE);
|
||||||
ofn.lpstrTitle=title;
|
ofn.lpstrTitle=title;
|
||||||
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
||||||
if (GetOpenFileName(&ofn))
|
if (GetOpenFileNameSafe(&ofn))
|
||||||
{
|
{
|
||||||
wchar_t buf[_MAX_PATH];
|
wchar_t buf[_MAX_PATH];
|
||||||
UnExpandEnvStrings(path,buf,_countof(buf));
|
UnExpandEnvStrings(path,buf,_countof(buf));
|
||||||
@@ -2242,7 +2279,7 @@ bool BrowseForSound( HWND hWndParent, wchar_t *path )
|
|||||||
CString title=LoadStringEx(IDS_WAV_TITLE);
|
CString title=LoadStringEx(IDS_WAV_TITLE);
|
||||||
ofn.lpstrTitle=title;
|
ofn.lpstrTitle=title;
|
||||||
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
|
||||||
if (GetOpenFileName(&ofn))
|
if (GetOpenFileNameSafe(&ofn))
|
||||||
{
|
{
|
||||||
wchar_t buf[_MAX_PATH];
|
wchar_t buf[_MAX_PATH];
|
||||||
UnExpandEnvStrings(path,buf,_countof(buf));
|
UnExpandEnvStrings(path,buf,_countof(buf));
|
||||||
@@ -3630,3 +3667,49 @@ DWORD ParseColor(const wchar_t* str)
|
|||||||
wchar_t* end;
|
wchar_t* end;
|
||||||
return wcstoul(str, &end, 16) & 0xFFFFFF;
|
return wcstoul(str, &end, 16) & 0xFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Run GetOpenFileName/GetSaveFileName on a separate STA thread and pump messages on the caller
|
||||||
|
template <typename auto Fnc>
|
||||||
|
static BOOL GetFileNameSafe(OPENFILENAME* pOfn)
|
||||||
|
{
|
||||||
|
BOOL result = FALSE;
|
||||||
|
|
||||||
|
std::thread worker([&pOfn, &result]() mutable {
|
||||||
|
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
||||||
|
result = Fnc(pOfn);
|
||||||
|
CoUninitialize();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Pump messages while waiting for the worker (dialog) to finish
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
HANDLE hWorker = worker.native_handle();
|
||||||
|
if (MsgWaitForMultipleObjects(1, &hWorker, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
MSG msg;
|
||||||
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
||||||
|
{
|
||||||
|
if (msg.message == WM_QUIT)
|
||||||
|
{
|
||||||
|
PostQuitMessage((int)msg.wParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
worker.join();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL GetOpenFileNameSafe(OPENFILENAME* pOfn)
|
||||||
|
{
|
||||||
|
return GetFileNameSafe<GetOpenFileNameW>(pOfn);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL GetSaveFileNameSafe(OPENFILENAME* pOfn)
|
||||||
|
{
|
||||||
|
return GetFileNameSafe<GetSaveFileNameW>(pOfn);
|
||||||
|
}
|
||||||
|
|||||||
@@ -395,3 +395,7 @@ DWORD BgrToRgb(DWORD val);
|
|||||||
|
|
||||||
// parse color from hexadecimal string
|
// parse color from hexadecimal string
|
||||||
DWORD ParseColor(const wchar_t* str);
|
DWORD ParseColor(const wchar_t* str);
|
||||||
|
|
||||||
|
// safe versions of GetOpenFileName/GetSaveFileName (run API on a separate STA thread and pump messages on the caller)
|
||||||
|
BOOL GetOpenFileNameSafe(OPENFILENAME* pOfn);
|
||||||
|
BOOL GetSaveFileNameSafe(OPENFILENAME* pOfn);
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
<String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
|
<String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
|
||||||
<String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
|
<String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
|
||||||
<String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
|
<String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
|
||||||
<String Id="Advanced_Font_FaceName" Overridable="yes">"MS UI Gothic", "MS PGothic", "MS Pゴシック", "MS Gothic", "MS ゴシック", Osaka, Tahoma</String>
|
<String Id="Advanced_Font_FaceName" Overridable="yes">"MS UI Gothic", "MS PGothic", "MS Pゴシック", "MS Gothic", "MS ゴシック", Yu Gothic UI, Tahoma</String>
|
||||||
|
|
||||||
<String Id="BrowseDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
|
<String Id="BrowseDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
|
||||||
<String Id="BrowseDlgComboLabel" Overridable="yes">場所(&L):</String>
|
<String Id="BrowseDlgComboLabel" Overridable="yes">場所(&L):</String>
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 17
|
# Visual Studio Version 18
|
||||||
VisualStudioVersion = 17.4.33205.214
|
VisualStudioVersion = 18.6.11806.211 stable
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Skins", "Skins", "{409484D8-C0DB-4991-AF03-124128EDEF98}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Skins", "Skins", "{409484D8-C0DB-4991-AF03-124128EDEF98}"
|
||||||
EndProject
|
EndProject
|
||||||
|
|||||||
+143
-1
@@ -1,5 +1,145 @@
|
|||||||
|
@echo off
|
||||||
|
set PATH=C:\Program Files\7-Zip\;%PATH%
|
||||||
|
cd %~dp0
|
||||||
|
|
||||||
|
call _Version.bat
|
||||||
|
|
||||||
|
REM ********* Build MSI Checksums
|
||||||
|
echo --- MSI Checksums
|
||||||
|
..\..\build\bin\Release\Utility.exe crcmsi Temp
|
||||||
|
@if ERRORLEVEL 1 exit /b 1
|
||||||
|
|
||||||
|
REM ********* Build bootstrapper
|
||||||
|
echo --- Bootstrapper
|
||||||
|
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do set MSBuildDir=%%i\MSBuild\Current\Bin\
|
||||||
|
|
||||||
|
"%MSBuildDir%MSBuild.exe" Setup.sln /m /t:Rebuild /p:Configuration="Release" /p:Platform="Win32" /verbosity:quiet /nologo
|
||||||
|
@if ERRORLEVEL 1 exit /b 1
|
||||||
|
|
||||||
|
|
||||||
|
if exist Final rd /Q /S Final
|
||||||
|
md Final
|
||||||
|
|
||||||
|
copy /B ..\..\build\bin\Release\Setup.exe Final\OpenShellSetup_%CS_VERSION_STR%.exe > nul
|
||||||
|
|
||||||
|
if defined APPVEYOR (
|
||||||
|
appveyor PushArtifact Final\OpenShellSetup_%CS_VERSION_STR%.exe
|
||||||
|
)
|
||||||
|
|
||||||
REM ***** Collect PDBs
|
REM ***** Collect PDBs
|
||||||
|
|
||||||
|
REM ********* Collect debug info
|
||||||
|
md Output\PDB32
|
||||||
|
md Output\PDB64
|
||||||
|
md Output\PDBARM64
|
||||||
|
|
||||||
|
REM Explorer 32
|
||||||
|
copy /B ..\..\build\bin\Setup\ClassicExplorer32.pdb Output\PDB32 > nul
|
||||||
|
copy /B Output\ClassicExplorer32.dll Output\PDB32 > nul
|
||||||
|
copy /B ..\..\build\bin\Setup\ClassicExplorerSettings.pdb Output\PDB32 > nul
|
||||||
|
copy /B Output\ClassicExplorerSettings.exe Output\PDB32 > nul
|
||||||
|
|
||||||
|
REM Explorer 64
|
||||||
|
copy /B ..\..\build\bin\Setup64\ClassicExplorer64.pdb Output\PDB64 > nul
|
||||||
|
copy /B Output\x64\ClassicExplorer64.dll Output\PDB64 > nul
|
||||||
|
|
||||||
|
REM Explorer ARM64
|
||||||
|
copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.pdb Output\PDBARM64 > nul
|
||||||
|
copy /B Output\ARM64\ClassicExplorer64.dll Output\PDBARM64 > nul
|
||||||
|
|
||||||
|
REM IE 32
|
||||||
|
copy /B ..\..\build\bin\Setup\ClassicIEDLL_32.pdb Output\PDB32 > nul
|
||||||
|
copy /B Output\ClassicIEDLL_32.dll Output\PDB32 > nul
|
||||||
|
copy /B ..\..\build\bin\Setup\ClassicIE_32.pdb Output\PDB32 > nul
|
||||||
|
copy /B Output\ClassicIE_32.exe Output\PDB32 > nul
|
||||||
|
|
||||||
|
REM IE 64
|
||||||
|
copy /B ..\..\build\bin\Setup64\ClassicIEDLL_64.pdb Output\PDB64 > nul
|
||||||
|
copy /B Output\x64\ClassicIEDLL_64.dll Output\PDB64 > nul
|
||||||
|
copy /B ..\..\build\bin\Setup64\ClassicIE_64.pdb Output\PDB64 > nul
|
||||||
|
copy /B Output\x64\ClassicIE_64.exe Output\PDB64 > nul
|
||||||
|
|
||||||
|
REM IE ARM64
|
||||||
|
copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.pdb Output\PDBARM64 > nul
|
||||||
|
copy /B Output\ARM64\ClassicIEDLL_64.dll Output\PDBARM64 > nul
|
||||||
|
copy /B ..\..\build\bin\SetupARM64\ClassicIE_64.pdb Output\PDBARM64 > nul
|
||||||
|
copy /B Output\ARM64\ClassicIE_64.exe Output\PDBARM64 > nul
|
||||||
|
|
||||||
|
REM Menu 32
|
||||||
|
copy /B ..\..\build\bin\Setup\StartMenu.pdb Output\PDB32 > nul
|
||||||
|
copy /B Output\StartMenu.exe Output\PDB32 > nul
|
||||||
|
copy /B ..\..\build\bin\Setup\StartMenuDLL.pdb Output\PDB32 > nul
|
||||||
|
copy /B Output\StartMenuDLL.dll Output\PDB32 > nul
|
||||||
|
copy /B ..\..\build\bin\Setup\StartMenuHelper32.pdb Output\PDB32 > nul
|
||||||
|
copy /B Output\StartMenuHelper32.dll Output\PDB32 > nul
|
||||||
|
copy /B ..\..\build\bin\Release\Update.pdb Output\PDB32 > nul
|
||||||
|
copy /B Output\Update.exe Output\PDB32 > nul
|
||||||
|
copy /B ..\..\build\bin\Release\DesktopToasts.pdb Output\PDB32 > nul
|
||||||
|
copy /B Output\DesktopToasts.dll Output\PDB32 > nul
|
||||||
|
|
||||||
|
REM Menu 64
|
||||||
|
copy /B ..\..\build\bin\Setup64\StartMenu.pdb Output\PDB64 > nul
|
||||||
|
copy /B Output\x64\StartMenu.exe Output\PDB64 > nul
|
||||||
|
copy /B ..\..\build\bin\Setup64\StartMenuDLL.pdb Output\PDB64 > nul
|
||||||
|
copy /B Output\x64\StartMenuDLL.dll Output\PDB64 > nul
|
||||||
|
copy /B ..\..\build\bin\Setup64\StartMenuHelper64.pdb Output\PDB64 > nul
|
||||||
|
copy /B Output\x64\StartMenuHelper64.dll Output\PDB64 > nul
|
||||||
|
|
||||||
|
REM Menu ARM64
|
||||||
|
copy /B ..\..\build\bin\SetupARM64\StartMenu.pdb Output\PDBARM64 > nul
|
||||||
|
copy /B Output\ARM64\StartMenu.exe Output\PDBARM64 > nul
|
||||||
|
copy /B ..\..\build\bin\SetupARM64\StartMenuDLL.pdb Output\PDBARM64 > nul
|
||||||
|
copy /B Output\ARM64\StartMenuDLL.dll Output\PDBARM64 > nul
|
||||||
|
copy /B ..\..\build\bin\SetupARM64\StartMenuHelper64.pdb Output\PDBARM64 > nul
|
||||||
|
copy /B Output\ARM64\StartMenuHelper64.dll Output\PDBARM64 > nul
|
||||||
|
|
||||||
|
REM ********* Source Index PDBs
|
||||||
|
|
||||||
|
set PDBSTR_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\srcsrv\pdbstr.exe"
|
||||||
|
|
||||||
|
if exist %PDBSTR_PATH% (
|
||||||
|
echo --- Adding source index to PDBs
|
||||||
|
call CreateSourceIndex.bat ..\.. > Output\pdbstr.txt
|
||||||
|
|
||||||
|
for %%f in (Output\PDB32\*.pdb) do (
|
||||||
|
%PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt
|
||||||
|
if not ERRORLEVEL 0 (
|
||||||
|
echo Error adding source index to PDB
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
for %%f in (Output\PDB64\*.pdb) do (
|
||||||
|
%PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt
|
||||||
|
if not ERRORLEVEL 0 (
|
||||||
|
echo Error adding source index to PDB
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
for %%f in (Output\PDBARM64\*.pdb) do (
|
||||||
|
%PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt
|
||||||
|
if not ERRORLEVEL 0 (
|
||||||
|
echo Error adding source index to PDB
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
REM ********* Prepare symbols
|
||||||
|
|
||||||
|
set SYMSTORE_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore.exe"
|
||||||
|
|
||||||
|
%SYMSTORE_PATH% add /r /f Output\PDB32 /s Output\symbols /t OpenShell -:NOREFS > nul
|
||||||
|
%SYMSTORE_PATH% add /r /f Output\PDB64 /s Output\symbols /t OpenShell -:NOREFS > nul
|
||||||
|
%SYMSTORE_PATH% add /r /f Output\PDBARM64 /s Output\symbols /t OpenShell -:NOREFS > nul
|
||||||
|
rd /Q /S Output\symbols\000Admin > nul
|
||||||
|
del Output\symbols\pingme.txt > nul
|
||||||
|
|
||||||
|
rd /Q /S Output\PDB32
|
||||||
|
rd /Q /S Output\PDB64
|
||||||
|
rd /Q /S Output\PDBARM64
|
||||||
|
|
||||||
echo -- Creating symbols package
|
echo -- Creating symbols package
|
||||||
set CS_SYMBOLS_NAME=OpenShellSymbols_%CS_VERSION_STR%.7z
|
set CS_SYMBOLS_NAME=OpenShellSymbols_%CS_VERSION_STR%.7z
|
||||||
|
|
||||||
@@ -20,8 +160,10 @@ cd ..
|
|||||||
|
|
||||||
cd Setup
|
cd Setup
|
||||||
|
|
||||||
|
copy /B Output\Utility.exe .\Final > nul
|
||||||
|
|
||||||
if defined APPVEYOR (
|
if defined APPVEYOR (
|
||||||
appveyor PushArtifact ..\..\build\bin\Release\Utility.exe
|
appveyor PushArtifact Output\Utility.exe
|
||||||
)
|
)
|
||||||
|
|
||||||
exit /b 0
|
exit /b 0
|
||||||
|
|||||||
+9
-114
@@ -1,8 +1,15 @@
|
|||||||
|
@echo off
|
||||||
|
cd %~dp0
|
||||||
|
|
||||||
|
call _Version.bat
|
||||||
|
|
||||||
if exist Output rd /Q /S Output
|
if exist Output rd /Q /S Output
|
||||||
md Output
|
md Output
|
||||||
md Output\x64
|
md Output\x64
|
||||||
md Output\ARM64
|
md Output\ARM64
|
||||||
|
|
||||||
|
"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationName
|
||||||
|
|
||||||
echo -- Compiling
|
echo -- Compiling
|
||||||
|
|
||||||
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do set MSBuildDir=%%i\MSBuild\Current\Bin\
|
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do set MSBuildDir=%%i\MSBuild\Current\Bin\
|
||||||
@@ -50,6 +57,7 @@ copy /B ..\..\build\bin\Setup\StartMenuHelper32.dll Output > nul
|
|||||||
copy /B ..\..\build\bin\Release\Update.exe Output > nul
|
copy /B ..\..\build\bin\Release\Update.exe Output > nul
|
||||||
copy /B ..\..\build\bin\Release\DesktopToasts.dll Output > nul
|
copy /B ..\..\build\bin\Release\DesktopToasts.dll Output > nul
|
||||||
copy /B ..\..\build\bin\Release\SetupHelper.exe Output > nul
|
copy /B ..\..\build\bin\Release\SetupHelper.exe Output > nul
|
||||||
|
copy /B ..\..\build\bin\Release\Utility.exe Output > nul
|
||||||
|
|
||||||
copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.dll Output\ARM64 > nul
|
copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.dll Output\ARM64 > nul
|
||||||
copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.dll Output\ARM64 > nul
|
copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.dll Output\ARM64 > nul
|
||||||
@@ -82,119 +90,6 @@ copy /B "..\..\build\bin\Skins\Metallic.skin7" Output > nul
|
|||||||
copy /B "..\..\build\bin\Skins\Immersive.skin" Output > nul
|
copy /B "..\..\build\bin\Skins\Immersive.skin" Output > nul
|
||||||
copy /B "..\..\build\bin\Skins\Immersive.skin7" Output > nul
|
copy /B "..\..\build\bin\Skins\Immersive.skin7" Output > nul
|
||||||
|
|
||||||
|
|
||||||
REM ********* Collect debug info
|
|
||||||
md Output\PDB32
|
|
||||||
md Output\PDB64
|
|
||||||
md Output\PDBARM64
|
|
||||||
|
|
||||||
REM Explorer 32
|
|
||||||
copy /B ..\..\build\bin\Setup\ClassicExplorer32.pdb Output\PDB32 > nul
|
|
||||||
copy /B Output\ClassicExplorer32.dll Output\PDB32 > nul
|
|
||||||
copy /B ..\..\build\bin\Setup\ClassicExplorerSettings.pdb Output\PDB32 > nul
|
|
||||||
copy /B Output\ClassicExplorerSettings.exe Output\PDB32 > nul
|
|
||||||
|
|
||||||
REM Explorer 64
|
|
||||||
copy /B ..\..\build\bin\Setup64\ClassicExplorer64.pdb Output\PDB64 > nul
|
|
||||||
copy /B Output\x64\ClassicExplorer64.dll Output\PDB64 > nul
|
|
||||||
|
|
||||||
REM Explorer ARM64
|
|
||||||
copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.pdb Output\PDBARM64 > nul
|
|
||||||
copy /B Output\ARM64\ClassicExplorer64.dll Output\PDBARM64 > nul
|
|
||||||
|
|
||||||
REM IE 32
|
|
||||||
copy /B ..\..\build\bin\Setup\ClassicIEDLL_32.pdb Output\PDB32 > nul
|
|
||||||
copy /B Output\ClassicIEDLL_32.dll Output\PDB32 > nul
|
|
||||||
copy /B ..\..\build\bin\Setup\ClassicIE_32.pdb Output\PDB32 > nul
|
|
||||||
copy /B Output\ClassicIE_32.exe Output\PDB32 > nul
|
|
||||||
|
|
||||||
REM IE 64
|
|
||||||
copy /B ..\..\build\bin\Setup64\ClassicIEDLL_64.pdb Output\PDB64 > nul
|
|
||||||
copy /B Output\x64\ClassicIEDLL_64.dll Output\PDB64 > nul
|
|
||||||
copy /B ..\..\build\bin\Setup64\ClassicIE_64.pdb Output\PDB64 > nul
|
|
||||||
copy /B Output\x64\ClassicIE_64.exe Output\PDB64 > nul
|
|
||||||
|
|
||||||
REM IE ARM64
|
|
||||||
copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.pdb Output\PDBARM64 > nul
|
|
||||||
copy /B Output\ARM64\ClassicIEDLL_64.dll Output\PDBARM64 > nul
|
|
||||||
copy /B ..\..\build\bin\SetupARM64\ClassicIE_64.pdb Output\PDBARM64 > nul
|
|
||||||
copy /B Output\ARM64\ClassicIE_64.exe Output\PDBARM64 > nul
|
|
||||||
|
|
||||||
REM Menu 32
|
|
||||||
copy /B ..\..\build\bin\Setup\StartMenu.pdb Output\PDB32 > nul
|
|
||||||
copy /B Output\StartMenu.exe Output\PDB32 > nul
|
|
||||||
copy /B ..\..\build\bin\Setup\StartMenuDLL.pdb Output\PDB32 > nul
|
|
||||||
copy /B Output\StartMenuDLL.dll Output\PDB32 > nul
|
|
||||||
copy /B ..\..\build\bin\Setup\StartMenuHelper32.pdb Output\PDB32 > nul
|
|
||||||
copy /B Output\StartMenuHelper32.dll Output\PDB32 > nul
|
|
||||||
copy /B ..\..\build\bin\Release\Update.pdb Output\PDB32 > nul
|
|
||||||
copy /B Output\Update.exe Output\PDB32 > nul
|
|
||||||
copy /B ..\..\build\bin\Release\DesktopToasts.pdb Output\PDB32 > nul
|
|
||||||
copy /B Output\DesktopToasts.dll Output\PDB32 > nul
|
|
||||||
|
|
||||||
REM Menu 64
|
|
||||||
copy /B ..\..\build\bin\Setup64\StartMenu.pdb Output\PDB64 > nul
|
|
||||||
copy /B Output\x64\StartMenu.exe Output\PDB64 > nul
|
|
||||||
copy /B ..\..\build\bin\Setup64\StartMenuDLL.pdb Output\PDB64 > nul
|
|
||||||
copy /B Output\x64\StartMenuDLL.dll Output\PDB64 > nul
|
|
||||||
copy /B ..\..\build\bin\Setup64\StartMenuHelper64.pdb Output\PDB64 > nul
|
|
||||||
copy /B Output\x64\StartMenuHelper64.dll Output\PDB64 > nul
|
|
||||||
|
|
||||||
REM Menu ARM64
|
|
||||||
copy /B ..\..\build\bin\SetupARM64\StartMenu.pdb Output\PDBARM64 > nul
|
|
||||||
copy /B Output\ARM64\StartMenu.exe Output\PDBARM64 > nul
|
|
||||||
copy /B ..\..\build\bin\SetupARM64\StartMenuDLL.pdb Output\PDBARM64 > nul
|
|
||||||
copy /B Output\ARM64\StartMenuDLL.dll Output\PDBARM64 > nul
|
|
||||||
copy /B ..\..\build\bin\SetupARM64\StartMenuHelper64.pdb Output\PDBARM64 > nul
|
|
||||||
copy /B Output\ARM64\StartMenuHelper64.dll Output\PDBARM64 > nul
|
|
||||||
|
|
||||||
REM ********* Source Index PDBs
|
|
||||||
|
|
||||||
set PDBSTR_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\srcsrv\pdbstr.exe"
|
|
||||||
|
|
||||||
if exist %PDBSTR_PATH% (
|
|
||||||
echo --- Adding source index to PDBs
|
|
||||||
call CreateSourceIndex.bat ..\.. > Output\pdbstr.txt
|
|
||||||
|
|
||||||
for %%f in (Output\PDB32\*.pdb) do (
|
|
||||||
%PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt
|
|
||||||
if not ERRORLEVEL 0 (
|
|
||||||
echo Error adding source index to PDB
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
for %%f in (Output\PDB64\*.pdb) do (
|
|
||||||
%PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt
|
|
||||||
if not ERRORLEVEL 0 (
|
|
||||||
echo Error adding source index to PDB
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
for %%f in (Output\PDBARM64\*.pdb) do (
|
|
||||||
%PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt
|
|
||||||
if not ERRORLEVEL 0 (
|
|
||||||
echo Error adding source index to PDB
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
REM ********* Prepare symbols
|
|
||||||
|
|
||||||
set SYMSTORE_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore.exe"
|
|
||||||
|
|
||||||
%SYMSTORE_PATH% add /r /f Output\PDB32 /s Output\symbols /t OpenShell -:NOREFS > nul
|
|
||||||
%SYMSTORE_PATH% add /r /f Output\PDB64 /s Output\symbols /t OpenShell -:NOREFS > nul
|
|
||||||
%SYMSTORE_PATH% add /r /f Output\PDBARM64 /s Output\symbols /t OpenShell -:NOREFS > nul
|
|
||||||
rd /Q /S Output\symbols\000Admin > nul
|
|
||||||
del Output\symbols\pingme.txt > nul
|
|
||||||
|
|
||||||
rd /Q /S Output\PDB32
|
|
||||||
rd /Q /S Output\PDB64
|
|
||||||
rd /Q /S Output\PDBARM64
|
|
||||||
|
|
||||||
REM ********* Build ADMX
|
REM ********* Build ADMX
|
||||||
echo --- ADMX
|
echo --- ADMX
|
||||||
if exist Output\PolicyDefinitions.zip (
|
if exist Output\PolicyDefinitions.zip (
|
||||||
@@ -209,7 +104,7 @@ cd ..\Localization\English
|
|||||||
@if ERRORLEVEL 1 exit /b 1
|
@if ERRORLEVEL 1 exit /b 1
|
||||||
md en-US
|
md en-US
|
||||||
copy /B *.adml en-US > nul
|
copy /B *.adml en-US > nul
|
||||||
7z a ..\..\Setup\Output\PolicyDefinitions.zip *.admx en-US\*.adml PolicyDefinitions.rtf > nul
|
tar -a -c -f ..\..\Setup\Output\PolicyDefinitions.zip *.admx en-US\*.adml PolicyDefinitions.rtf
|
||||||
rd /Q /S en-US
|
rd /Q /S en-US
|
||||||
cd ..\..\Setup
|
cd ..\..\Setup
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
@echo off
|
||||||
|
set PATH=C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.14\bin\;%PATH%
|
||||||
|
cd %~dp0
|
||||||
|
|
||||||
|
call _Version.bat
|
||||||
|
|
||||||
REM ********* Build Help
|
REM ********* Build Help
|
||||||
echo -- Building Installer (%CS_LANG_NAME_SHORT%)
|
echo -- Building Installer (%CS_LANG_NAME_SHORT%)
|
||||||
@setlocal EnableDelayedExpansion
|
@setlocal EnableDelayedExpansion
|
||||||
@@ -22,9 +28,6 @@ echo -- Building Installer (%CS_LANG_NAME_SHORT%)
|
|||||||
@if _%CS_LANG_NAME%==_ echo Unrecognized language '%CS_LANG_FOLDER%'
|
@if _%CS_LANG_NAME%==_ echo Unrecognized language '%CS_LANG_FOLDER%'
|
||||||
@if _%CS_LANG_NAME%==_ exit /b 1
|
@if _%CS_LANG_NAME%==_ exit /b 1
|
||||||
|
|
||||||
SET CS_INSTALLER_NAME=OpenShellSetup_%CS_VERSION_STR%-%CS_LANG_NAME_SHORT%
|
|
||||||
if %CS_LANG_NAME_SHORT%==en SET CS_INSTALLER_NAME=OpenShellSetup_%CS_VERSION_STR%
|
|
||||||
|
|
||||||
if exist Temp rd /Q /S Temp
|
if exist Temp rd /Q /S Temp
|
||||||
md Temp
|
md Temp
|
||||||
|
|
||||||
@@ -66,27 +69,6 @@ candle Setup.wxs -nologo -out Temp\SetupARM64.wixobj -ext WixUIExtension -ext Wi
|
|||||||
light Temp\SetupARM64.wixobj -nologo -out Temp\SetupARM64.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09
|
light Temp\SetupARM64.wixobj -nologo -out Temp\SetupARM64.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09
|
||||||
@if ERRORLEVEL 1 exit /b 1
|
@if ERRORLEVEL 1 exit /b 1
|
||||||
|
|
||||||
REM ********* Build MSI Checksums
|
|
||||||
echo --- MSI Checksums
|
|
||||||
..\..\build\bin\Release\Utility.exe crcmsi Temp
|
|
||||||
@if ERRORLEVEL 1 exit /b 1
|
|
||||||
|
|
||||||
REM ********* Build bootstrapper
|
|
||||||
echo --- Bootstrapper
|
|
||||||
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do set MSBuildDir=%%i\MSBuild\Current\Bin\
|
|
||||||
|
|
||||||
"%MSBuildDir%MSBuild.exe" Setup.sln /m /t:Rebuild /p:Configuration="Release" /p:Platform="Win32" /verbosity:quiet /nologo
|
|
||||||
@if ERRORLEVEL 1 exit /b 1
|
|
||||||
|
|
||||||
if exist Final rd /Q /S Final
|
|
||||||
md Final
|
|
||||||
|
|
||||||
copy /B ..\..\build\bin\Release\Setup.exe Final\%CS_INSTALLER_NAME%.exe > nul
|
|
||||||
|
|
||||||
if defined APPVEYOR (
|
|
||||||
appveyor PushArtifact Final\%CS_INSTALLER_NAME%.exe
|
|
||||||
)
|
|
||||||
|
|
||||||
SET CS_LANG_FOLDER=
|
SET CS_LANG_FOLDER=
|
||||||
SET CS_LANG_NAME=
|
SET CS_LANG_NAME=
|
||||||
SET CS_LANG_NAME_SHORT=
|
SET CS_LANG_NAME_SHORT=
|
||||||
|
|||||||
@@ -30,17 +30,17 @@
|
|||||||
#ifdef SAFE_MODE
|
#ifdef SAFE_MODE
|
||||||
#define RegDeleteTree2(x,y) 5
|
#define RegDeleteTree2(x,y) 5
|
||||||
#define RegDeleteValue2(x,y) 5
|
#define RegDeleteValue2(x,y) 5
|
||||||
#define DeleteFile2(x) (SetLastError(3), FALSE)
|
#define DeleteFile3(x) (SetLastError(3), FALSE)
|
||||||
#define MoveFileEx2(x,y,z) (SetLastError(5), FALSE)
|
#define MoveFileEx2(x,y,z) (SetLastError(5), FALSE)
|
||||||
#define SHFileOperation2(x) 0x78
|
#define SHFileOperation2(x) 0x78
|
||||||
#define RemoveDirectory2(x) FALSE
|
#define RemoveDirectory3(x) FALSE
|
||||||
#else
|
#else
|
||||||
#define RegDeleteTree2(x,y) RegDeleteTree(x,y)
|
#define RegDeleteTree2(x,y) RegDeleteTree(x,y)
|
||||||
#define RegDeleteValue2(x,y) RegDeleteValue(x,y)
|
#define RegDeleteValue2(x,y) RegDeleteValue(x,y)
|
||||||
#define DeleteFile2(x) DeleteFile(x)
|
#define DeleteFile3(x) DeleteFile(x)
|
||||||
#define MoveFileEx2(x,y,z) MoveFileEx(x,y,z)
|
#define MoveFileEx2(x,y,z) MoveFileEx(x,y,z)
|
||||||
#define SHFileOperation2(x) SHFileOperation(x)
|
#define SHFileOperation2(x) SHFileOperation(x)
|
||||||
#define RemoveDirectory2(x) RemoveDirectory(x)
|
#define RemoveDirectory3(x) RemoveDirectory(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// files to delete from the Open-Shell folder
|
// files to delete from the Open-Shell folder
|
||||||
@@ -777,7 +777,7 @@ static bool DeleteFileEx( const wchar_t *fname, bool bAllowDelay )
|
|||||||
if (attribs&FILE_ATTRIBUTE_READONLY)
|
if (attribs&FILE_ATTRIBUTE_READONLY)
|
||||||
SetFileAttributes(fname,attribs&~FILE_ATTRIBUTE_READONLY);
|
SetFileAttributes(fname,attribs&~FILE_ATTRIBUTE_READONLY);
|
||||||
LogMessage(-1,L"Deleting file %s",fname);
|
LogMessage(-1,L"Deleting file %s",fname);
|
||||||
if (!DeleteFile2(fname))
|
if (!DeleteFile3(fname))
|
||||||
{
|
{
|
||||||
int error=GetLastError();
|
int error=GetLastError();
|
||||||
if (error==ERROR_ACCESS_DENIED && bAllowDelay)
|
if (error==ERROR_ACCESS_DENIED && bAllowDelay)
|
||||||
@@ -826,7 +826,7 @@ static void DeleteDirectoryEx( const wchar_t *path, bool bDelay )
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogMessage(-1,L"Deleting directory %s",path);
|
LogMessage(-1,L"Deleting directory %s",path);
|
||||||
if (!RemoveDirectory2(path))
|
if (!RemoveDirectory3(path))
|
||||||
{
|
{
|
||||||
int error=GetLastError();
|
int error=GetLastError();
|
||||||
bool bOldHasErrors=g_bHasErrors;
|
bool bOldHasErrors=g_bHasErrors;
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
@echo off
|
||||||
|
cd %~dp0
|
||||||
|
|
||||||
SET CS_LANG_FOLDER=English
|
SET CS_LANG_FOLDER=English
|
||||||
SET CS_LANG_NAME=en-US
|
SET CS_LANG_NAME=en-US
|
||||||
SET CS_LANG_NAME_SHORT=en
|
SET CS_LANG_NAME_SHORT=en
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
rem Convert . to _
|
||||||
|
set CS_VERSION_STR=%CS_VERSION:.=_%
|
||||||
|
|
||||||
|
set CS_VERSION_ORIG=%CS_VERSION%
|
||||||
|
|
||||||
|
rem Strip optional "-xyz" suffix from version
|
||||||
|
for /f "delims=- tokens=1,1" %%i in ("%CS_VERSION%") do set CS_VERSION=%%i
|
||||||
@@ -383,7 +383,7 @@ private:
|
|||||||
static DWORD CALLBACK StaticRefreshInfoThread( void *param );
|
static DWORD CALLBACK StaticRefreshInfoThread( void *param );
|
||||||
static DWORD CALLBACK SaveCacheFileThread( void *param );
|
static DWORD CALLBACK SaveCacheFileThread( void *param );
|
||||||
|
|
||||||
// all paths are in caps and end with \
|
// all paths are in caps and end with backslash
|
||||||
CString m_RootStartMenu1;
|
CString m_RootStartMenu1;
|
||||||
CString m_RootStartMenu2;
|
CString m_RootStartMenu2;
|
||||||
CString m_RootStartMenu3;
|
CString m_RootStartMenu3;
|
||||||
|
|||||||
@@ -24,6 +24,60 @@
|
|||||||
#include <propvarutil.h>
|
#include <propvarutil.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <propkey.h>
|
#include <propkey.h>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
// Execute function on a separate STA thread while pumping messages on caller thread.
|
||||||
|
template <typename TFunc>
|
||||||
|
static auto ExecuteOnSTAThread(TFunc&& func) -> decltype(func())
|
||||||
|
{
|
||||||
|
using ReturnType = decltype(func());
|
||||||
|
ReturnType result{};
|
||||||
|
|
||||||
|
std::thread worker([&func, &result]() mutable {
|
||||||
|
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
||||||
|
result = func();
|
||||||
|
CoUninitialize();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Pump messages while waiting for the worker (dialog) to finish
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
HANDLE hWorker = worker.native_handle();
|
||||||
|
if (MsgWaitForMultipleObjects(1, &hWorker, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
MSG msg;
|
||||||
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
||||||
|
{
|
||||||
|
if (msg.message == WM_QUIT)
|
||||||
|
{
|
||||||
|
PostQuitMessage((int)msg.wParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
worker.join();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapper for IContextMenu::InvokeCommand that runs on separate STA thread and pumps messages
|
||||||
|
static HRESULT InvokeCommandSafe(IContextMenu* pMenu, LPCMINVOKECOMMANDINFO pInfo)
|
||||||
|
{
|
||||||
|
return ExecuteOnSTAThread([&]() {
|
||||||
|
return pMenu->InvokeCommand(pInfo);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapper for SHOpenFolderAndSelectItems that runs on separate STA thread and pumps messages
|
||||||
|
static HRESULT SHOpenFolderAndSelectItemsSafe(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD dwFlags)
|
||||||
|
{
|
||||||
|
return ExecuteOnSTAThread([=]() {
|
||||||
|
return SHOpenFolderAndSelectItems(pidlFolder, cidl, apidl, dwFlags);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
static CString g_RenameText;
|
static CString g_RenameText;
|
||||||
static POINT g_RenamePos;
|
static POINT g_RenamePos;
|
||||||
@@ -935,7 +989,7 @@ static bool ExecuteShutdownCommand(TMenuID menuCommand)
|
|||||||
if (!ProceedWithShutdown(flags))
|
if (!ProceedWithShutdown(flags))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
flags |= SHUTDOWN_FORCE_OTHERS;
|
flags |= SHUTDOWN_FORCE_OTHERS | SHUTDOWN_ARSO;
|
||||||
|
|
||||||
if (SetShutdownPrivileges())
|
if (SetShutdownPrivileges())
|
||||||
{
|
{
|
||||||
@@ -2871,7 +2925,7 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SHOpenFolderAndSelectItems(pItemPidl1,0,NULL,0);
|
SHOpenFolderAndSelectItemsSafe(pItemPidl1,0,NULL,0);
|
||||||
}
|
}
|
||||||
res=0;
|
res=0;
|
||||||
}
|
}
|
||||||
@@ -3113,7 +3167,7 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HRESULT hr=pInvokeMenu->InvokeCommand((LPCMINVOKECOMMANDINFO)&info);
|
HRESULT hr=InvokeCommandSafe(pInvokeMenu,(LPCMINVOKECOMMANDINFO)&info);
|
||||||
LOG_MENU(LOG_EXECUTE,L"Invoke command, ptr=%p, res=%d",this,hr);
|
LOG_MENU(LOG_EXECUTE,L"Invoke command, ptr=%p, res=%d",this,hr);
|
||||||
executeSuccess=SUCCEEDED(hr);
|
executeSuccess=SUCCEEDED(hr);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6366,7 +6366,10 @@ LRESULT CMenuContainer::OnRefresh( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_Items[m_OriginalCount].id==MENU_SEARCH_CATEGORY)
|
else if (m_Items[m_OriginalCount].id==MENU_SEARCH_CATEGORY)
|
||||||
hotItem=m_OriginalCount+1;
|
{
|
||||||
|
if (!bSearching || !s_SearchResults.programs.empty())
|
||||||
|
hotItem=m_OriginalCount+1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
hotItem=-1;
|
hotItem=-1;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include <dbghelp.h>
|
#include <dbghelp.h>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <Thumbcache.h>
|
#include <Thumbcache.h>
|
||||||
|
#include <tlhelp32.h>
|
||||||
|
|
||||||
#define HOOK_DROPTARGET // define this to replace the IDropTarget of the start button
|
#define HOOK_DROPTARGET // define this to replace the IDropTarget of the start button
|
||||||
#define START_TOUCH // touch support for the start button
|
#define START_TOUCH // touch support for the start button
|
||||||
@@ -1624,7 +1625,7 @@ static void ComputeTaskbarColors( int *data )
|
|||||||
{
|
{
|
||||||
bool bDefLook;
|
bool bDefLook;
|
||||||
int look=GetSettingInt(L"TaskbarLook",bDefLook);
|
int look=GetSettingInt(L"TaskbarLook",bDefLook);
|
||||||
if (GetWinVersion()<WIN_VER_WIN10 || look==TASKBAR_AEROGLASS || (look==TASKBAR_TRANSPARENT && g_TaskbarTexture))
|
if (GetWinVersion()<WIN_VER_WIN10 || !IsAppThemed() || look==TASKBAR_AEROGLASS || (look==TASKBAR_TRANSPARENT && g_TaskbarTexture))
|
||||||
{
|
{
|
||||||
memset(data,0,16);
|
memset(data,0,16);
|
||||||
}
|
}
|
||||||
@@ -1872,6 +1873,7 @@ static LRESULT CALLBACK SubclassTaskBarProc( HWND hWnd, UINT uMsg, WPARAM wParam
|
|||||||
ComputeTaskbarColors(data);
|
ComputeTaskbarColors(data);
|
||||||
WINCOMPATTRDATA attrData={0x13,&data,sizeof(data)};
|
WINCOMPATTRDATA attrData={0x13,&data,sizeof(data)};
|
||||||
SetWindowCompositionAttribute(hWnd,&attrData);
|
SetWindowCompositionAttribute(hWnd,&attrData);
|
||||||
|
UpdateTaskBars(TASKBAR_UPDATE_TEXTURE);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
if ((uMsg==WM_DWMCOLORIZATIONCOLORCHANGED || uMsg==WM_SETTINGCHANGE) && taskBar && taskBar->bCustomLook && SetWindowCompositionAttribute && GetWinVersion()<WIN_VER_WIN10)
|
if ((uMsg==WM_DWMCOLORIZATIONCOLORCHANGED || uMsg==WM_SETTINGCHANGE) && taskBar && taskBar->bCustomLook && SetWindowCompositionAttribute && GetWinVersion()<WIN_VER_WIN10)
|
||||||
@@ -1932,7 +1934,7 @@ static LRESULT CALLBACK SubclassTaskBarProc( HWND hWnd, UINT uMsg, WPARAM wParam
|
|||||||
WINCOMPATTRDATA attrData={0x13,&data,sizeof(data)};
|
WINCOMPATTRDATA attrData={0x13,&data,sizeof(data)};
|
||||||
SetWindowCompositionAttribute(hWnd,&attrData);
|
SetWindowCompositionAttribute(hWnd,&attrData);
|
||||||
}
|
}
|
||||||
if (g_TaskbarTexture && IsAppThemed())
|
if (g_TaskbarTexture)
|
||||||
{
|
{
|
||||||
// draw taskbar background (behind start button and separators)
|
// draw taskbar background (behind start button and separators)
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
@@ -2383,12 +2385,19 @@ void UpdateTaskBars( TUpdateTaskbar update )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (GetWinVersion()<WIN_VER_WIN10 && (!bDefColor || !bDefOpacity))
|
else if ((GetWinVersion()<WIN_VER_WIN10 && (!bDefColor || !bDefOpacity)) || !IsAppThemed())
|
||||||
{
|
{
|
||||||
if (bDefColor && GetWinVersion()>WIN_VER_WIN7)
|
if (bDefColor && GetWinVersion()>WIN_VER_WIN7)
|
||||||
{
|
{
|
||||||
color=GetSystemGlassColor8();
|
if (IsAppThemed())
|
||||||
color=((color&0xFF)<<16)|(color&0xFF00)|((color>>16)&0xFF);
|
{
|
||||||
|
color=GetSystemGlassColor8();
|
||||||
|
color=((color&0xFF)<<16)|(color&0xFF00)|((color>>16)&0xFF);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
color=GetSysColor(COLOR_BTNFACE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
BITMAPINFO bi={0};
|
BITMAPINFO bi={0};
|
||||||
bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
|
bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
|
||||||
@@ -2928,6 +2937,35 @@ static void OpenCortana( void )
|
|||||||
ShellExecute(NULL,NULL,L"shell:::{2559a1f8-21d7-11d4-bdaf-00c04f60b9f0}",NULL,NULL,SW_SHOWNORMAL);
|
ShellExecute(NULL,NULL,L"shell:::{2559a1f8-21d7-11d4-bdaf-00c04f60b9f0}",NULL,NULL,SW_SHOWNORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HMODULE GetModuleHandleByPrefix(const WCHAR* prefix)
|
||||||
|
{
|
||||||
|
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
|
||||||
|
if (snapshot == INVALID_HANDLE_VALUE)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
size_t prefixLength = wcslen(prefix);
|
||||||
|
|
||||||
|
MODULEENTRY32 me{};
|
||||||
|
me.dwSize = sizeof(me);
|
||||||
|
|
||||||
|
HMODULE result = nullptr;
|
||||||
|
|
||||||
|
if (Module32First(snapshot, &me))
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (_wcsnicmp(me.szModule, prefix, prefixLength) == 0)
|
||||||
|
{
|
||||||
|
result = reinterpret_cast<HMODULE>(me.modBaseAddr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (Module32Next(snapshot, &me));
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(snapshot);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static void InitStartMenuDLL( void )
|
static void InitStartMenuDLL( void )
|
||||||
{
|
{
|
||||||
static bool initCalled = false;
|
static bool initCalled = false;
|
||||||
@@ -2971,10 +3009,7 @@ static void InitStartMenuDLL( void )
|
|||||||
auto module=GetModuleHandle(L"taskbar.dll");
|
auto module=GetModuleHandle(L"taskbar.dll");
|
||||||
if (!module)
|
if (!module)
|
||||||
{
|
{
|
||||||
module = GetModuleHandle(L"ep_taskbar.5.dll");
|
module = GetModuleHandleByPrefix(L"ep_taskbar");
|
||||||
if (!module)
|
|
||||||
module = GetModuleHandle(L"ep_taskbar.2.dll");
|
|
||||||
|
|
||||||
if (module)
|
if (module)
|
||||||
g_epTaskbar = true;
|
g_epTaskbar = true;
|
||||||
}
|
}
|
||||||
@@ -3012,7 +3047,10 @@ static void InitStartMenuDLL( void )
|
|||||||
if (GetWinVersion()<=WIN_VER_WIN81)
|
if (GetWinVersion()<=WIN_VER_WIN81)
|
||||||
g_DrawThemeBackgroundHook=SetIatHook(module,"uxtheme.dll","DrawThemeBackground",DrawThemeBackground2);
|
g_DrawThemeBackgroundHook=SetIatHook(module,"uxtheme.dll","DrawThemeBackground",DrawThemeBackground2);
|
||||||
g_DrawThemeTextHook=SetIatHook(module,"uxtheme.dll","DrawThemeText",DrawThemeText2);
|
g_DrawThemeTextHook=SetIatHook(module,"uxtheme.dll","DrawThemeText",DrawThemeText2);
|
||||||
g_DrawThemeTextExHook=SetIatHook(module,"uxtheme.dll","DrawThemeTextEx",DrawThemeTextEx2);
|
if (IsAppThemed())
|
||||||
|
{
|
||||||
|
g_DrawThemeTextExHook=SetIatHook(module,"uxtheme.dll","DrawThemeTextEx",DrawThemeTextEx2);
|
||||||
|
}
|
||||||
g_DrawThemeTextCtlHook=SetIatHook(GetModuleHandle(L"comctl32.dll"),"uxtheme.dll","DrawThemeText",DrawThemeText2);
|
g_DrawThemeTextCtlHook=SetIatHook(GetModuleHandle(L"comctl32.dll"),"uxtheme.dll","DrawThemeText",DrawThemeText2);
|
||||||
if (GetWinVersion()>=WIN_VER_WIN10)
|
if (GetWinVersion()>=WIN_VER_WIN10)
|
||||||
g_SetWindowCompositionAttributeHook=SetIatHook(module,"user32.dll","SetWindowCompositionAttribute",SetWindowCompositionAttribute2);
|
g_SetWindowCompositionAttributeHook=SetIatHook(module,"user32.dll","SetWindowCompositionAttribute",SetWindowCompositionAttribute2);
|
||||||
|
|||||||
@@ -1081,9 +1081,9 @@ BEGIN
|
|||||||
IDS_RIGHT_SHIFT_TIP "When this is checked, right-click on the start button will open the standard Windows context menu instead of the Open-Shell menu. Otherwise Shift+right-click will open it"
|
IDS_RIGHT_SHIFT_TIP "When this is checked, right-click on the start button will open the standard Windows context menu instead of the Open-Shell menu. Otherwise Shift+right-click will open it"
|
||||||
IDS_RIGHT_SHIFTX "Right click opens Win+X menu"
|
IDS_RIGHT_SHIFTX "Right click opens Win+X menu"
|
||||||
IDS_RIGHT_SHIFTX_TIP "When this is checked, right-click on the start button will open the Win+X power menu instead of the Open-Shell menu. Otherwise Shift+right-click will open it"
|
IDS_RIGHT_SHIFTX_TIP "When this is checked, right-click on the start button will open the Win+X power menu instead of the Open-Shell menu. Otherwise Shift+right-click will open it"
|
||||||
IDS_STARTSCREEN_ITEM "Show Start screen shortcut"
|
IDS_STARTSCREEN_ITEM "Show Start Menu/Screen shortcut"
|
||||||
IDS_STARTSCREEN_ITEM_TIP
|
IDS_STARTSCREEN_ITEM_TIP
|
||||||
"When this is checked, the main menu will contain a shortcut to open the Start screen"
|
"When this is checked, the main menu will contain a shortcut to open original Start menu/screen"
|
||||||
IDS_MIN_HEIGHT "Minimum menu height"
|
IDS_MIN_HEIGHT "Minimum menu height"
|
||||||
IDS_MIN_HEIGHT_TIP "The main menu will be at least as tall as this many search results"
|
IDS_MIN_HEIGHT_TIP "The main menu will be at least as tall as this many search results"
|
||||||
IDS_GLASS_OVERRIDE "Override glass color"
|
IDS_GLASS_OVERRIDE "Override glass color"
|
||||||
|
|||||||
@@ -55,8 +55,8 @@ END_COM_MAP()
|
|||||||
STDMETHODIMP InvokeCommand( CMINVOKECOMMANDINFO *pInfo );
|
STDMETHODIMP InvokeCommand( CMINVOKECOMMANDINFO *pInfo );
|
||||||
STDMETHODIMP GetCommandString( UINT_PTR idCmd, UINT uFlags, UINT* pwReserved, LPSTR pszName, UINT cchMax );
|
STDMETHODIMP GetCommandString( UINT_PTR idCmd, UINT uFlags, UINT* pwReserved, LPSTR pszName, UINT cchMax );
|
||||||
|
|
||||||
wchar_t m_PinFolder1[_MAX_PATH]; // ending with \
|
wchar_t m_PinFolder1[_MAX_PATH]; // ending with backslash
|
||||||
wchar_t m_PinFolder2[_MAX_PATH]; // ending with \
|
wchar_t m_PinFolder2[_MAX_PATH]; // ending with backslash
|
||||||
wchar_t m_FileName[_MAX_PATH];
|
wchar_t m_FileName[_MAX_PATH];
|
||||||
LPITEMIDLIST m_FilePidl;
|
LPITEMIDLIST m_FilePidl;
|
||||||
bool m_bInPinFolder1, m_bInPinFolder2;
|
bool m_bInPinFolder1, m_bInPinFolder2;
|
||||||
|
|||||||
+1
-1
@@ -21,5 +21,5 @@ deploy:
|
|||||||
on:
|
on:
|
||||||
APPVEYOR_ACCOUNT_NAME: passionate-coder
|
APPVEYOR_ACCOUNT_NAME: passionate-coder
|
||||||
auth_token:
|
auth_token:
|
||||||
secure: SOu6Y71k0oIxXJR35x+7ZTrqDa3HqUM4kLNJc+DbohPz9zhVHh9O8QYwmI7LI0qslug5L11fo9pZVfVgZttw4eBgooHaX9TNBTTA6sJItkXqMX+M6mKAG7tbI/O3Eg0v
|
secure: SOu6Y71k0oIxXJR35x+7ZeU/+WRW8kaGnCWcbR3OVOd8HeCJwB1Tw3hUJa5EveLGKaGoMKGqAh01Pwc8tWX4xmphZsYYUr09IVjA0+rqgN5VT87CXD6OQxUxBJ7g+9IN
|
||||||
prerelease: true
|
prerelease: true
|
||||||
|
|||||||
Reference in New Issue
Block a user