Compare commits
87 Commits
v4.4.131
...
4.4.169-be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b2688245f | ||
|
|
082f85a4e2 | ||
|
|
0ce76c9c36 | ||
|
|
6e71d7c414 | ||
|
|
84909cf397 | ||
|
|
fc290d5a6a | ||
|
|
ebd530f652 | ||
|
|
e50c5f73d7 | ||
|
|
1db0006c96 | ||
|
|
7d0a9df1c3 | ||
|
|
8e1b4e35a3 | ||
|
|
859afc63d3 | ||
|
|
ee6db35b34 | ||
|
|
283c0fce03 | ||
|
|
ac5e69f1a0 | ||
|
|
b2df22104e | ||
|
|
c88f028f3e | ||
|
|
312bfd99d5 | ||
|
|
ca576a0224 | ||
|
|
a5f35b133f | ||
|
|
f197c9f43d | ||
|
|
bce9efcc43 | ||
|
|
80c38d95e9 | ||
|
|
0b535d1dd8 | ||
|
|
e2ff745949 | ||
|
|
fbcf85559e | ||
|
|
ed3da927cc | ||
|
|
225d0ba8f9 | ||
|
|
afaf16620a | ||
|
|
4883d13950 | ||
|
|
b094ddc5f9 | ||
|
|
a422105c61 | ||
|
|
96423b8918 | ||
|
|
ba131ff14b | ||
|
|
7d59f5ebfb | ||
|
|
95f3a4b09a | ||
|
|
728f982310 | ||
|
|
2ca236c291 | ||
|
|
8a22282191 | ||
|
|
935600a6d9 | ||
|
|
d3bf4b6207 | ||
|
|
aa09a0dcc2 | ||
|
|
cd8cc8cbc6 | ||
|
|
1bfbe09c6f | ||
|
|
61d05b49c5 | ||
|
|
9752afbebc | ||
|
|
e210b4a65a | ||
|
|
6581868336 | ||
|
|
7ee668e474 | ||
|
|
62b949679b | ||
|
|
6242e8d9b9 | ||
|
|
ee59bb76de | ||
|
|
3eb134a280 | ||
|
|
257023209b | ||
|
|
0da20180ac | ||
|
|
1f57c782e5 | ||
|
|
1f6e06fc85 | ||
|
|
ed3675ca7f | ||
|
|
695e419722 | ||
|
|
3bceac1515 | ||
|
|
473f7e1445 | ||
|
|
fcf95a3ea6 | ||
|
|
cc02e38aef | ||
|
|
9c119c6e29 | ||
|
|
9e297866ed | ||
|
|
261929f4c3 | ||
|
|
9976e134ca | ||
|
|
1b410e5a80 | ||
|
|
9ebe53fdbf | ||
|
|
5f59aab40a | ||
|
|
4f46134f10 | ||
|
|
519f4afe17 | ||
|
|
30ffce6939 | ||
|
|
fe47f841e7 | ||
|
|
f33cd60b84 | ||
|
|
431e2b522d | ||
|
|
d1ba5daead | ||
|
|
6fe4b6467f | ||
|
|
89a1a14b2c | ||
|
|
3ea331332c | ||
|
|
38c155cc95 | ||
|
|
b4d2be18fe | ||
|
|
1a5f62ace2 | ||
|
|
935c6fc73a | ||
|
|
947fded387 | ||
|
|
e6bd16e2d4 | ||
|
|
4806744c94 |
31
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Version:**
|
||||
- Open-Shell: [e.g. 4.4.131]
|
||||
- OS: [e.g. Windows 10 1903]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: Enhancement/Feature Request
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
4
.gitignore
vendored
@@ -4,6 +4,10 @@
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# ignore vscode stuff
|
||||
.vscode/
|
||||
.ionide/
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
; This file contains all localized text for Classic Explorer. There is one section per language.
|
||||
; This file contains all localized text for Open-Shell. There is one section per language.
|
||||
; Every section contains text lines in the form of <key> = <string>.
|
||||
; Which section is used depends on the current OS setting. If a key is missing from the language section
|
||||
; it will be searched in the [default] section. In some cases more than one language can be used.
|
||||
@@ -1156,23 +1156,23 @@ Copy.More = Altro...
|
||||
Copy.CopyHere = &Copia qui
|
||||
Copy.MoveHere = &Sposta qui
|
||||
Copy.Title = Conferma sostituzione file
|
||||
Copy.Subtitle = La cartella contiene già un file di nome "%s".
|
||||
Copy.SubtitleRO = La cartella contiene già un file di sola lettura di nome "%s".
|
||||
Copy.SubtitleSys = La cartella contiene già un file di sistema di nome "%s".
|
||||
Copy.Prompt1 = Sostituire il file esistente
|
||||
Copy.Subtitle = La cartella contiene già un file "%s".
|
||||
Copy.SubtitleRO = La cartella contiene già un file di sola lettura "%s".
|
||||
Copy.SubtitleSys = La cartella contiene già un file di sistema "%s".
|
||||
Copy.Prompt1 = Vuoi sostituire il file esistente
|
||||
Copy.Prompt2 = con questo file?
|
||||
Copy.Yes = &Sì
|
||||
Copy.No = &No
|
||||
Copy.YesAll = Sì t&utti
|
||||
Folder.Title = Conferma sostituzione cartella
|
||||
Folder.Prompt = Continuare?
|
||||
Toolbar.GoUp = Livello superiore
|
||||
Folder.Prompt = Vuoi continuare?
|
||||
Toolbar.GoUp = Cartella superiore
|
||||
Toolbar.Cut = Taglia
|
||||
Toolbar.Copy = Copia
|
||||
Toolbar.Paste = Incolla
|
||||
Toolbar.PasteShortcut = Incolla collegamento
|
||||
Toolbar.Delete = Elimina
|
||||
Toolbar.Email = Invia per posta elettronica gli elementi selezionati
|
||||
Toolbar.Email = Invia gli elementi selezionati via email
|
||||
Toolbar.Properties = Proprietà
|
||||
Toolbar.NewFolder = Nuova cartella
|
||||
Toolbar.ZipFolder = Nuova cartella compressa
|
||||
@@ -1195,9 +1195,9 @@ Toolbar.SelectAll = Seleziona tutto
|
||||
Toolbar.CustomizeFolder = Personalizza cartella
|
||||
Toolbar.MapDrive = Connetti unità di rete
|
||||
Toolbar.DisconnectDrive = Disconnetti unità di rete
|
||||
Toolbar.NavigationPane = Riquadro di spostamento
|
||||
Toolbar.NavigationPane = Riquadro spostamento
|
||||
Toolbar.DetailsPane = Riquadro dettagli
|
||||
Toolbar.PreviewPane = Riquadro di anteprima
|
||||
Toolbar.PreviewPane = Riquadro anteprima
|
||||
Toolbar.CopyTo = Copia in
|
||||
Toolbar.MoveTo = Sposta in
|
||||
Toolbar.Deselect = Deseleziona tutto
|
||||
@@ -1205,10 +1205,10 @@ Toolbar.InvertSelection = Inverti selezione
|
||||
Toolbar.FolderOptions = Opzioni cartella
|
||||
Toolbar.ShowHiddenFiles = Cartelle e file nascosti
|
||||
Toolbar.ShowSystemFiles = File di sistema
|
||||
Toolbar.ShowExtensions = Estensioni nomi file
|
||||
Status.FreeSpace = %s (Spazio disponibile: %s)
|
||||
Toolbar.ShowExtensions = Visualizza estensioni file
|
||||
Status.FreeSpace = %s (spazio disponibile: %s)
|
||||
Status.Item = %s elemento
|
||||
Status.Items = Elementi: %s
|
||||
Status.Items = %s elementi
|
||||
Status.ItemSelected = %s elemento selezionato
|
||||
Status.ItemsSelected = %s elementi selezionati
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ Menu.RemoveHighlight = إزالة التمييز
|
||||
Menu.Uninstall = إز&الة التثبيت
|
||||
Menu.UninstallTitle = إزالة التثبيت
|
||||
Menu.UninstallPrompt = هل تريد بالتأكيد إزالة تثبيت %s؟
|
||||
Search.CategorySettings = الإعدادات
|
||||
Search.CategorySettings = لوحة التح&كم
|
||||
Search.CategoryPCSettings = إعدادات الكمبيوتر
|
||||
Search.CategoryPrograms = البرامج
|
||||
Search.CategoryDocuments = المستندات
|
||||
@@ -265,7 +265,7 @@ Menu.RemoveHighlight = Премахни осветяването
|
||||
Menu.Uninstall = &Деинсталирай
|
||||
Menu.UninstallTitle = Деинсталиране
|
||||
Menu.UninstallPrompt = Наистина ли искате да деинсталирате %s?
|
||||
Search.CategorySettings = Настройки
|
||||
Search.CategorySettings = Контролен панел
|
||||
Search.CategoryPCSettings = Настройки на компютъра
|
||||
Search.CategoryPrograms = Програми
|
||||
Search.CategoryDocuments = Документи
|
||||
@@ -403,7 +403,7 @@ Menu.UninstallTitle = Desinstal·la
|
||||
Menu.UninstallPrompt = Esteu segur que voleu desinstal·lar el %s?
|
||||
Menu.ClassicSettings = Open-Shell &Menú
|
||||
Menu.SettingsTip = Ajustaments del Open-Shell Menú
|
||||
Search.CategorySettings = Configuració
|
||||
Search.CategorySettings = Panell de control
|
||||
Search.CategoryPCSettings = Configuració de l'ordinador
|
||||
Search.CategoryPrograms = Programes
|
||||
Search.CategoryDocuments = Documents
|
||||
@@ -539,7 +539,7 @@ Menu.RemoveHighlight = Odebrat nejzajímavější místo
|
||||
Menu.Uninstall = &Odinstalovat
|
||||
Menu.UninstallTitle = Odinstalovat
|
||||
Menu.UninstallPrompt = Opravdu chcete odinstalovat položku %s?
|
||||
Search.CategorySettings = Nastavení
|
||||
Search.CategorySettings = Ovládací panely
|
||||
Search.CategoryPCSettings = Nastavení počítače
|
||||
Search.CategoryPrograms = Programy
|
||||
Search.CategoryDocuments = Dokumenty
|
||||
@@ -675,7 +675,7 @@ Menu.RemoveHighlight = Fjern centralt punkt
|
||||
Menu.Uninstall = &Fjern
|
||||
Menu.UninstallTitle = Fjern
|
||||
Menu.UninstallPrompt = Er du sikker på, at du vil fjerne %s?
|
||||
Search.CategorySettings = Indstillinger
|
||||
Search.CategorySettings = Kontrolpanel
|
||||
Search.CategoryPCSettings = Pc-indstillinger
|
||||
Search.CategoryPrograms = Programmer
|
||||
Search.CategoryDocuments = Dokumenter
|
||||
@@ -811,7 +811,7 @@ Menu.RemoveHighlight = Haupttreffer entfernen
|
||||
Menu.Uninstall = &Deinstallieren
|
||||
Menu.UninstallTitle = Deinstallieren
|
||||
Menu.UninstallPrompt = Möchten Sie %s wirklich deinstallieren?
|
||||
Search.CategorySettings = Einstellungen
|
||||
Search.CategorySettings = Systemsteuerung
|
||||
Search.CategoryPCSettings = PC-Einstellungen
|
||||
Search.CategoryPrograms = Programme
|
||||
Search.CategoryDocuments = Dokumente
|
||||
@@ -947,7 +947,7 @@ Menu.RemoveHighlight = Κατάργηση επισήμανσης
|
||||
Menu.Uninstall = &Κατάργηση εγκατάστασης
|
||||
Menu.UninstallTitle = Κατάργηση εγκατάστασης
|
||||
Menu.UninstallPrompt = Είστε βέβαιοι ότι θέλετε να καταργήσετε την εγκατάσταση του %s;
|
||||
Search.CategorySettings = Ρυθμίσεις
|
||||
Search.CategorySettings = Πίνακας Ελέγχου
|
||||
Search.CategoryPCSettings = Ρυθμίσεις υπολογιστή
|
||||
Search.CategoryPrograms = Προγράμματα
|
||||
Search.CategoryDocuments = Έγγραφα
|
||||
@@ -991,7 +991,7 @@ Menu.LogOffShort = &Log off
|
||||
Menu.Undock = Undock Comput&er
|
||||
Menu.Disconnect = D&isconnect
|
||||
Menu.ShutdownBox = Sh&ut Down...
|
||||
Menu.Shutdown = Sh&ut Down
|
||||
Menu.Shutdown = Sh&ut down
|
||||
Menu.Restart = &Restart
|
||||
Menu.ShutdownUpdate = Update and shut down
|
||||
Menu.RestartUpdate = Update and restart
|
||||
@@ -1083,8 +1083,8 @@ Menu.RemoveHighlight = Remove highlight
|
||||
Menu.Uninstall = &Uninstall
|
||||
Menu.UninstallTitle = Uninstall
|
||||
Menu.UninstallPrompt = Are you sure you want to uninstall %s?
|
||||
Search.CategorySettings = Settings
|
||||
Search.CategoryPCSettings = Modern Settings
|
||||
Search.CategorySettings = Control Panel
|
||||
Search.CategoryPCSettings = Settings
|
||||
Search.CategoryPrograms = Programs
|
||||
Search.CategoryDocuments = Documents
|
||||
Search.CategoryMusic = Music
|
||||
@@ -1219,7 +1219,7 @@ Menu.RemoveHighlight = Quitar como elemento destacado
|
||||
Menu.Uninstall = &Desinstalar
|
||||
Menu.UninstallTitle = Desinstalar
|
||||
Menu.UninstallPrompt = ¿Está seguro de que desea desinstalar %s?
|
||||
Search.CategorySettings = Configuración
|
||||
Search.CategorySettings = Panel de control
|
||||
Search.CategoryPCSettings = Configuración de tu PC
|
||||
Search.CategoryPrograms = Programas
|
||||
Search.CategoryDocuments = Documentos
|
||||
@@ -1355,7 +1355,7 @@ Menu.RemoveHighlight = Eemalda esiletõst
|
||||
Menu.Uninstall = &Desinstalli
|
||||
Menu.UninstallTitle = Desinstalli
|
||||
Menu.UninstallPrompt = Kas soovite kindlasti desinstallida %s?
|
||||
Search.CategorySettings = Sätted
|
||||
Search.CategorySettings = Juhtpaneel
|
||||
Search.CategoryPCSettings = Arvutisätted
|
||||
Search.CategoryPrograms = Programmid
|
||||
Search.CategoryDocuments = Dokumendid
|
||||
@@ -1493,7 +1493,7 @@ Menu.UninstallTitle = لغو نصب
|
||||
Menu.UninstallPrompt = آیا مطمئنید می خواهید %s را لغو نصب کنید؟
|
||||
Menu.ClassicSettings = منوی ش&روع کلاسیک
|
||||
Menu.SettingsTip = تنظیمات منوی شروع کلاسیک
|
||||
Search.CategorySettings = تنظیمات
|
||||
Search.CategorySettings = صفحه کنترل
|
||||
Search.CategoryPCSettings = تنظیمات رایانه
|
||||
Search.CategoryPrograms = برنامهها
|
||||
Search.CategoryDocuments = اسناد
|
||||
@@ -1629,7 +1629,7 @@ Menu.RemoveHighlight = Poista tärkeä kohde
|
||||
Menu.Uninstall = &Poista asennus
|
||||
Menu.UninstallTitle = Poista asennus
|
||||
Menu.UninstallPrompt = Haluatko varmasti poistaa kohteen %s asennuksen?
|
||||
Search.CategorySettings = Asetukset
|
||||
Search.CategorySettings = Ohjauspaneeli
|
||||
Search.CategoryPCSettings = Tietokoneen asetukset
|
||||
Search.CategoryPrograms = Ohjelmat
|
||||
Search.CategoryDocuments = Tiedostot
|
||||
@@ -1765,7 +1765,7 @@ Menu.RemoveHighlight = Supprimer la recommandation
|
||||
Menu.Uninstall = &Désinstaller
|
||||
Menu.UninstallTitle = Désinstaller
|
||||
Menu.UninstallPrompt = Faut-il vraiment désinstaller %s ?
|
||||
Search.CategorySettings = Paramètres
|
||||
Search.CategorySettings = Panneau de configuration
|
||||
Search.CategoryPCSettings = Paramètres du PC
|
||||
Search.CategoryPrograms = Programmes
|
||||
Search.CategoryDocuments = Documents
|
||||
@@ -1901,7 +1901,7 @@ Menu.RemoveHighlight = Remove highlight
|
||||
Menu.Uninstall = &Dì-stàlaich
|
||||
Menu.UninstallTitle = Dì-stàlaich
|
||||
Menu.UninstallPrompt = A bheil thu cinnteach gu bheil thu airson %s a dhì-stàladh?
|
||||
Search.CategorySettings = Roghainnean
|
||||
Search.CategorySettings = A' phanail-smachd
|
||||
Search.CategoryPCSettings = Roghainnean a' PC
|
||||
Search.CategoryPrograms = Prògraman
|
||||
Search.CategoryDocuments = Sgrìobhainnean
|
||||
@@ -2037,7 +2037,7 @@ Menu.RemoveHighlight = הסר הבלטה
|
||||
Menu.Uninstall = ה&סר התקנה
|
||||
Menu.UninstallTitle = הסר התקנה
|
||||
Menu.UninstallPrompt = האם אתה בטוח שברצונך להסיר את התקנת %s?
|
||||
Search.CategorySettings = הגדרות
|
||||
Search.CategorySettings = לוח הבקרה
|
||||
Search.CategoryPCSettings = הגדרות מחשב
|
||||
Search.CategoryPrograms = תוכניות
|
||||
Search.CategoryDocuments = מסמכים
|
||||
@@ -2173,7 +2173,7 @@ Menu.RemoveHighlight = Ukloni isticanje
|
||||
Menu.Uninstall = &Deinstaliraj
|
||||
Menu.UninstallTitle = Deinstaliraj
|
||||
Menu.UninstallPrompt = Jeste li sigurni da želite deinstalirati %s iz računala?
|
||||
Search.CategorySettings = Postavke
|
||||
Search.CategorySettings = Upravljačka ploča
|
||||
Search.CategoryPCSettings = Postavke PC-ja
|
||||
Search.CategoryPrograms = Programi
|
||||
Search.CategoryDocuments = Dokumenti
|
||||
@@ -2309,7 +2309,7 @@ Menu.RemoveHighlight = Kiemelés eltávolítása
|
||||
Menu.Uninstall = Eltá&volítás
|
||||
Menu.UninstallTitle = Eltávolítás
|
||||
Menu.UninstallPrompt = Biztosan el kívánja távolítani a következőt: %s?
|
||||
Search.CategorySettings = Beállítások
|
||||
Search.CategorySettings = Vezérlőpult
|
||||
Search.CategoryPCSettings = Gépház
|
||||
Search.CategoryPrograms = Programs
|
||||
Search.CategoryDocuments = Dokumentumok
|
||||
@@ -2447,8 +2447,8 @@ Menu.RemoveHighlight = Fjarlægja auðkenningu
|
||||
Menu.Uninstall = Fjarlægja
|
||||
Menu.UninstallTitle = Fjarlægja
|
||||
Menu.UninstallPrompt = Ertu viss um að það eigi að fjarlægja %s?
|
||||
Search.CategorySettings = Stillingar
|
||||
Search.CategoryPCSettings = Sérstillingar tölvunnar
|
||||
Search.CategorySettings = Stjórnborð
|
||||
Search.CategoryPCSettings = PC stillingar
|
||||
Search.CategoryPrograms = Forrit
|
||||
Search.CategoryDocuments = Skjöl
|
||||
Search.CategoryMusic = Tónlist
|
||||
@@ -2583,7 +2583,7 @@ Menu.RemoveHighlight = Rimuovi elemento di rilievo
|
||||
Menu.Uninstall = &Disinstalla
|
||||
Menu.UninstallTitle = Disinstalla
|
||||
Menu.UninstallPrompt = Disinstallare %s?
|
||||
Search.CategorySettings = Impostazioni
|
||||
Search.CategorySettings = Pannello di controllo
|
||||
Search.CategoryPCSettings = Impostazioni PC
|
||||
Search.CategoryPrograms = Programmi
|
||||
Search.CategoryDocuments = Documenti
|
||||
@@ -2991,7 +2991,7 @@ Menu.RemoveHighlight = Šalinti paryškinimą
|
||||
Menu.Uninstall = &Pašalinti
|
||||
Menu.UninstallTitle = Pašalinti
|
||||
Menu.UninstallPrompt = Ar tikrai norite pašalinti %s?
|
||||
Search.CategorySettings = Parametrai
|
||||
Search.CategorySettings = Valdymo skydas
|
||||
Search.CategoryPCSettings = PC parametrai
|
||||
Search.CategoryPrograms = Programos
|
||||
Search.CategoryDocuments = Dokumentai
|
||||
@@ -3127,7 +3127,7 @@ Menu.RemoveHighlight = Noņemt marķējumu
|
||||
Menu.Uninstall = &Atinstalēt
|
||||
Menu.UninstallTitle = Atinstalēt
|
||||
Menu.UninstallPrompt = Vai esat pārliecināts, ka vēlaties atinstalēt %s?
|
||||
Search.CategorySettings = Iestatījumi
|
||||
Search.CategorySettings = Vadības panelis
|
||||
Search.CategoryPCSettings = Datora iestatījumi
|
||||
Search.CategoryPrograms = Programmas
|
||||
Search.CategoryDocuments = Dokumenti
|
||||
@@ -3263,7 +3263,7 @@ Menu.RemoveHighlight = Remove highlight
|
||||
Menu.Uninstall = &Деинсталирај
|
||||
Menu.UninstallTitle = Деинсталирај
|
||||
Menu.UninstallPrompt = Дали сте сигурни дека сакате да го деинсталирате %s?
|
||||
Search.CategorySettings = Подесувања
|
||||
Search.CategorySettings = Контрол панел
|
||||
Search.CategoryPCSettings = Параметри на компјутерот
|
||||
Search.CategoryPrograms = Програми
|
||||
Search.CategoryDocuments = Документи
|
||||
@@ -3399,7 +3399,7 @@ Menu.RemoveHighlight = Fjern høydepunkt
|
||||
Menu.Uninstall = &Avinstaller
|
||||
Menu.UninstallTitle = Avinstaller
|
||||
Menu.UninstallPrompt = Er du sikker på at du vil avinstallere %s?
|
||||
Search.CategorySettings = Innstillinger
|
||||
Search.CategorySettings = Kontrollpanel
|
||||
Search.CategoryPCSettings = PC-innstillinger
|
||||
Search.CategoryPrograms = Programmer
|
||||
Search.CategoryDocuments = Dokumenter
|
||||
@@ -3535,7 +3535,7 @@ Menu.RemoveHighlight = Aandachtspunt verwijderen
|
||||
Menu.Uninstall = V&erwijderen
|
||||
Menu.UninstallTitle = Verwijderen
|
||||
Menu.UninstallPrompt = Weet u zeker dat u %s wilt verwijderen?
|
||||
Search.CategorySettings = Instellingen
|
||||
Search.CategorySettings = Configuratiescherm
|
||||
Search.CategoryPCSettings = Pc-instellingen
|
||||
Search.CategoryPrograms = Programma's
|
||||
Search.CategoryDocuments = Documenten
|
||||
@@ -3671,7 +3671,7 @@ Menu.RemoveHighlight = Usuń wyróżnienie
|
||||
Menu.Uninstall = &Odinstaluj
|
||||
Menu.UninstallTitle = Odinstaluj
|
||||
Menu.UninstallPrompt = Czy na pewno chcesz odinstalować program %s?
|
||||
Search.CategorySettings = Ustawienia
|
||||
Search.CategorySettings = Panel sterowania
|
||||
Search.CategoryPCSettings = Ustawienia komputera
|
||||
Search.CategoryPrograms = Programy
|
||||
Search.CategoryDocuments = Dokumenty
|
||||
@@ -3807,7 +3807,7 @@ Menu.RemoveHighlight = Remover Destaque
|
||||
Menu.Uninstall = &Desinstalar
|
||||
Menu.UninstallTitle = Desinstalar
|
||||
Menu.UninstallPrompt = Tem certeza de que deseja desinstalar %s?
|
||||
Search.CategorySettings = Configurações
|
||||
Search.CategorySettings = Painel de controle
|
||||
Search.CategoryPCSettings = Configurações do computador
|
||||
Search.CategoryPrograms = Programas
|
||||
Search.CategoryDocuments = Documentos
|
||||
@@ -3943,7 +3943,7 @@ Menu.RemoveHighlight = Remover destaque
|
||||
Menu.Uninstall = D&esinstalar
|
||||
Menu.UninstallTitle = Desinstalar
|
||||
Menu.UninstallPrompt = Tem a certeza de que pretende desinstalar %s?
|
||||
Search.CategorySettings = Definições
|
||||
Search.CategorySettings = Painel de controlo
|
||||
Search.CategoryPCSettings = Definições do PC
|
||||
Search.CategoryPrograms = Programas
|
||||
Search.CategoryDocuments = Documentos
|
||||
@@ -4079,7 +4079,7 @@ Menu.RemoveHighlight = Eliminare evidențiere
|
||||
Menu.Uninstall = &Dezinstalare
|
||||
Menu.UninstallTitle = Dezinstalare
|
||||
Menu.UninstallPrompt = Sigur dezinstalați %s?
|
||||
Search.CategorySettings = Setări
|
||||
Search.CategorySettings = Panou de control
|
||||
Search.CategoryPCSettings = Setări PC
|
||||
Search.CategoryPrograms = Programe
|
||||
Search.CategoryDocuments = Documente
|
||||
@@ -4215,7 +4215,7 @@ Menu.RemoveHighlight = Выключить пометку
|
||||
Menu.Uninstall = &Удалить
|
||||
Menu.UninstallTitle = Удалить
|
||||
Menu.UninstallPrompt = Вы действительно хотите удалить "%s"?
|
||||
Search.CategorySettings = Параметры
|
||||
Search.CategorySettings = Панель управления
|
||||
Search.CategoryPCSettings = Параметры ПК
|
||||
Search.CategoryPrograms = Программы
|
||||
Search.CategoryDocuments = Документы
|
||||
@@ -4351,7 +4351,7 @@ Menu.RemoveHighlight = Odstrániť zvýraznenie
|
||||
Menu.Uninstall = &Odinštalovať
|
||||
Menu.UninstallTitle = Odinštalovať
|
||||
Menu.UninstallPrompt = Naozaj chcete odinštalovať program %s?
|
||||
Search.CategorySettings = Nastavenia
|
||||
Search.CategorySettings = Ovládací panel
|
||||
Search.CategoryPCSettings = Nastavenie PC
|
||||
Search.CategoryPrograms = Programy
|
||||
Search.CategoryDocuments = Dokumenty
|
||||
@@ -4487,7 +4487,7 @@ Menu.RemoveHighlight = Odstrani označitev
|
||||
Menu.Uninstall = &Odstrani
|
||||
Menu.UninstallTitle = Odstrani
|
||||
Menu.UninstallPrompt = Ali ste prepričani, da želite odstraniti %s?
|
||||
Search.CategorySettings = Nastavitve
|
||||
Search.CategorySettings = Nadzorna plošča
|
||||
Search.CategoryPCSettings = Nastavitve računalnika
|
||||
Search.CategoryPrograms = Programi
|
||||
Search.CategoryDocuments = Dokumenti
|
||||
@@ -4623,7 +4623,7 @@ Menu.RemoveHighlight = Ukloni istaknuti sadržaj
|
||||
Menu.Uninstall = &Deinstaliraj
|
||||
Menu.UninstallTitle = Deinstaliraj
|
||||
Menu.UninstallPrompt = Želite li zaista da deinstalirate %s?
|
||||
Search.CategorySettings = Postavke
|
||||
Search.CategorySettings = Kontrolna tabla
|
||||
Search.CategoryPCSettings = Postavke računara
|
||||
Search.CategoryPrograms = Programs
|
||||
Search.CategoryDocuments = Dokumenti
|
||||
@@ -4759,7 +4759,7 @@ Menu.RemoveHighlight = Ta bort fokus
|
||||
Menu.Uninstall = &Avinstallera
|
||||
Menu.UninstallTitle = Avinstallera
|
||||
Menu.UninstallPrompt = Vill du avinstallera %s?
|
||||
Search.CategorySettings = Inställningar
|
||||
Search.CategorySettings = Kontrollpanelen
|
||||
Search.CategoryPCSettings = Datorinställningar
|
||||
Search.CategoryPrograms = Program
|
||||
Search.CategoryDocuments = Dokument
|
||||
@@ -4896,7 +4896,7 @@ Menu.RemoveHighlight = เอาไฮไลท์ออก
|
||||
Menu.Uninstall = &ถอนการติดตั้ง
|
||||
Menu.UninstallTitle = ถอนการติดตั้ง
|
||||
Menu.UninstallPrompt = คุณแน่ใจหรือไม่ว่าคุณต้องการถอนการติดตั้ง %s
|
||||
Search.CategorySettings = การตั้งค่า
|
||||
Search.CategorySettings = แผงควบคุม
|
||||
Search.CategoryPCSettings = การตั้งค่าพีซี
|
||||
Search.CategoryPrograms = โปรแกรม
|
||||
Search.CategoryDocuments = เอกสาร
|
||||
@@ -5032,7 +5032,7 @@ Menu.RemoveHighlight = Önemli Noktayı Kaldır
|
||||
Menu.Uninstall = &Kaldır
|
||||
Menu.UninstallTitle = Kaldır
|
||||
Menu.UninstallPrompt = %s programını kaldırmak istediğinizden emin misiniz?
|
||||
Search.CategorySettings = Ayarlar
|
||||
Search.CategorySettings = Denetim Masası
|
||||
Search.CategoryPCSettings = Bilgisayar ayarları
|
||||
Search.CategoryPrograms = Programlar
|
||||
Search.CategoryDocuments = Belgeler
|
||||
@@ -5168,7 +5168,7 @@ Menu.RemoveHighlight = Видалити виділення
|
||||
Menu.Uninstall = &Видалити
|
||||
Menu.UninstallTitle = Видалити
|
||||
Menu.UninstallPrompt = Дійсно видалити %s?
|
||||
Search.CategorySettings = Настройки
|
||||
Search.CategorySettings = Панель керування
|
||||
Search.CategoryPCSettings = Параметри ПК
|
||||
Search.CategoryPrograms = Програми
|
||||
Search.CategoryDocuments = Документи
|
||||
|
||||
27
README.md
@@ -2,28 +2,33 @@
|
||||
|
||||
*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://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)
|
||||
|
||||
[Home Page](https://open-shell.github.io/Open-Shell-Menu)
|
||||
|
||||
[Discussion room](https://gitter.im/Open-Shell)
|
||||
|
||||
[Latest nightly build](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master/artifacts)
|
||||
[Home Page](https://open-shell.github.io/Open-Shell-Menu)
|
||||
[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
|
||||
|
||||
- Classic style Start Menu for Windows 7, 8, 8.1, 10
|
||||
- Toolbar for Windows Explorer
|
||||
- Classic copy UI (Windows 7 only)
|
||||
- Show file size in Explorer status bar
|
||||
- Title bar and status bar for Internet Explorer
|
||||
|
||||
### Download
|
||||
If you just want to use it or looking for setup file, click here to download:
|
||||
|
||||
[](https://github.com/Open-Shell/Open-Shell-Menu/releases)
|
||||
|
||||
### Temporary Translation/Language Solution
|
||||
1. Download [language DLL](https://coddec.github.io/Classic-Shell/www.classicshell.net/translations/index.html)
|
||||
2. Place it either in the Open-Shell's __install folder__ or in the `%ALLUSERSPROFILE%\OpenShell\Languages` folder
|
||||
|
||||
---
|
||||
|
||||
*For archival reasons, we have a mirror of `www.classicshell.net` [here](https://coddec.github.io/Classic-Shell/www.classicshell.net/).*
|
||||
|
||||
[How To Skin a Start Menu](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/skintutorial.html)
|
||||
|
||||
[Classic Shell - Custom Start Buttons](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/buttontutorial.html)
|
||||
|
||||
[How To Skin a Start Menu](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/skintutorial.html)
|
||||
[Classic Shell - Custom Start Buttons](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/buttontutorial.html)
|
||||
[Questions? Ask on the Discussions section](https://github.com/Open-Shell/Open-Shell-Menu/discussions) or on [Discord](https://discord.gg/7H6arr5)
|
||||
[Report a bug/issue or submit a feature request](https://github.com/Open-Shell/Open-Shell-Menu/issues)
|
||||
|
||||
@@ -5,9 +5,9 @@ for other languages.
|
||||
The final files (installers, archives) are saved to the Setup\Final folder.
|
||||
|
||||
You need the following tools:
|
||||
Visual Studio 2017 (Community Edition is enough)
|
||||
Visual Studio 2019 (Community Edition is enough)
|
||||
- Desktop development with C++ workload
|
||||
- Windows 10 SDK (10.0.17134.0) for Desktop C++
|
||||
- Windows 10 SDK (10.0.19041.0) for Desktop C++
|
||||
- Visual C++ ATL support
|
||||
HTML Help Workshop
|
||||
WiX 3.7
|
||||
|
||||
@@ -30,46 +30,46 @@
|
||||
<ProjectGuid>{9AF324B7-F786-4D85-B2E1-6E51720F874E}</ProjectGuid>
|
||||
<RootNamespace>ClassicExplorer</RootNamespace>
|
||||
<Keyword>AtlProj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
@@ -158,7 +158,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
@@ -178,6 +177,7 @@
|
||||
<ModuleDefinitionFile>.\$(TargetName).def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<PerUserRedirection>true</PerUserRedirection>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
@@ -194,7 +194,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
@@ -214,6 +213,7 @@
|
||||
<ModuleDefinitionFile>.\$(TargetName).def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<PerUserRedirection>true</PerUserRedirection>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
@@ -251,6 +251,7 @@
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<PerUserRedirection>true</PerUserRedirection>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
@@ -287,6 +288,7 @@
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<PerUserRedirection>true</PerUserRedirection>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Setup|Win32'">
|
||||
|
||||
@@ -18,26 +18,26 @@
|
||||
<ProjectGuid>{E93271C8-0252-4A08-8227-1978C64C2D34}</ProjectGuid>
|
||||
<RootNamespace>ClassicExplorerSettings</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
@@ -77,7 +77,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
|
||||
@@ -792,8 +792,8 @@ LRESULT CALLBACK CExplorerBHO::SubclassBreadcrumbProc( HWND hWnd, UINT uMsg, WPA
|
||||
BOOL dwm;
|
||||
if (theme && SUCCEEDED(DwmIsCompositionEnabled(&dwm)) && dwm)
|
||||
{
|
||||
DTTOPTS opts={sizeof(opts),DTT_COMPOSITED|DTT_TEXTCOLOR};
|
||||
opts.crText=GetSysColor(COLOR_WINDOWTEXT);
|
||||
DTTOPTS opts={sizeof(opts),DTT_COMPOSITED|DTT_COLORPROP};
|
||||
opts.iColorPropId = COLOR_WINDOWTEXT;
|
||||
DrawThemeTextEx(theme,hdcPaint,0,0,pThis->m_CurPath,-1,DT_NOPREFIX|DT_VCENTER|DT_SINGLELINE,&rc,&opts);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -30,46 +30,46 @@
|
||||
<ProjectGuid>{65D5C193-E807-4094-AE19-19E6A310A312}</ProjectGuid>
|
||||
<RootNamespace>ClassicIE</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
@@ -142,7 +142,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
@@ -163,7 +162,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
|
||||
@@ -30,46 +30,46 @@
|
||||
<ProjectGuid>{BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}</ProjectGuid>
|
||||
<RootNamespace>ClassicIEDLL</RootNamespace>
|
||||
<Keyword>AtlProj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
@@ -152,7 +152,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
@@ -171,6 +170,7 @@
|
||||
<ModuleDefinitionFile>.\$(TargetName).def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<PerUserRedirection>true</PerUserRedirection>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
@@ -187,7 +187,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
@@ -206,6 +205,7 @@
|
||||
<ModuleDefinitionFile>.\$(TargetName).def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<PerUserRedirection>true</PerUserRedirection>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
@@ -242,6 +242,7 @@
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<PerUserRedirection>true</PerUserRedirection>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
@@ -277,6 +278,7 @@
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<PerUserRedirection>true</PerUserRedirection>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Setup|Win32'">
|
||||
|
||||
@@ -14,6 +14,7 @@ public:
|
||||
CAbsolutePidl( const CAbsolutePidl &pidl ) { m_Pidl=pidl?ILCloneFull(pidl):NULL; }
|
||||
~CAbsolutePidl( void ) { Clear(); }
|
||||
void operator=( const CAbsolutePidl &pidl ) { Clone(pidl); }
|
||||
void operator=( PCIDLIST_ABSOLUTE pidl ) { Clone(pidl); }
|
||||
|
||||
void Clear( void ) { if (m_Pidl) ILFree(m_Pidl); m_Pidl=NULL; }
|
||||
operator PIDLIST_ABSOLUTE( void ) const { return m_Pidl; }
|
||||
@@ -21,7 +22,7 @@ public:
|
||||
void Swap( CAbsolutePidl &pidl ) { PIDLIST_ABSOLUTE q=pidl.m_Pidl; pidl.m_Pidl=m_Pidl; m_Pidl=q; }
|
||||
void Attach( PIDLIST_ABSOLUTE pidl ) { Clear(); m_Pidl=pidl; }
|
||||
PIDLIST_ABSOLUTE Detach( void ) { PIDLIST_ABSOLUTE pidl=m_Pidl; m_Pidl=NULL; return pidl; }
|
||||
void Clone( PIDLIST_ABSOLUTE pidl ) { Clear(); m_Pidl=pidl?ILCloneFull(pidl):NULL; }
|
||||
void Clone( PCIDLIST_ABSOLUTE pidl ) { Clear(); m_Pidl=pidl?ILCloneFull(pidl):NULL; }
|
||||
|
||||
private:
|
||||
PIDLIST_ABSOLUTE m_Pidl;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "FNVHash.h"
|
||||
#include "StringUtils.h"
|
||||
#include "Translations.h"
|
||||
#include "json.hpp"
|
||||
#include <wininet.h>
|
||||
#include <softpub.h>
|
||||
|
||||
@@ -141,30 +142,9 @@ LRESULT CProgressDlg::OnCancel( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL&
|
||||
|
||||
static bool g_bCheckingVersion;
|
||||
|
||||
static DWORD GetTimeStamp( const wchar_t *fname )
|
||||
{
|
||||
HANDLE h=CreateFile(fname,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
|
||||
if (h==INVALID_HANDLE_VALUE)
|
||||
return 0;
|
||||
DWORD res=0;
|
||||
DWORD q;
|
||||
IMAGE_DOS_HEADER header;
|
||||
if (ReadFile(h,&header,sizeof(header),&q,NULL) && q==sizeof(header))
|
||||
{
|
||||
if (SetFilePointer(h,header.e_lfanew+8,NULL,FILE_BEGIN)!=INVALID_SET_FILE_POINTER)
|
||||
{
|
||||
if (!ReadFile(h,&res,4,&q,NULL) || q!=4)
|
||||
res=0;
|
||||
}
|
||||
}
|
||||
CloseHandle(h);
|
||||
return res;
|
||||
}
|
||||
|
||||
enum TDownloadResult
|
||||
{
|
||||
DOWNLOAD_OK,
|
||||
DOWNLOAD_SAMETIME,
|
||||
DOWNLOAD_CANCEL,
|
||||
|
||||
// errors
|
||||
@@ -176,8 +156,7 @@ enum TDownloadResult
|
||||
|
||||
// Downloads a file
|
||||
// filename - returns the name of the downloaded file
|
||||
// timestamp - if not zero, it is compared to the timestamp of the file and returns DOWNLOAD_SAMETIME if the same (and buf will be empty)
|
||||
static TDownloadResult DownloadFile( const wchar_t *url, std::vector<char> &buf, CString *pFilename, DWORD timestamp, bool bAcceptCached, CProgressDlg *pProgress, TSettingsComponent component )
|
||||
static TDownloadResult DownloadFile( const wchar_t *url, std::vector<char> &buf, CString *pFilename, bool bAcceptCached, CProgressDlg *pProgress, TSettingsComponent component )
|
||||
{
|
||||
const wchar_t *compName=L"Open-Shell";
|
||||
switch (component)
|
||||
@@ -211,7 +190,7 @@ static TDownloadResult DownloadFile( const wchar_t *url, std::vector<char> &buf,
|
||||
int time=GetTickCount();
|
||||
if (pProgress)
|
||||
pProgress->SetText(LoadStringEx(IDS_PROGRESS_CONNECT));
|
||||
HINTERNET hConnect=InternetConnect(hInternet,host,INTERNET_DEFAULT_HTTP_PORT,L"",L"",INTERNET_SERVICE_HTTP,0,0);
|
||||
HINTERNET hConnect=InternetConnect(hInternet,host,components.nPort,L"",L"",INTERNET_SERVICE_HTTP,0,0);
|
||||
if (hConnect)
|
||||
{
|
||||
if (pProgress && pProgress->IsCanceled())
|
||||
@@ -219,7 +198,7 @@ static TDownloadResult DownloadFile( const wchar_t *url, std::vector<char> &buf,
|
||||
const wchar_t *accept[]={L"*/*",NULL};
|
||||
if (res==DOWNLOAD_OK)
|
||||
{
|
||||
HINTERNET hRequest=HttpOpenRequest(hConnect,L"GET",file,NULL,NULL,accept,bAcceptCached?0:INTERNET_FLAG_RELOAD,0);
|
||||
HINTERNET hRequest=HttpOpenRequest(hConnect,L"GET",file,NULL,NULL,accept,((components.nScheme==INTERNET_SCHEME_HTTPS)?INTERNET_FLAG_SECURE:0)|(bAcceptCached?0:INTERNET_FLAG_RELOAD),0);
|
||||
if (hRequest)
|
||||
{
|
||||
if (pProgress && pProgress->IsCanceled())
|
||||
@@ -264,7 +243,7 @@ static TDownloadResult DownloadFile( const wchar_t *url, std::vector<char> &buf,
|
||||
if (fileSize==0)
|
||||
pProgress->SetProgress(-1);
|
||||
}
|
||||
int CHUNK_SIZE=timestamp?1024:32768; // start with small chunk to verify the timestamp
|
||||
int CHUNK_SIZE=32768;
|
||||
DWORD size=0;
|
||||
buf.reserve(fileSize+CHUNK_SIZE);
|
||||
while (1)
|
||||
@@ -286,25 +265,6 @@ static TDownloadResult DownloadFile( const wchar_t *url, std::vector<char> &buf,
|
||||
size+=dwSize;
|
||||
if (pProgress && fileSize)
|
||||
pProgress->SetProgress(size*100/fileSize);
|
||||
if (timestamp && (size<sizeof(IMAGE_DOS_HEADER) || buf[0]!='M' || buf[1]!='Z'))
|
||||
{
|
||||
res=DOWNLOAD_FAIL;
|
||||
break;
|
||||
}
|
||||
if (timestamp && size>=sizeof(IMAGE_DOS_HEADER))
|
||||
{
|
||||
DWORD pos=((IMAGE_DOS_HEADER*)&buf[0])->e_lfanew+8;
|
||||
if (size>=pos+4)
|
||||
{
|
||||
if (timestamp==*(DWORD*)&buf[pos])
|
||||
{
|
||||
res=DOWNLOAD_SAMETIME;
|
||||
break;
|
||||
}
|
||||
timestamp=0;
|
||||
CHUNK_SIZE=32768;
|
||||
}
|
||||
}
|
||||
}
|
||||
buf.resize(size);
|
||||
}
|
||||
@@ -358,6 +318,7 @@ struct VersionCheckParams
|
||||
TSettingsComponent component;
|
||||
tNewVersionCallback callback;
|
||||
CProgressDlg *progress;
|
||||
bool nightly = false;
|
||||
};
|
||||
|
||||
// 0 - fail, 1 - success, 2 - cancel
|
||||
@@ -377,80 +338,17 @@ static DWORD WINAPI ThreadVersionCheck( void *param )
|
||||
return 0;
|
||||
}
|
||||
DWORD curVersion=GetVersionEx(g_Instance);
|
||||
regKey.SetDWORDValue(L"LastUpdateVersion",curVersion);
|
||||
|
||||
// download file
|
||||
wchar_t fname[_MAX_PATH]=L"%ALLUSERSPROFILE%\\OpenShell";
|
||||
DoEnvironmentSubst(fname,_countof(fname));
|
||||
SHCreateDirectory(NULL,fname);
|
||||
PathAppend(fname,L"update.ver");
|
||||
|
||||
bool res=false;
|
||||
CString urlBase=LoadStringEx(IDS_VERSION_URL);
|
||||
bool res = false;
|
||||
VersionData data;
|
||||
data.Clear();
|
||||
if (data.Load(fname,false)==VersionData::LOAD_OK)
|
||||
|
||||
{
|
||||
if (!data.altUrl.IsEmpty())
|
||||
urlBase=data.altUrl;
|
||||
WIN32_FILE_ATTRIBUTE_DATA attr;
|
||||
if (GetFileAttributesEx(fname,GetFileExInfoStandard,&attr))
|
||||
{
|
||||
DWORD writeTime=(DWORD)(((((ULONGLONG)attr.ftLastWriteTime.dwHighDateTime)<<32)|attr.ftLastWriteTime.dwLowDateTime)/TIME_DIVISOR);
|
||||
if (curTime>writeTime && (curTime-writeTime)<TIME_PRECISION)
|
||||
{
|
||||
res=true; // the file is valid and less than an hour old, don't download again
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!res)
|
||||
{
|
||||
data.Clear();
|
||||
CString url;
|
||||
url.Format(L"%s%d.%d.%d.ver",urlBase,curVersion>>24,(curVersion>>16)&0xFF,curVersion&0xFFFF);
|
||||
auto load = params.nightly ? data.LoadNightly() : data.Load();
|
||||
|
||||
#ifdef UPDATE_LOG
|
||||
LogToFile(UPDATE_LOG,L"URL: %s",url);
|
||||
#endif
|
||||
|
||||
std::vector<char> buf;
|
||||
TDownloadResult download=DownloadFile(url,buf,NULL,GetTimeStamp(fname),false,params.progress,params.component);
|
||||
#ifdef UPDATE_LOG
|
||||
LogToFile(UPDATE_LOG,L"Download result: %d",download);
|
||||
#endif
|
||||
if (download==DOWNLOAD_CANCEL)
|
||||
{
|
||||
g_bCheckingVersion=false;
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (download<DOWNLOAD_FIRST_ERROR)
|
||||
{
|
||||
if (download==DOWNLOAD_SAMETIME || SaveFile(fname,buf)==0)
|
||||
{
|
||||
if (download==DOWNLOAD_SAMETIME)
|
||||
{
|
||||
HANDLE h=CreateFile(fname,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
|
||||
if (h!=INVALID_HANDLE_VALUE)
|
||||
{
|
||||
SetFileTime(h,NULL,NULL,(FILETIME*)&curTimeL);
|
||||
CloseHandle(h);
|
||||
}
|
||||
}
|
||||
if (params.progress)
|
||||
{
|
||||
params.progress->SetText(LoadStringEx(IDS_PROGRESS_VERIFY));
|
||||
params.progress->SetProgress(-1);
|
||||
}
|
||||
VersionData::TLoadResult load=data.Load(fname,false);
|
||||
#ifdef UPDATE_LOG
|
||||
LogToFile(UPDATE_LOG,L"Load result: %d",load);
|
||||
#endif
|
||||
if (load==VersionData::LOAD_BAD_FILE)
|
||||
DeleteFile(fname);
|
||||
res=(load==VersionData::LOAD_OK);
|
||||
}
|
||||
}
|
||||
#ifdef UPDATE_LOG
|
||||
LogToFile(UPDATE_LOG, L"Load result: %d", load);
|
||||
#endif
|
||||
res = (load == VersionData::LOAD_OK);
|
||||
}
|
||||
|
||||
curTime+=(rand()*TIME_PRECISION)/(RAND_MAX+1)-(TIME_PRECISION/2); // add between -30 and 30 minutes to randomize access
|
||||
@@ -553,6 +451,21 @@ DWORD CheckForNewVersion( HWND owner, TSettingsComponent component, TVersionChec
|
||||
params->callback=callback;
|
||||
params->progress=NULL;
|
||||
|
||||
// check the Update setting (uses the current value in the registry, not the one from memory
|
||||
{
|
||||
CRegKey regSettings, regSettingsUser, regPolicy, regPolicyUser;
|
||||
bool bUpgrade = OpenSettingsKeys(COMPONENT_SHARED, regSettings, regSettingsUser, regPolicy, regPolicyUser);
|
||||
|
||||
CSetting settings[] = {
|
||||
{L"Nightly",CSetting::TYPE_BOOL,0,0,0},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
settings[0].LoadValue(regSettings, regSettingsUser, regPolicy, regPolicyUser);
|
||||
|
||||
params->nightly = GetSettingBool(settings[0]);
|
||||
}
|
||||
|
||||
if (!owner)
|
||||
return ThreadVersionCheck(params);
|
||||
|
||||
@@ -583,57 +496,38 @@ DWORD CheckForNewVersion( HWND owner, TSettingsComponent component, TVersionChec
|
||||
}
|
||||
else
|
||||
{
|
||||
DWORD buildTime=0;
|
||||
{
|
||||
// skip the update if the update component is not found
|
||||
wchar_t path[_MAX_PATH];
|
||||
GetModuleFileName(_AtlBaseModule.GetModuleInstance(),path,_countof(path));
|
||||
PathRemoveFileSpec(path);
|
||||
PathAppend(path,L"Update.exe");
|
||||
|
||||
WIN32_FILE_ATTRIBUTE_DATA attr;
|
||||
if (!GetFileAttributesEx(path,GetFileExInfoStandard,&attr))
|
||||
return 0;
|
||||
|
||||
buildTime=(DWORD)(((((ULONGLONG)attr.ftCreationTime.dwHighDateTime)<<32)|attr.ftCreationTime.dwLowDateTime)/TIME_DIVISOR); // in 0.01 hours
|
||||
}
|
||||
|
||||
ULONGLONG curTimeL;
|
||||
GetSystemTimeAsFileTime((FILETIME*)&curTimeL);
|
||||
DWORD curTime=(DWORD)(curTimeL/TIME_DIVISOR); // in 0.01 hours
|
||||
if (curTime-buildTime>24*365*TIME_PRECISION)
|
||||
return 0; // the build is more than a year old, don't do automatic updates
|
||||
|
||||
CRegKey regKey;
|
||||
if (regKey.Open(HKEY_CURRENT_USER,L"Software\\OpenShell\\OpenShell")!=ERROR_SUCCESS)
|
||||
regKey.Create(HKEY_CURRENT_USER,L"Software\\OpenShell\\OpenShell");
|
||||
|
||||
DWORD lastVersion;
|
||||
if (regKey.QueryDWORDValue(L"LastUpdateVersion",lastVersion)!=ERROR_SUCCESS)
|
||||
lastVersion=0;
|
||||
if (lastVersion==GetVersionEx(g_Instance))
|
||||
{
|
||||
DWORD lastTime;
|
||||
if (regKey.QueryDWORDValue(L"LastUpdateTime",lastTime)!=ERROR_SUCCESS)
|
||||
lastTime=0;
|
||||
if ((int)(curTime-lastTime)<168*TIME_PRECISION)
|
||||
return 0; // check weekly
|
||||
}
|
||||
DWORD lastTime;
|
||||
if (regKey.QueryDWORDValue(L"LastUpdateTime",lastTime)!=ERROR_SUCCESS)
|
||||
lastTime=0;
|
||||
if ((int)(curTime-lastTime)<168*TIME_PRECISION)
|
||||
return 0; // check weekly
|
||||
|
||||
// check the Update setting (uses the current value in the registry, not the one from memory
|
||||
bool nightly = false;
|
||||
{
|
||||
CRegKey regSettings, regSettingsUser, regPolicy, regPolicyUser;
|
||||
bool bUpgrade=OpenSettingsKeys(COMPONENT_SHARED,regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
|
||||
CSetting settings[]={
|
||||
{L"Update",CSetting::TYPE_BOOL,0,0,1},
|
||||
{L"Nightly",CSetting::TYPE_BOOL,0,0,0},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
settings[0].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
settings[1].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
|
||||
if (!GetSettingBool(settings[0]))
|
||||
return 0;
|
||||
return 0;
|
||||
nightly = GetSettingBool(settings[1]);
|
||||
}
|
||||
|
||||
VersionCheckParams *params=new VersionCheckParams;
|
||||
@@ -641,6 +535,7 @@ DWORD CheckForNewVersion( HWND owner, TSettingsComponent component, TVersionChec
|
||||
params->component=component;
|
||||
params->callback=callback;
|
||||
params->progress=NULL;
|
||||
params->nightly=nightly;
|
||||
|
||||
g_bCheckingVersion=true;
|
||||
if (check==CHECK_AUTO_WAIT)
|
||||
@@ -848,6 +743,204 @@ void VersionData::Swap( VersionData &data )
|
||||
std::swap(languages,data.languages);
|
||||
}
|
||||
|
||||
std::vector<char> DownloadUrl(const wchar_t* url)
|
||||
{
|
||||
#ifdef UPDATE_LOG
|
||||
LogToFile(UPDATE_LOG, L"URL: %s", url);
|
||||
#endif
|
||||
|
||||
std::vector<char> buffer;
|
||||
TDownloadResult download = DownloadFile(url, buffer, nullptr, false, nullptr, COMPONENT_UPDATE);
|
||||
|
||||
#ifdef UPDATE_LOG
|
||||
LogToFile(UPDATE_LOG, L"Download result: %d", download);
|
||||
#endif
|
||||
|
||||
if (download != DOWNLOAD_OK)
|
||||
buffer.clear();
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
VersionData::TLoadResult VersionData::Load()
|
||||
{
|
||||
Clear();
|
||||
|
||||
auto buf = DownloadUrl(L"https://api.github.com/repos/Open-Shell/Open-Shell-Menu/releases/latest");
|
||||
if (buf.empty())
|
||||
return LOAD_ERROR;
|
||||
|
||||
try
|
||||
{
|
||||
auto data = json::parse(buf.begin(), buf.end());
|
||||
|
||||
// skip prerelease versions
|
||||
if (data["prerelease"].get<bool>())
|
||||
return LOAD_BAD_VERSION;
|
||||
|
||||
// get version from tag name
|
||||
auto tag = data["tag_name"].get<std::string>();
|
||||
if (tag.empty())
|
||||
return LOAD_BAD_FILE;
|
||||
|
||||
int v1, v2, v3;
|
||||
if (sscanf_s(tag.c_str(), "v%d.%d.%d", &v1, &v2, &v3) != 3)
|
||||
return LOAD_BAD_FILE;
|
||||
|
||||
newVersion = (v1 << 24) | (v2 << 16) | v3;
|
||||
|
||||
// installer url
|
||||
std::string url;
|
||||
for (const auto& asset : data["assets"])
|
||||
{
|
||||
if (asset["name"].get<std::string>().find("OpenShellSetup") == 0)
|
||||
{
|
||||
url = asset["browser_download_url"].get<std::string>();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (url.empty())
|
||||
return LOAD_BAD_FILE;
|
||||
|
||||
downloadUrl.Append(CA2T(url.c_str()));
|
||||
|
||||
// changelog
|
||||
auto body = data["body"].get<std::string>();
|
||||
if (!body.empty())
|
||||
{
|
||||
auto name = data["name"].get<std::string>();
|
||||
if (!name.empty())
|
||||
{
|
||||
news.Append(CA2T(name.c_str()));
|
||||
news.Append(L"\r\n\r\n");
|
||||
}
|
||||
|
||||
news.Append(CA2T(body.c_str()));
|
||||
news.Replace(L"\\n", L"\n");
|
||||
news.Replace(L"\\r", L"\r");
|
||||
}
|
||||
|
||||
return LOAD_OK;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return LOAD_BAD_FILE;
|
||||
}
|
||||
}
|
||||
|
||||
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 )
|
||||
{
|
||||
Clear();
|
||||
@@ -937,7 +1030,7 @@ static DWORD WINAPI ThreadDownloadFile( void *param )
|
||||
params.saveRes=0;
|
||||
|
||||
std::vector<char> buf;
|
||||
params.downloadRes=DownloadFile(params.url,buf,params.fname.IsEmpty()?¶ms.fname:NULL,0,params.bAcceptCached,params.progress,params.component);
|
||||
params.downloadRes=DownloadFile(params.url,buf,params.fname.IsEmpty()?¶ms.fname:NULL,params.bAcceptCached,params.progress,params.component);
|
||||
if (params.downloadRes==DOWNLOAD_CANCEL || params.downloadRes>=DOWNLOAD_FIRST_ERROR)
|
||||
return 0;
|
||||
|
||||
@@ -971,6 +1064,7 @@ static DWORD WINAPI ThreadDownloadFile( void *param )
|
||||
return 0;
|
||||
|
||||
// validate signer
|
||||
/*
|
||||
if (params.signer)
|
||||
{
|
||||
if (params.progress)
|
||||
@@ -982,7 +1076,7 @@ static DWORD WINAPI ThreadDownloadFile( void *param )
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1089,6 +1183,12 @@ DWORD DownloadNewVersion( HWND owner, TSettingsComponent component, const wchar_
|
||||
params.bAcceptCached=true;
|
||||
params.component=component;
|
||||
|
||||
{
|
||||
const wchar_t* name = wcsrchr(url, '/');
|
||||
if (name && name[1])
|
||||
params.fname.Append(name+1);
|
||||
}
|
||||
|
||||
HANDLE hThread=CreateThread(NULL,0,ThreadDownloadFile,¶ms,0,NULL);
|
||||
|
||||
while (1)
|
||||
|
||||
@@ -31,19 +31,19 @@ struct LanguageVersionData
|
||||
|
||||
struct VersionData
|
||||
{
|
||||
bool bValid;
|
||||
DWORD newVersion;
|
||||
DWORD encodedLangVersion;
|
||||
bool bValid = false;
|
||||
DWORD newVersion = 0;
|
||||
DWORD encodedLangVersion = 0;
|
||||
CString downloadUrl;
|
||||
CString downloadSigner;
|
||||
CString news;
|
||||
CString updateLink;
|
||||
CString languageLink;
|
||||
CString altUrl;
|
||||
bool bNewVersion;
|
||||
bool bIgnoreVersion;
|
||||
bool bNewLanguage;
|
||||
bool bIgnoreLanguage;
|
||||
bool bNewVersion = false;
|
||||
bool bIgnoreVersion = false;
|
||||
bool bNewLanguage = false;
|
||||
bool bIgnoreLanguage = false;
|
||||
CString newLanguage;
|
||||
std::vector<LanguageVersionData> languages;
|
||||
|
||||
@@ -59,6 +59,8 @@ struct VersionData
|
||||
LOAD_BAD_FILE, // the file is corrupted
|
||||
};
|
||||
|
||||
TLoadResult Load();
|
||||
TLoadResult LoadNightly();
|
||||
TLoadResult Load( const wchar_t *fname, bool bLoadFlags );
|
||||
private:
|
||||
void operator=( const VersionData& );
|
||||
|
||||
@@ -71,7 +71,7 @@ BEGIN
|
||||
CONTROL "Show all settings",IDC_CHECKALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,154,7,79,12
|
||||
CONTROL "<a>Help...</a>",IDC_LINKHELP,"SysLink",WS_TABSTOP,348,9,26,10,WS_EX_TRANSPARENT
|
||||
CONTROL "",IDC_TABSETTINGS,"SysTabControl32",TCS_MULTILINE | TCS_FOCUSNEVER,7,20,367,169
|
||||
CONTROL "<a>www.classicshell.net</a>",IDC_LINKWEB,"SysLink",WS_TABSTOP,7,195,66,10,WS_EX_TRANSPARENT
|
||||
CONTROL "<a>Open-Shell Homepage</a>",IDC_LINKWEB,"SysLink",WS_TABSTOP,7,195,75,10,WS_EX_TRANSPARENT
|
||||
CONTROL "Name of translator goes <a href=""http://www.yoursite.com"">here</a>",IDC_SYSLINKLOC,
|
||||
"SysLink",NOT WS_VISIBLE | WS_TABSTOP,80,195,111,10
|
||||
PUSHBUTTON "&Backup",IDC_BUTTONBACKUP,200,192,60,14,WS_GROUP
|
||||
@@ -277,7 +277,7 @@ BEGIN
|
||||
IDS_BMP_TITLE "Select Image File"
|
||||
IDS_SEARCH_PROMPT "Search Settings"
|
||||
IDS_SETTING_SEARCH "Search Results"
|
||||
IDS_WEBSITE_TIP "Visit Open-Shell on the web - http://www.classicshell.net"
|
||||
IDS_WEBSITE_TIP "Visit Open-Shell on the web - https://open-shell.github.io/Open-Shell-Menu"
|
||||
IDS_LOCATE_SETTING "Locate setting"
|
||||
IDS_LANGUAGE_UPDATED "The language %s is up to date."
|
||||
IDS_LANGUAGE_MISSING "Update for language %s is not available."
|
||||
|
||||
@@ -22,32 +22,32 @@
|
||||
<ProjectGuid>{D42FE717-485B-492D-884A-1999F6D51154}</ProjectGuid>
|
||||
<RootNamespace>Lib</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
@@ -83,6 +83,11 @@
|
||||
<OutDir>$(Configuration)64\</OutDir>
|
||||
<IntDir>$(Configuration)64\</IntDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>APPVEYOR_REPO_COMMIT="$(APPVEYOR_REPO_COMMIT)";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
|
||||
@@ -332,6 +332,7 @@ HBITMAP BitmapFromIcon( HICON hIcon, int iconSize, unsigned int **pBits, bool bD
|
||||
// Premultiplies a DIB section by the alpha channel and a given color
|
||||
void PremultiplyBitmap( HBITMAP hBitmap, COLORREF rgb )
|
||||
{
|
||||
if (hBitmap == NULL) return;
|
||||
BITMAP info;
|
||||
GetObject(hBitmap,sizeof(info),&info);
|
||||
int n=info.bmWidth*info.bmHeight;
|
||||
|
||||
@@ -1810,7 +1810,7 @@ LRESULT CSettingsDlg::OnHelp( int idCtrl, LPNMHDR pnmh, BOOL& bHandled )
|
||||
|
||||
LRESULT CSettingsDlg::OnWeb( int idCtrl, LPNMHDR pnmh, BOOL& bHandled )
|
||||
{
|
||||
ShellExecute(m_hWnd,NULL,L"http://www.classicshell.net",NULL,NULL,SW_SHOWNORMAL);
|
||||
ShellExecute(m_hWnd,NULL,L"https://open-shell.github.io/Open-Shell-Menu",NULL,NULL,SW_SHOWNORMAL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
25447
Src/Lib/json.hpp
Normal file
@@ -1,7 +1,7 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.27130.2010
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.29324.140
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Skins", "Skins", "{409484D8-C0DB-4991-AF03-124128EDEF98}"
|
||||
EndProject
|
||||
@@ -40,6 +40,9 @@ EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ClassicIEDLL", "ClassicIE\ClassicIEDLL\ClassicIEDLL.vcxproj", "{BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Update", "Update\Update.vcxproj", "{171B46B0-6083-4D9E-BD33-946EA3BD76FA}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1} = {D94BD2A6-1872-4F01-B911-F406603AA2E1}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Win7Aero7", "Skins\Win7Aero7\Win7Aero7.vcxproj", "{A2CCDE9F-17CE-461E-8BD9-00261B8855A6}"
|
||||
EndProject
|
||||
@@ -63,6 +66,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Metro", "Skins\Metro\Metro.
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Metallic7", "Skins\Metallic7\Metallic7.vcxproj", "{CA5BFC96-428D-42F5-9F7D-CDDE048A357C}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DesktopToasts", "Update\DesktopToasts\DesktopToasts.vcxproj", "{D94BD2A6-1872-4F01-B911-F406603AA2E1}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
@@ -374,6 +379,15 @@ Global
|
||||
{CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|Win32.ActiveCfg = Resource|Win32
|
||||
{CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|Win32.Build.0 = Resource|Win32
|
||||
{CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|x64.ActiveCfg = Resource|Win32
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|Win32.Build.0 = Release|Win32
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|x64.ActiveCfg = Release|Win32
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|Win32.ActiveCfg = Release|Win32
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|Win32.Build.0 = Release|Win32
|
||||
{D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|x64.ActiveCfg = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -3,9 +3,7 @@ REM ***** Collect PDBs
|
||||
echo -- Creating symbols package
|
||||
set CS_SYMBOLS_NAME=OpenShellPDB_%CS_VERSION_STR%.7z
|
||||
|
||||
cd Output
|
||||
7z a -mx9 ..\Final\%CS_SYMBOLS_NAME% PDB32 PDB64 > nul
|
||||
cd ..
|
||||
7z a -mx9 .\Final\%CS_SYMBOLS_NAME% .\Output\symbols\* > nul
|
||||
|
||||
if defined APPVEYOR (
|
||||
appveyor PushArtifact Final\%CS_SYMBOLS_NAME%
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
if exist Output rd /Q /S Output
|
||||
md Output
|
||||
md Output\x64
|
||||
md Output\PDB32
|
||||
md Output\PDB64
|
||||
|
||||
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\15.0\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\
|
||||
|
||||
REM ********* Build 64-bit solution
|
||||
echo --- 64bit
|
||||
@@ -40,6 +38,7 @@ copy /B ..\ClassicIE\Setup\ClassicIE_32.exe Output > nul
|
||||
copy /B ..\StartMenu\Setup\StartMenu.exe Output > nul
|
||||
copy /B ..\StartMenu\Setup\StartMenuDLL.dll Output > nul
|
||||
copy /B ..\Update\Release\Update.exe Output > nul
|
||||
copy /B ..\Update\DesktopToasts\Release\DesktopToasts.dll Output > nul
|
||||
copy /B ..\StartMenu\StartMenuHelper\Setup\StartMenuHelper32.dll Output > nul
|
||||
copy /B ..\Setup\SetupHelper\Release\SetupHelper.exe Output > nul
|
||||
|
||||
@@ -67,6 +66,8 @@ copy /B "..\StartMenu\Skins\Metallic.skin7" Output > nul
|
||||
|
||||
|
||||
REM ********* Collect debug info
|
||||
md Output\PDB32
|
||||
md Output\PDB64
|
||||
|
||||
REM Explorer 32
|
||||
copy /B ..\ClassicExplorer\Setup\ClassicExplorer32.pdb Output\PDB32 > nul
|
||||
@@ -99,6 +100,8 @@ copy /B ..\StartMenu\StartMenuHelper\Setup\StartMenuHelper32.pdb Output\PDB32 >
|
||||
copy /B Output\StartMenuHelper32.dll Output\PDB32 > nul
|
||||
copy /B ..\Update\Release\Update.pdb Output\PDB32 > nul
|
||||
copy /B Output\Update.exe Output\PDB32 > nul
|
||||
copy /B ..\Update\DesktopToasts\Release\DesktopToasts.pdb Output\PDB32 > nul
|
||||
copy /B Output\DesktopToasts.dll Output\PDB32 > nul
|
||||
|
||||
REM Menu 64
|
||||
copy /B ..\StartMenu\Setup64\StartMenu.pdb Output\PDB64 > nul
|
||||
@@ -126,6 +129,18 @@ if exist %PDBSTR_PATH% (
|
||||
)
|
||||
)
|
||||
|
||||
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
|
||||
rd /Q /S Output\symbols\000Admin > nul
|
||||
del Output\symbols\pingme.txt > nul
|
||||
|
||||
rd /Q /S Output\PDB32
|
||||
rd /Q /S Output\PDB64
|
||||
|
||||
REM ********* Build ADMX
|
||||
echo --- ADMX
|
||||
if exist Output\PolicyDefinitions.zip (
|
||||
|
||||
@@ -65,7 +65,7 @@ Utility\Release\Utility.exe crcmsi Temp
|
||||
|
||||
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\15.0\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\
|
||||
|
||||
"%MSBuildDir%MSBuild.exe" Setup.sln /m /t:Rebuild /p:Configuration="Release" /p:Platform="Win32" /verbosity:quiet /nologo
|
||||
@if ERRORLEVEL 1 exit /b 1
|
||||
|
||||
@@ -14,18 +14,18 @@
|
||||
<ProjectGuid>{A4A4D3B1-24E7-401E-A37C-72141D7603DC}</ProjectGuid>
|
||||
<RootNamespace>Setup</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -55,7 +55,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
|
||||
@@ -105,7 +105,9 @@
|
||||
</Feature>
|
||||
<Feature Id="Update" Level="1" Title="!(loc.UpdateTitle)" ConfigurableDirectory="APPLICATIONFOLDER" AllowAdvertise="no" Description="!(loc.UpdateDesc)">
|
||||
<ComponentRef Id="Update.exe" />
|
||||
<ComponentRef Id="DesktopToasts.dll" />
|
||||
<ComponentRef Id="UpdateSettingsLink" />
|
||||
<ComponentRef Id="ToastActivator" />
|
||||
</Feature>
|
||||
</Feature>
|
||||
<UI>
|
||||
@@ -388,8 +390,8 @@
|
||||
<Control Type="Icon" Id="Icon1" Width="12" Height="12" X="7" Y="203" Hidden="yes" Text="web.ico">
|
||||
<Condition Action="show">NOT Installed</Condition>
|
||||
</Control>
|
||||
<Control Type="Hyperlink" Id="Link1" Width="131" Height="10" X="22" Y="204" Hidden="yes" ToolTip="https://github.com/Open-Shell/Open-Shell-Menu">
|
||||
<Text><![CDATA[<a href="https://github.com/Open-Shell/Open-Shell-Menu">!(loc.WebLink)</a>]]></Text>
|
||||
<Control Type="Hyperlink" Id="Link1" Width="131" Height="10" X="22" Y="204" Hidden="yes" ToolTip="https://open-shell.github.io/Open-Shell-Menu">
|
||||
<Text><![CDATA[<a href="https://open-shell.github.io/Open-Shell-Menu">!(loc.WebLink)</a>]]></Text>
|
||||
<Condition Action="show">NOT Installed</Condition>
|
||||
</Control>
|
||||
</Dialog>
|
||||
@@ -476,6 +478,9 @@
|
||||
<Component Id="Update.exe" Guid="FB6C213F-B670-4888-8B2C-12E807E335A7" Win64="$(var.CS_WIN64)">
|
||||
<File Id="Update" KeyPath="yes" Source="Output\Update.exe" Checksum="yes" Vital="yes" />
|
||||
</Component>
|
||||
<Component Id="DesktopToasts.dll" Guid="B42157AF-3984-4796-8BD6-501FC5450FF1" Win64="$(var.CS_WIN64)">
|
||||
<File Id="DesktopToasts.dll" KeyPath="yes" Source="Output\DesktopToasts.dll" Checksum="yes" Vital="yes" />
|
||||
</Component>
|
||||
<Component Id="PolicyDefinitions.zip" Guid="580A15D0-4023-471d-9D82-9D63FBA42B5D" Win64="$(var.CS_WIN64)">
|
||||
<File Id="PolicyDefinitions.zip" KeyPath="yes" Source="Output\PolicyDefinitions.zip" Vital="yes" />
|
||||
</Component>
|
||||
@@ -551,6 +556,11 @@
|
||||
<Component Id="TreatAs" Guid="B1E7462A-E1E2-47eb-A42C-7BD272D738AA" Win64="$(var.CS_WIN64)">
|
||||
<RegistryKey Root="HKCR" Key="CLSID\{ECD4FC4D-521C-11D0-B792-00A0C90312E1}\TreatAs" ForceDeleteOnUninstall="yes" />
|
||||
</Component>
|
||||
<Component Id="ToastActivator" Guid="3A0FDC31-D5D3-4C2E-9A0B-292CAB46DA87" Win64="$(var.CS_WIN64)">
|
||||
<RegistryKey Root="HKCR" Key="CLSID\{E407B70A-1FBD-4D5E-8822-231C69102472}\LocalServer32" ForceDeleteOnUninstall="yes">
|
||||
<RegistryValue Value=""[APPLICATIONFOLDER]Update.exe" -ToastActivated" Type="string" />
|
||||
</RegistryKey>
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
<DirectoryRef Id="StartMenuDir">
|
||||
<Component Id="HelpLink" Guid="D631C351-7BD4-42CE-813C-5D46347068AF">
|
||||
@@ -564,7 +574,11 @@
|
||||
<Condition>START_MENU_FOLDER=1</Condition>
|
||||
</Component>
|
||||
<Component Id="UpdateSettingsLink" Guid="10B5A082-6C92-4EA7-AFF8-21AE3D2D7FE0">
|
||||
<Shortcut Id="UpdateSettingsLink" Name="!(loc.UpdateItem)" Advertise="no" Description="!(loc.UpdateSettingsDesc)" Target="[APPLICATIONFOLDER]Update.exe" WorkingDirectory="APPLICATIONFOLDER" />
|
||||
<Shortcut Id="UpdateSettingsLink" Name="!(loc.UpdateItem)" Advertise="no" Description="!(loc.UpdateSettingsDesc)" Target="[APPLICATIONFOLDER]Update.exe" WorkingDirectory="APPLICATIONFOLDER">
|
||||
<ShortcutProperty Key="System.AppUserModel.ID" Value="OpenShell.Update"/>
|
||||
<!-- Windows 7 doesn't recognize `System.AppUserModel.ToastActivatorCLSID` name so we have to use GUID directly -->
|
||||
<ShortcutProperty Key="{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}, 26" Value="{E407B70A-1FBD-4D5E-8822-231C69102472}"/>
|
||||
</Shortcut>
|
||||
<CreateFolder />
|
||||
<Condition>START_MENU_FOLDER=1</Condition>
|
||||
</Component>
|
||||
@@ -607,9 +621,9 @@
|
||||
<Property Id="ApplicationFolderName" Value="Open-Shell" />
|
||||
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
|
||||
<Property Id="ALLUSERS" Value="1" />
|
||||
<Property Id="ARPHELPLINK" Value="http://www.classicshell.net/forum/" />
|
||||
<Property Id="ARPHELPLINK" Value="https://github.com/Open-Shell/Open-Shell-Menu/issues" />
|
||||
<Property Id="ARPSIZE" Value="9000" />
|
||||
<Property Id="ARPURLINFOABOUT" Value="http://www.classicshell.net/" />
|
||||
<Property Id="ARPURLINFOABOUT" Value="https://open-shell.github.io/Open-Shell-Menu" />
|
||||
<Property Id="ARPNOMODIFY" Value="1" />
|
||||
<Property Id="ARPNOREPAIR" Value="1" />
|
||||
<Property Id="START_MENU_FOLDER" Value="1" />
|
||||
|
||||
@@ -14,18 +14,18 @@
|
||||
<ProjectGuid>{E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}</ProjectGuid>
|
||||
<RootNamespace>SetupHelper</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -53,7 +53,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
|
||||
@@ -50,62 +50,62 @@
|
||||
<ProjectGuid>{F92A5473-F9E0-412F-923C-6632A66D13C1}</ProjectGuid>
|
||||
<RootNamespace>UpdateBin</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.3.1|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.3.0|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.2.7|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.2.6|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.2.5|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.2.4|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.2.3|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.2.2|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.2.1|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.2.0|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='update_4.1.0|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -503,4 +503,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <atlctl.h>
|
||||
#include <atlstr.h>
|
||||
#include <atltypes.h>
|
||||
#include <string>
|
||||
#include "ResourceHelper.h"
|
||||
#include "ComHelper.h"
|
||||
#include "StringUtils.h"
|
||||
@@ -452,6 +453,32 @@ static void SaveReportFile( void )
|
||||
}
|
||||
}
|
||||
|
||||
static void RemoveShellExtKey(const wchar_t* progID)
|
||||
{
|
||||
static const auto ShellExtName = L"StartMenuExt";
|
||||
auto contextMenuHandlers = std::wstring(progID) + L"\\ShellEx\\ContextMenuHandlers";
|
||||
auto startMenuExt = contextMenuHandlers + L"\\" + ShellExtName;
|
||||
|
||||
HKEY hkey = NULL;
|
||||
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, startMenuExt.c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &hkey) == ERROR_SUCCESS)
|
||||
{
|
||||
RegCloseKey(hkey);
|
||||
LogMessage(-1, L"Deleting registry key HKEY_CLASSES_ROOT\\%s", startMenuExt.c_str());
|
||||
auto error = RegCreateKeyEx(HKEY_CLASSES_ROOT, contextMenuHandlers.c_str(), NULL, NULL, REG_OPTION_BACKUP_RESTORE, KEY_WRITE | DELETE | KEY_WOW64_64KEY, NULL, &hkey, NULL);
|
||||
if (error == ERROR_SUCCESS)
|
||||
{
|
||||
error = RegDeleteTree2(hkey, ShellExtName);
|
||||
if (error != ERROR_SUCCESS && error != ERROR_FILE_NOT_FOUND)
|
||||
LogMessage(error, L"Failed to delete registry key HKEY_CLASSES_ROOT\\%s.", startMenuExt.c_str());
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
else if (error != ERROR_FILE_NOT_FOUND)
|
||||
{
|
||||
LogMessage(error, L"Failed to open registry key HKEY_CLASSES_ROOT\\%s for writing.", contextMenuHandlers.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool RemoveRegistryKeys( bool bPin )
|
||||
{
|
||||
HKEY hkey=NULL;
|
||||
@@ -488,40 +515,11 @@ static bool RemoveRegistryKeys( bool bPin )
|
||||
}
|
||||
}
|
||||
|
||||
hkey=NULL;
|
||||
if (bPin)
|
||||
{
|
||||
if (RegOpenKeyEx(HKEY_CLASSES_ROOT,L"Launcher.ImmersiveApplication\\ShellEx\\ContextMenuHandlers\\StartMenuExt",0,KEY_READ|KEY_WOW64_64KEY,&hkey)==ERROR_SUCCESS)
|
||||
{
|
||||
RegCloseKey(hkey);
|
||||
LogMessage(-1,L"Deleting registry key HKEY_CLASSES_ROOT\\Launcher.ImmersiveApplication\\ShellEx\\ContextMenuHandlers\\StartMenuExt");
|
||||
error=RegCreateKeyEx(HKEY_CLASSES_ROOT,L"Launcher.ImmersiveApplication\\ShellEx\\ContextMenuHandlers",NULL,NULL,REG_OPTION_BACKUP_RESTORE,KEY_WRITE|DELETE|KEY_WOW64_64KEY,NULL,&hkey,NULL);
|
||||
if (error==ERROR_SUCCESS)
|
||||
{
|
||||
error=RegDeleteTree2(hkey,L"StartMenuExt");
|
||||
if (error!=ERROR_SUCCESS && error!=ERROR_FILE_NOT_FOUND)
|
||||
LogMessage(error,L"Failed to delete registry key HKEY_CLASSES_ROOT\\Launcher.ImmersiveApplication\\ShellEx\\ContextMenuHandlers\\StartMenuExt.");
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
else if (error!=ERROR_FILE_NOT_FOUND)
|
||||
LogMessage(error,L"Failed to open registry key HKEY_CLASSES_ROOT\\Launcher.ImmersiveApplication\\ShellEx\\ContextMenuHandlers for writing.");
|
||||
}
|
||||
|
||||
if (RegOpenKeyEx(HKEY_CLASSES_ROOT,L"Launcher.SystemSettings\\ShellEx\\ContextMenuHandlers\\StartMenuExt",0,KEY_READ|KEY_WOW64_64KEY,&hkey)==ERROR_SUCCESS)
|
||||
{
|
||||
RegCloseKey(hkey);
|
||||
LogMessage(-1,L"Deleting registry key HKEY_CLASSES_ROOT\\Launcher.SystemSettings\\ShellEx\\ContextMenuHandlers\\StartMenuExt");
|
||||
error=RegCreateKeyEx(HKEY_CLASSES_ROOT,L"Launcher.SystemSettings\\ShellEx\\ContextMenuHandlers",NULL,NULL,REG_OPTION_BACKUP_RESTORE,KEY_WRITE|DELETE|KEY_WOW64_64KEY,NULL,&hkey,NULL);
|
||||
if (error==ERROR_SUCCESS)
|
||||
{
|
||||
error=RegDeleteTree2(hkey,L"StartMenuExt");
|
||||
if (error!=ERROR_SUCCESS && error!=ERROR_FILE_NOT_FOUND)
|
||||
LogMessage(error,L"Failed to delete registry key HKEY_CLASSES_ROOT\\Launcher.SystemSettings\\ShellEx\\ContextMenuHandlers\\StartMenuExt.");
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
else if (error!=ERROR_FILE_NOT_FOUND)
|
||||
LogMessage(error,L"Failed to open registry key HKEY_CLASSES_ROOT\\Launcher.SystemSettings\\ShellEx\\ContextMenuHandlers for writing.");
|
||||
}
|
||||
RemoveShellExtKey(L"Launcher.ImmersiveApplication");
|
||||
RemoveShellExtKey(L"Launcher.DesktopPackagedApplication");
|
||||
RemoveShellExtKey(L"Launcher.SystemSettings");
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -405,7 +405,7 @@ void ShowMetroColorViewer( void )
|
||||
if (fout) fprintf(fout,"%02X%02X%02X%02X %S\n",(color>>24)&0xFF,color&0xFF,(color>>8)&0xFF,(color>>16)&0xFF,name);
|
||||
#endif
|
||||
MetroColor mc;
|
||||
mc.name=name;
|
||||
mc.name=text;
|
||||
mc.NAME=mc.name;
|
||||
mc.NAME.MakeUpper();
|
||||
mc.type=type;
|
||||
|
||||
@@ -22,32 +22,32 @@
|
||||
<ProjectGuid>{DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}</ProjectGuid>
|
||||
<RootNamespace>Utility</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
@@ -92,7 +92,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
@@ -112,7 +111,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
|
||||
@@ -7,7 +7,7 @@ rem Clean repository and build fresh. Will erase current changes so disabled by
|
||||
rem git clean -dfx
|
||||
|
||||
rem Default version
|
||||
set CS_VERSION=4.4.110
|
||||
set CS_VERSION=4.4.1000
|
||||
|
||||
if defined APPVEYOR_BUILD_VERSION (
|
||||
set CS_VERSION=%APPVEYOR_BUILD_VERSION%
|
||||
|
||||
@@ -9,7 +9,7 @@ rem Clean repository and build fresh. Will erase current changes so disabled by
|
||||
rem git clean -dfx
|
||||
|
||||
rem Default version
|
||||
set CS_VERSION=4.3.2
|
||||
set CS_VERSION=4.4.1000
|
||||
|
||||
if defined APPVEYOR_BUILD_VERSION (
|
||||
set CS_VERSION=%APPVEYOR_BUILD_VERSION%
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{0A60FD06-3A81-4651-A869-9850DBC115EA}</ProjectGuid>
|
||||
<RootNamespace>enUS</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{9EC23CA9-384A-4EEB-979E-69879DC1A78C}</ProjectGuid>
|
||||
<RootNamespace>ClassicSkin</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -62,4 +62,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{31C016FB-9EA1-4AF5-987A-37210C04DA06}</ProjectGuid>
|
||||
<RootNamespace>ClassicSkin7</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -63,4 +63,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{066C9721-26D5-4C4D-868E-50C2BA0A8196}</ProjectGuid>
|
||||
<RootNamespace>FullGlass</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -75,4 +75,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{CA5BFC96-428D-42F5-9F7D-CDDE048A357C}</ProjectGuid>
|
||||
<RootNamespace>Metallic7</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -85,4 +85,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}</ProjectGuid>
|
||||
<RootNamespace>Metro</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -74,4 +74,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -105,7 +105,6 @@ Submenu_padding=2,2,2,2
|
||||
|
||||
; These have the same meaning as the Main_... properties
|
||||
Submenu_opacity=region
|
||||
Submenu_opacity=region
|
||||
Submenu_bitmap=$SystemAccentDark1|$StartBackground
|
||||
Submenu_bitmap_tint1=$StartHighlight
|
||||
Submenu_bitmap_mask=2
|
||||
@@ -179,9 +178,11 @@ Main_icon_frame_tint1=$SystemAccentDark2|$StartSelectionBackground
|
||||
Main_icon_frame_mask=10
|
||||
Main_icon_frame_slices_X=4,4,4
|
||||
Main_icon_frame_slices_Y=4,4,4
|
||||
Main_icon_frame_offset=3,3
|
||||
Main_icon_frame_offset=3,3,100%
|
||||
Main_icon_padding=6,6,6,6,100%
|
||||
Main_text_padding=5,2,8,2,100%
|
||||
|
||||
[ICON_FRAMES AND NOT SMALL_ICONS AND NOT NO_ICONS]
|
||||
Main2_icon_padding=6,6,6,6,100%
|
||||
Main2_text_padding=5,2,8,2,100%
|
||||
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{598AB4AC-008E-4501-90B3-C5213834C1DA}</ProjectGuid>
|
||||
<RootNamespace>Metro7</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -82,4 +82,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -143,6 +143,7 @@ Scrollbar_arrows_mask=17
|
||||
|
||||
|
||||
; LIST SECTION
|
||||
List_icon_padding=3,3,3,3,100%
|
||||
List_text_padding=0,0,4,0,100%
|
||||
List_separator_font="Segoe UI",bold,-9
|
||||
List_separator_text_padding=3,0,0,0,100%
|
||||
@@ -249,7 +250,7 @@ Main_icon_frame_tint1=$SystemAccentDark2|$StartSelectionBackground
|
||||
Main_icon_frame_mask=10
|
||||
Main_icon_frame_slices_X=4,4,4
|
||||
Main_icon_frame_slices_Y=4,4,4
|
||||
Main_icon_frame_offset=3,3
|
||||
Main_icon_frame_offset=3,3,100%
|
||||
List_icon_frame=0
|
||||
Main_icon_padding=6,6,6,6,100%
|
||||
Main_text_padding=5,2,8,2,100%
|
||||
|
||||
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{7BD26CB3-5280-48FD-9A86-C13E321018D5}</ProjectGuid>
|
||||
<RootNamespace>Midnight7</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -95,4 +95,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{66D1EAA4-65D1-45CC-9989-E616FC0575EB}</ProjectGuid>
|
||||
<RootNamespace>SmokedGlass</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -69,4 +69,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}</ProjectGuid>
|
||||
<RootNamespace>Win7Aero</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -78,4 +78,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{A2CCDE9F-17CE-461E-8BD9-00261B8855A6}</ProjectGuid>
|
||||
<RootNamespace>Win7Aero7</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -87,4 +87,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{404821C5-4EE4-4908-A759-5EF6DAC14AB6}</ProjectGuid>
|
||||
<RootNamespace>Win7Basic</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -78,4 +78,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}</ProjectGuid>
|
||||
<RootNamespace>Win8</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -84,4 +84,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}</ProjectGuid>
|
||||
<RootNamespace>Win87</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -85,4 +85,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -10,12 +10,12 @@
|
||||
<ProjectGuid>{81EB6336-366C-47DD-82CF-FF6C36CCD2B5}</ProjectGuid>
|
||||
<RootNamespace>WinXP</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Resource|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
@@ -83,4 +83,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -274,6 +274,97 @@ public:
|
||||
//const wchar_t *g_AppId=L"Microsoft.BingWeather_8wekyb3d8bbwe!App";
|
||||
const wchar_t *g_AppId=L"microsoft.windowscommunicationsapps_8wekyb3d8bbwe!microsoft.windowslive.calendar";
|
||||
|
||||
static DWORD g_winVer = GetVersionEx(GetModuleHandle(L"user32.dll"));
|
||||
|
||||
bool WasOsUpgrade()
|
||||
{
|
||||
CRegKey regKey;
|
||||
if (regKey.Open(HKEY_LOCAL_MACHINE, L"Software\\OpenShell\\OpenShell", KEY_READ | KEY_WOW64_64KEY) == ERROR_SUCCESS)
|
||||
{
|
||||
DWORD ver;
|
||||
if (regKey.QueryDWORDValue(L"WinVersion", ver) == ERROR_SUCCESS)
|
||||
{
|
||||
if (ver < g_winVer)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// starts new instance of StartMenu.exe with "-upgrade" command line parameter
|
||||
// UAC dialog is shown to ensure it will run with administrator privileges
|
||||
void RunOsUpgradeTaskAsAdmin()
|
||||
{
|
||||
#ifdef _WIN64
|
||||
wchar_t path[_MAX_PATH] = L"%windir%\\System32\\StartMenuHelper64.dll";
|
||||
#else
|
||||
wchar_t path[_MAX_PATH] = L"%windir%\\System32\\StartMenuHelper32.dll";
|
||||
#endif
|
||||
DoEnvironmentSubst(path, _countof(path));
|
||||
if (GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
GetModuleFileName(NULL, path, _countof(path));
|
||||
CoInitialize(NULL);
|
||||
ShellExecute(NULL, L"runas", path, L"-upgrade", NULL, SW_SHOWNORMAL);
|
||||
CoUninitialize();
|
||||
}
|
||||
}
|
||||
|
||||
DWORD PerformOsUpgradeTask(bool silent)
|
||||
{
|
||||
CRegKey regKey;
|
||||
DWORD error = regKey.Open(HKEY_LOCAL_MACHINE, L"Software\\OpenShell\\OpenShell", KEY_WRITE | KEY_WOW64_64KEY);
|
||||
const wchar_t *nl = error == ERROR_SUCCESS ? L"\r\n\r\n" : L"\r\n";
|
||||
if (error == ERROR_SUCCESS)
|
||||
{
|
||||
regKey.SetDWORDValue(L"WinVersion", g_winVer);
|
||||
|
||||
// run regsvr32 StartMenuHelper
|
||||
#ifdef _WIN64
|
||||
wchar_t cmdLine[_MAX_PATH] = L"regsvr32 /s \"%windir%\\System32\\StartMenuHelper64.dll\"";
|
||||
#else
|
||||
wchar_t cmdLine[_MAX_PATH] = L"regsvr32 /s \"%windir%\\System32\\StartMenuHelper32.dll\"";
|
||||
#endif
|
||||
DoEnvironmentSubst(cmdLine, _countof(cmdLine));
|
||||
|
||||
wchar_t exe[_MAX_PATH] = L"%windir%\\System32\\regsvr32.exe";
|
||||
DoEnvironmentSubst(exe, _countof(exe));
|
||||
|
||||
STARTUPINFO startupInfo = { sizeof(startupInfo) };
|
||||
PROCESS_INFORMATION processInfo;
|
||||
memset(&processInfo, 0, sizeof(processInfo));
|
||||
if (CreateProcess(exe, cmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo))
|
||||
{
|
||||
CloseHandle(processInfo.hThread);
|
||||
WaitForSingleObject(processInfo.hProcess, INFINITE);
|
||||
GetExitCodeProcess(processInfo.hProcess, &error);
|
||||
CloseHandle(processInfo.hProcess);
|
||||
}
|
||||
else
|
||||
{
|
||||
error = GetLastError();
|
||||
}
|
||||
}
|
||||
|
||||
if (!silent)
|
||||
{
|
||||
if (error)
|
||||
{
|
||||
wchar_t msg[1024];
|
||||
int len = Sprintf(msg, _countof(msg), L"%s%s", DllLoadStringEx(IDS_UPGRADE_ERROR), nl);
|
||||
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 0, msg + len, _countof(msg) - len, NULL);
|
||||
MessageBox(NULL, msg, DllLoadStringEx(IDS_APP_TITLE), MB_OK | MB_ICONERROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox(NULL, DllLoadStringEx(IDS_UPGRADE_SUCCESS), DllLoadStringEx(IDS_APP_TITLE), MB_OK | MB_ICONINFORMATION);
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrCmdLine, int nCmdShow )
|
||||
{
|
||||
/* CoInitialize(NULL);
|
||||
@@ -340,8 +431,8 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC
|
||||
ImportLegacyData();
|
||||
|
||||
DllLogToFile(STARTUP_LOG,L"StartMenu: start '%s'",lpstrCmdLine);
|
||||
DWORD winVer=GetVersionEx(GetModuleHandle(L"user32.dll"));
|
||||
if (wcsstr(lpstrCmdLine,L"-startup") || (wcsstr(lpstrCmdLine,L"-autorun") && HIWORD(winVer)<WIN_VER_WIN8))
|
||||
|
||||
if (wcsstr(lpstrCmdLine,L"-startup") || (wcsstr(lpstrCmdLine,L"-autorun") && HIWORD(g_winVer)<WIN_VER_WIN8))
|
||||
{
|
||||
WaitDllInitThread();
|
||||
if (!DllGetSettingBool(L"AutoStart"))
|
||||
@@ -360,31 +451,11 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC
|
||||
else if (wcsstr(lpstrCmdLine,L"-autorun")) // on Win8+
|
||||
{
|
||||
WaitDllInitThread();
|
||||
CRegKey regKey;
|
||||
if (regKey.Open(HKEY_LOCAL_MACHINE,L"Software\\OpenShell\\OpenShell",KEY_READ|KEY_WOW64_64KEY)==ERROR_SUCCESS)
|
||||
if (WasOsUpgrade())
|
||||
{
|
||||
DWORD ver1;
|
||||
if (regKey.QueryDWORDValue(L"WinVersion",ver1)==ERROR_SUCCESS)
|
||||
{
|
||||
if (ver1<winVer)
|
||||
{
|
||||
// this is an upgrade
|
||||
MessageBox(NULL,DllLoadStringEx(IDS_UPGRADE_WIN),DllLoadStringEx(IDS_APP_TITLE),MB_OK);
|
||||
#ifdef _WIN64
|
||||
wchar_t path[_MAX_PATH]=L"%windir%\\System32\\StartMenuHelper64.dll";
|
||||
#else
|
||||
wchar_t path[_MAX_PATH]=L"%windir%\\System32\\StartMenuHelper32.dll";
|
||||
#endif
|
||||
DoEnvironmentSubst(path,_countof(path));
|
||||
if (GetFileAttributes(path)!=INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
GetModuleFileName(NULL,path,_countof(path));
|
||||
CoInitialize(NULL);
|
||||
ShellExecute(NULL,L"runas",path,L"-upgrade",NULL,SW_SHOWNORMAL);
|
||||
CoUninitialize();
|
||||
}
|
||||
}
|
||||
}
|
||||
// this is an upgrade
|
||||
MessageBox(NULL, DllLoadStringEx(IDS_UPGRADE_WIN), DllLoadStringEx(IDS_APP_TITLE), MB_OK);
|
||||
RunOsUpgradeTaskAsAdmin();
|
||||
}
|
||||
if (!DllGetSettingBool(L"AutoStart"))
|
||||
{
|
||||
@@ -399,49 +470,14 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC
|
||||
if (wcsstr(lpstrCmdLine,L"-upgrade"))
|
||||
{
|
||||
WaitDllInitThread();
|
||||
CRegKey regKey;
|
||||
DWORD error=regKey.Open(HKEY_LOCAL_MACHINE,L"Software\\OpenShell\\OpenShell",KEY_WRITE|KEY_WOW64_64KEY);
|
||||
const wchar_t *nl=error==ERROR_SUCCESS?L"\r\n\r\n":L"\r\n";
|
||||
if (error==ERROR_SUCCESS)
|
||||
{
|
||||
regKey.SetDWORDValue(L"WinVersion",winVer);
|
||||
|
||||
// run regsvr32 StartMenuHelper
|
||||
#ifdef _WIN64
|
||||
wchar_t cmdLine[_MAX_PATH]=L"regsvr32 /s \"%windir%\\System32\\StartMenuHelper64.dll\"";
|
||||
#else
|
||||
wchar_t cmdLine[_MAX_PATH]=L"regsvr32 /s \"%windir%\\System32\\StartMenuHelper32.dll\"";
|
||||
#endif
|
||||
DoEnvironmentSubst(cmdLine,_countof(cmdLine));
|
||||
|
||||
wchar_t exe[_MAX_PATH]=L"%windir%\\System32\\regsvr32.exe";
|
||||
DoEnvironmentSubst(exe,_countof(exe));
|
||||
|
||||
STARTUPINFO startupInfo={sizeof(startupInfo)};
|
||||
PROCESS_INFORMATION processInfo;
|
||||
memset(&processInfo,0,sizeof(processInfo));
|
||||
if (CreateProcess(exe,cmdLine,NULL,NULL,FALSE,0,NULL,NULL,&startupInfo,&processInfo))
|
||||
{
|
||||
CloseHandle(processInfo.hThread);
|
||||
WaitForSingleObject(processInfo.hProcess,INFINITE);
|
||||
GetExitCodeProcess(processInfo.hProcess,&error);
|
||||
CloseHandle(processInfo.hProcess);
|
||||
}
|
||||
else
|
||||
error=GetLastError();
|
||||
}
|
||||
if (error)
|
||||
if (WasOsUpgrade())
|
||||
{
|
||||
wchar_t msg[1024];
|
||||
int len=Sprintf(msg,_countof(msg),L"%s%s",DllLoadStringEx(IDS_UPGRADE_ERROR),nl);
|
||||
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,error,0,msg+len,_countof(msg)-len,NULL);
|
||||
MessageBox(NULL,msg,DllLoadStringEx(IDS_APP_TITLE),MB_OK|MB_ICONERROR);
|
||||
const bool silent = wcsstr(lpstrCmdLine, L"-silent") != nullptr;
|
||||
return PerformOsUpgradeTask(silent);
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox(NULL,DllLoadStringEx(IDS_UPGRADE_SUCCESS),DllLoadStringEx(IDS_APP_TITLE),MB_OK|MB_ICONINFORMATION);
|
||||
}
|
||||
return error;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const wchar_t *pCmd=wcsstr(lpstrCmdLine,L"-cmd ");
|
||||
|
||||
@@ -30,46 +30,46 @@
|
||||
<ProjectGuid>{87D5FE20-AF86-458A-9AA3-3131EB06179B}</ProjectGuid>
|
||||
<RootNamespace>StartMenu</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
@@ -136,7 +136,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
@@ -159,7 +158,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
|
||||
@@ -182,7 +182,7 @@ HRESULT STDMETHODCALLTYPE CMenuAccessible::accSelect( long flagsSelect, VARIANT
|
||||
int index=varChild.lVal-1;
|
||||
if (index<0 || index>=(int)m_pOwner->m_Items.size())
|
||||
return S_FALSE;
|
||||
m_pOwner->ActivateItem(index,CMenuContainer::ACTIVATE_SELECT,NULL,false);
|
||||
m_pOwner->ActivateItem(index,CMenuContainer::ACTIVATE_SELECT,NULL);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -248,7 +248,6 @@ bool CMenuContainer::DragOutApps( const CItemManager::ItemInfo *pInfo )
|
||||
s_bDragFromTree=false;
|
||||
if (!m_bDestroyed)
|
||||
KillTimer(TIMER_DRAG);
|
||||
HideTemp(false);
|
||||
s_bPreventClosing=false;
|
||||
|
||||
if (s_bDragClosed)
|
||||
@@ -343,7 +342,6 @@ bool CMenuContainer::DragOut( int index, bool bApp )
|
||||
if (!m_bDestroyed)
|
||||
KillTimer(TIMER_DRAG);
|
||||
s_bDragMovable=false;
|
||||
HideTemp(false);
|
||||
s_bPreventClosing=false;
|
||||
|
||||
if (s_bDragClosed)
|
||||
@@ -854,21 +852,29 @@ HRESULT STDMETHODCALLTYPE CMenuContainer::Drop( IDataObject *pDataObj, DWORD grf
|
||||
CComQIPtr<IDataObjectAsyncCapability> pAsync=pDataObj;
|
||||
if (pAsync)
|
||||
pAsync->SetAsyncMode(FALSE);
|
||||
for (std::vector<CMenuContainer*>::iterator it=s_Menus.begin();it!=s_Menus.end();++it)
|
||||
if (!(*it)->m_bDestroyed)
|
||||
(*it)->EnableWindow(FALSE); // disable all menus
|
||||
for (auto& it : s_Menus)
|
||||
{
|
||||
if (!it->m_bDestroyed)
|
||||
{
|
||||
it->EnableWindow(FALSE); // disable all menus
|
||||
it->SetWindowPos(HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
|
||||
}
|
||||
}
|
||||
bool bAllPrograms=s_bAllPrograms;
|
||||
if (bAllPrograms) ::EnableWindow(g_TopWin7Menu,FALSE);
|
||||
bool bOld=s_bPreventClosing;
|
||||
s_bPreventClosing=true;
|
||||
AddRef();
|
||||
pTarget->Drop(pDataObj,grfKeyState,pt,pdwEffect);
|
||||
if (!bOld)
|
||||
HideTemp(false);
|
||||
s_bPreventClosing=bOld;
|
||||
for (std::vector<CMenuContainer*>::iterator it=s_Menus.begin();it!=s_Menus.end();++it)
|
||||
if (!(*it)->m_bDestroyed)
|
||||
(*it)->EnableWindow(TRUE); // enable all menus
|
||||
for (auto& it : s_Menus)
|
||||
{
|
||||
if (!it->m_bDestroyed)
|
||||
{
|
||||
it->EnableWindow(TRUE); // enable all menus
|
||||
it->SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
|
||||
}
|
||||
}
|
||||
if (bAllPrograms) ::EnableWindow(g_TopWin7Menu,TRUE);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -55,8 +55,8 @@ GUID IID_IApplicationResolver8={0xde25675a,0x72de,0x44b4,{0x93,0x73,0x05,0x17,0x
|
||||
|
||||
interface IResourceContext;
|
||||
|
||||
const GUID IID_IResourceMap={0x6e21e72b, 0xb9b0, 0x42ae, {0xa6, 0x86, 0x98, 0x3c, 0xf7, 0x84, 0xed, 0xcd}};
|
||||
interface IResourceMap : public IUnknown
|
||||
MIDL_INTERFACE("6e21e72b-b9b0-42ae-a686-983cf784edcd")
|
||||
IResourceMap : public IUnknown
|
||||
{
|
||||
virtual HRESULT STDMETHODCALLTYPE GetUri(const wchar_t **pUri ) = 0;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetSubtree(const wchar_t *propName, IResourceMap **pSubTree ) = 0;
|
||||
@@ -76,8 +76,8 @@ enum RESOURCE_SCALE
|
||||
RES_SCALE_80 =3,
|
||||
};
|
||||
|
||||
const GUID IID_ResourceContext={0xe3c22b30, 0x8502, 0x4b2f, {0x91, 0x33, 0x55, 0x96, 0x74, 0x58, 0x7e, 0x51}};
|
||||
interface IResourceContext : public IUnknown
|
||||
MIDL_INTERFACE("e3c22b30-8502-4b2f-9133-559674587e51")
|
||||
IResourceContext : public IUnknown
|
||||
{
|
||||
virtual HRESULT STDMETHODCALLTYPE GetLanguage( void ) = 0;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetHomeRegion( wchar_t *pRegion ) = 0;
|
||||
@@ -142,10 +142,11 @@ static bool DetectGrayscaleImage( const unsigned int *bits, int stride, int widt
|
||||
for (int x=0;x<width;x++)
|
||||
{
|
||||
unsigned int pixel=bits[x];
|
||||
int a=(pixel>>24)&255;
|
||||
int r=(pixel>>16)&255;
|
||||
int g=(pixel>>8)&255;
|
||||
int b=(pixel)&255;
|
||||
if (abs(r-g)>2 || abs(r-b)>2 || abs(g-b)>2)
|
||||
if (abs(a-r)>2 || abs(r-g)>2 || abs(r-b)>2 || abs(g-b)>2)
|
||||
return false; // found colored pixel
|
||||
if (!(pixel&0xFF000000))
|
||||
transparent++;
|
||||
@@ -175,6 +176,27 @@ static void CreateMonochromeImage( unsigned int *bits, int stride, int width, in
|
||||
}
|
||||
}
|
||||
|
||||
HBITMAP ColorizeMonochromeImage(HBITMAP bitmap, DWORD color)
|
||||
{
|
||||
{
|
||||
BITMAP info{};
|
||||
GetObject(bitmap, sizeof(info), &info);
|
||||
if (!DetectGrayscaleImage((const unsigned int*)info.bmBits, info.bmWidth, info.bmWidth, info.bmHeight))
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
HBITMAP bmp = (HBITMAP)CopyImage(bitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
|
||||
if (bmp)
|
||||
{
|
||||
BITMAP info{};
|
||||
GetObject(bmp, sizeof(info), &info);
|
||||
|
||||
CreateMonochromeImage((unsigned int*)info.bmBits, info.bmWidth, info.bmWidth, info.bmHeight, color);
|
||||
}
|
||||
|
||||
return bmp;
|
||||
}
|
||||
|
||||
static HBITMAP BitmapFromMetroIcon( HICON hIcon, int bitmapSize, int iconSize, DWORD metroColor, bool bDestroyIcon=true )
|
||||
{
|
||||
ICONINFO info;
|
||||
@@ -258,7 +280,6 @@ static HBITMAP BitmapFromMetroBitmap( HBITMAP hBitmap, int bitmapSize, DWORD met
|
||||
HGDIOBJ bmp0=SelectObject(hdc,bmp);
|
||||
HGDIOBJ bmp02=SelectObject(hsrc,hBitmap);
|
||||
int offset=(bitmapSize-info.bmWidth)/2;
|
||||
bool bInvert=g_bInvertMetroIcons;
|
||||
if (g_bInvertMetroIcons && bGrayscale)
|
||||
{
|
||||
FillRect(hdc,&rc,(HBRUSH)GetStockObject(BLACK_BRUSH));
|
||||
@@ -299,10 +320,9 @@ static HBITMAP BitmapFromMetroBitmap( HBITMAP hBitmap, int bitmapSize, DWORD met
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static HBITMAP LoadMetroBitmap0( const wchar_t *path, int bitmapSize, DWORD metroColor )
|
||||
static HBITMAP LoadMetroBitmap0(const wchar_t *path, int bitmapSize, DWORD metroColor = 0xFFFFFFFF)
|
||||
{
|
||||
int iconSize=g_bInvertMetroIcons?bitmapSize:(bitmapSize-2);
|
||||
SIZE size={-iconSize,iconSize};
|
||||
SIZE size={-bitmapSize,bitmapSize};
|
||||
HBITMAP hBitmap=LoadImageFile(path,&size,true,true,NULL);
|
||||
if (hBitmap)
|
||||
{
|
||||
@@ -439,16 +459,8 @@ static HBITMAP LoadMetroBitmap2( const wchar_t *location, int bitmapSize, DWORD
|
||||
}
|
||||
if (iconSize)
|
||||
{
|
||||
if (g_bInvertMetroIcons)
|
||||
{
|
||||
if (iconSize>bitmapSize)
|
||||
iconSize=bitmapSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (iconSize>bitmapSize-2)
|
||||
iconSize=bitmapSize-2;
|
||||
}
|
||||
if (iconSize>bitmapSize)
|
||||
iconSize=bitmapSize;
|
||||
SIZE size={iconSize,iconSize};
|
||||
HBITMAP hBitmap=LoadImageFile(path,&size,true,true,NULL);
|
||||
if (hBitmap)
|
||||
@@ -1113,6 +1125,49 @@ const CItemManager::ItemInfo *CItemManager::GetCustomIcon( const wchar_t *path,
|
||||
return GetCustomIcon(text,index,iconSizeType,false);
|
||||
}
|
||||
|
||||
const CItemManager::ItemInfo* CItemManager::GetLinkIcon(IShellLink* link, TIconSizeType iconSizeType)
|
||||
{
|
||||
wchar_t location[_MAX_PATH];
|
||||
int index;
|
||||
|
||||
if (link->GetIconLocation(location, _countof(location), &index) == S_OK && location[0])
|
||||
return GetCustomIcon(location, index, iconSizeType, (index == 0)); // assuming that if index!=0 the icon comes from a permanent location like a dll or exe
|
||||
|
||||
CComQIPtr<IPropertyStore> store(link);
|
||||
if (store)
|
||||
{
|
||||
// Name: System.AppUserModel.DestListLogoUri -- PKEY_AppUserModel_DestListLogoUri
|
||||
// Type: String -- VT_LPWSTR
|
||||
// FormatID: {9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}, 29
|
||||
static const PROPERTYKEY PKEY_AppUserModel_DestListLogoUri = { {0x9F4C2855, 0x9F79, 0x4B39, {0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3}}, 29 };
|
||||
|
||||
auto logoUri = GetPropertyStoreString(store, PKEY_AppUserModel_DestListLogoUri);
|
||||
if (!logoUri.IsEmpty())
|
||||
{
|
||||
auto appId = GetPropertyStoreString(store, PKEY_AppUserModel_ID);
|
||||
if (!appId.IsEmpty())
|
||||
{
|
||||
CComPtr<IResourceManager> resManager;
|
||||
if (SUCCEEDED(resManager.CoCreateInstance(CLSID_ResourceManager)))
|
||||
{
|
||||
if (SUCCEEDED(resManager->InitializeForPackage(GetPackageFullName(appId))))
|
||||
{
|
||||
CComPtr<IResourceMap> resMap;
|
||||
if (SUCCEEDED(resManager->GetMainResourceMap(IID_PPV_ARGS(&resMap))))
|
||||
{
|
||||
CComString location;
|
||||
if (SUCCEEDED(resMap->GetFilePath(logoUri, &location)))
|
||||
return GetCustomIcon(location, -65536, iconSizeType, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const CItemManager::ItemInfo *CItemManager::GetMetroAppInfo10( const wchar_t *appid )
|
||||
{
|
||||
wchar_t APPID[256];
|
||||
@@ -1823,7 +1878,11 @@ void CItemManager::RefreshItemInfo( ItemInfo *pInfo, int refreshFlags, IShellIte
|
||||
{
|
||||
newInfo.bLink=true;
|
||||
pStore=pLink;
|
||||
|
||||
#ifdef _DEBUG
|
||||
LOG_MENU(LOG_OPEN, L"Link: %s", newInfo.path);
|
||||
LOG_MENU(LOG_OPEN, L"Link property store:");
|
||||
LogPropertyStore(LOG_OPEN, pStore);
|
||||
#endif
|
||||
if (SUCCEEDED(pLink->GetIDList(&newInfo.targetPidl)))
|
||||
{
|
||||
wchar_t path[_MAX_PATH];
|
||||
@@ -1832,6 +1891,28 @@ void CItemManager::RefreshItemInfo( ItemInfo *pInfo, int refreshFlags, IShellIte
|
||||
CharUpper(path);
|
||||
newInfo.targetPATH=path;
|
||||
}
|
||||
|
||||
CComPtr<IShellItem> target;
|
||||
if (SUCCEEDED(SHCreateItemFromIDList(newInfo.targetPidl, IID_PPV_ARGS(&target))))
|
||||
{
|
||||
CComPtr<IPropertyStore> store;
|
||||
if (SUCCEEDED(target->BindToHandler(nullptr, BHID_PropertyStore, IID_PPV_ARGS(&store))))
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
LOG_MENU(LOG_OPEN, L"Target property store:");
|
||||
LogPropertyStore(LOG_OPEN, store);
|
||||
#endif
|
||||
PROPVARIANT val;
|
||||
PropVariantInit(&val);
|
||||
if (SUCCEEDED(store->GetValue(PKEY_MetroAppLauncher, &val)) && (val.vt == VT_I4 || val.vt == VT_UI4) && val.intVal)
|
||||
{
|
||||
newInfo.bLink = false;
|
||||
pItem = target;
|
||||
pStore = store;
|
||||
}
|
||||
PropVariantClear(&val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1923,7 +2004,6 @@ void CItemManager::RefreshItemInfo( ItemInfo *pInfo, int refreshFlags, IShellIte
|
||||
{
|
||||
newInfo.targetPidl.Clear();
|
||||
newInfo.targetPATH.Empty();
|
||||
newInfo.metroName.Empty();
|
||||
newInfo.iconPath.Empty();
|
||||
newInfo.bNoPin=newInfo.bNoNew=false;
|
||||
if (!newInfo.bMetroApp)
|
||||
@@ -2296,12 +2376,6 @@ void CItemManager::LoadShellIcon( IShellItem *pItem, int refreshFlags, const Ico
|
||||
int smallIconSize=SMALL_ICON_SIZE;
|
||||
int largeIconSize=LARGE_ICON_SIZE;
|
||||
int extraLargeIconSize=EXTRA_LARGE_ICON_SIZE;
|
||||
if (pMetroColor)
|
||||
{
|
||||
smallIconSize-=2;
|
||||
largeIconSize-=2;
|
||||
extraLargeIconSize-=2;
|
||||
}
|
||||
HICON hSmallIcon=NULL, hLargeIcon=NULL, hExtraLargeIcon=NULL;
|
||||
if (bNotFileName)
|
||||
{
|
||||
@@ -2414,14 +2488,13 @@ void CItemManager::LoadMetroIcon( IShellItem *pItem, int &refreshFlags, const Ic
|
||||
if (FAILED(pResManager->InitializeForPackage(packageName)))
|
||||
return;
|
||||
CComPtr<IResourceMap> pResMap;
|
||||
if (FAILED(pResManager->GetMainResourceMap(IID_IResourceMap,(void**)&pResMap)))
|
||||
if (FAILED(pResManager->GetMainResourceMap(IID_PPV_ARGS(&pResMap))))
|
||||
return;
|
||||
CComPtr<IResourceContext> pResContext;
|
||||
if (FAILED(pResManager->GetDefaultContext(IID_ResourceContext,(void**)&pResContext)))
|
||||
if (FAILED(pResManager->GetDefaultContext(IID_PPV_ARGS(&pResContext))))
|
||||
return;
|
||||
int iconFlags=0;
|
||||
int delta=g_bInvertMetroIcons?0:2;
|
||||
if ((refreshFlags&INFO_SMALL_ICON) && SetResContextTargetSize(pResContext,SMALL_ICON_SIZE-delta))
|
||||
if ((refreshFlags&INFO_SMALL_ICON) && SetResContextTargetSize(pResContext,SMALL_ICON_SIZE))
|
||||
{
|
||||
CComString pLocation;
|
||||
if (SUCCEEDED(pResMap->GetFilePath(iconName,&pLocation)))
|
||||
@@ -2431,7 +2504,7 @@ void CItemManager::LoadMetroIcon( IShellItem *pItem, int &refreshFlags, const Ic
|
||||
StoreInCache(hash,L"",hSmallBitmap,NULL,NULL,INFO_SMALL_ICON,smallIcon,largeIcon,extraLargeIcon,false,true);
|
||||
}
|
||||
}
|
||||
if ((refreshFlags&INFO_LARGE_ICON) && SetResContextTargetSize(pResContext,LARGE_ICON_SIZE-delta))
|
||||
if ((refreshFlags&INFO_LARGE_ICON) && SetResContextTargetSize(pResContext,LARGE_ICON_SIZE))
|
||||
{
|
||||
CComString pLocation;
|
||||
if (SUCCEEDED(pResMap->GetFilePath(iconName,&pLocation)))
|
||||
@@ -2441,7 +2514,7 @@ void CItemManager::LoadMetroIcon( IShellItem *pItem, int &refreshFlags, const Ic
|
||||
StoreInCache(hash,L"",NULL,hLargeBitmap,NULL,INFO_LARGE_ICON,smallIcon,largeIcon,extraLargeIcon,false,true);
|
||||
}
|
||||
}
|
||||
if ((refreshFlags&INFO_SMALL_ICON) && SetResContextTargetSize(pResContext,EXTRA_LARGE_ICON_SIZE-delta))
|
||||
if ((refreshFlags&INFO_EXTRA_LARGE_ICON) && SetResContextTargetSize(pResContext,EXTRA_LARGE_ICON_SIZE))
|
||||
{
|
||||
CComString pLocation;
|
||||
if (SUCCEEDED(pResMap->GetFilePath(iconName,&pLocation)))
|
||||
@@ -2586,49 +2659,45 @@ void CItemManager::IconInfo::SetPath( const wchar_t *path )
|
||||
timestamp.dwHighDateTime=timestamp.dwLowDateTime=0;
|
||||
}
|
||||
|
||||
void CItemManager::LoadCustomIcon( const wchar_t *iconPath, int iconIndex, int refreshFlags, const IconInfo *&smallIcon, const IconInfo *&largeIcon, const IconInfo *&extraLargeIcon, bool bTemp )
|
||||
void CItemManager::LoadCustomIcon(const wchar_t *iconPath, int iconIndex, int refreshFlags, const IconInfo *&smallIcon, const IconInfo *&largeIcon, const IconInfo *&extraLargeIcon, bool bTemp)
|
||||
{
|
||||
unsigned int hash=CalcFNVHash(iconPath,CalcFNVHash(&iconIndex,4));
|
||||
unsigned int hash = CalcFNVHash(iconPath, CalcFNVHash(&iconIndex, 4));
|
||||
|
||||
FindInCache(hash,refreshFlags,smallIcon,largeIcon,extraLargeIcon);
|
||||
if (!refreshFlags) return;
|
||||
FindInCache(hash, refreshFlags, smallIcon, largeIcon, extraLargeIcon);
|
||||
if (!refreshFlags)
|
||||
return;
|
||||
|
||||
auto ExtractIconAsBitmap = [&](int iconSize) -> HBITMAP {
|
||||
|
||||
if (iconIndex == -65536)
|
||||
return LoadMetroBitmap0(iconPath, iconSize);
|
||||
|
||||
HICON hIcon;
|
||||
|
||||
if (!*iconPath)
|
||||
hIcon = (HICON)LoadImage(g_Instance, MAKEINTRESOURCE(-iconIndex), IMAGE_ICON, iconSize, iconSize, LR_DEFAULTCOLOR);
|
||||
else
|
||||
hIcon = ShExtractIcon(iconPath, iconIndex == -1 ? 0 : iconIndex, iconSize);
|
||||
|
||||
if (hIcon)
|
||||
return BitmapFromIcon(hIcon, iconSize);
|
||||
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
// extract icon
|
||||
HBITMAP hSmallBitmap=NULL, hLargeBitmap=NULL, hExtraLargeBitmap=NULL;
|
||||
if (refreshFlags&INFO_SMALL_ICON)
|
||||
{
|
||||
HICON hIcon;
|
||||
if (!*iconPath)
|
||||
hIcon=(HICON)LoadImage(g_Instance,MAKEINTRESOURCE(-iconIndex),IMAGE_ICON,SMALL_ICON_SIZE,SMALL_ICON_SIZE,LR_DEFAULTCOLOR);
|
||||
else
|
||||
hIcon=ShExtractIcon(iconPath,iconIndex==-1?0:iconIndex,SMALL_ICON_SIZE);
|
||||
if (hIcon)
|
||||
hSmallBitmap=BitmapFromIcon(hIcon,SMALL_ICON_SIZE);
|
||||
}
|
||||
HBITMAP hSmallBitmap = nullptr, hLargeBitmap = nullptr, hExtraLargeBitmap = nullptr;
|
||||
|
||||
if (refreshFlags&INFO_LARGE_ICON)
|
||||
{
|
||||
HICON hIcon;
|
||||
if (!*iconPath)
|
||||
hIcon=(HICON)LoadImage(g_Instance,MAKEINTRESOURCE(-iconIndex),IMAGE_ICON,LARGE_ICON_SIZE,LARGE_ICON_SIZE,LR_DEFAULTCOLOR);
|
||||
else
|
||||
hIcon=ShExtractIcon(iconPath,iconIndex==-1?0:iconIndex,LARGE_ICON_SIZE);
|
||||
if (hIcon)
|
||||
hLargeBitmap=BitmapFromIcon(hIcon,LARGE_ICON_SIZE);
|
||||
}
|
||||
if (refreshFlags & INFO_SMALL_ICON)
|
||||
hSmallBitmap = ExtractIconAsBitmap(SMALL_ICON_SIZE);
|
||||
|
||||
if (refreshFlags&INFO_EXTRA_LARGE_ICON)
|
||||
{
|
||||
HICON hIcon;
|
||||
if (!*iconPath)
|
||||
hIcon=(HICON)LoadImage(g_Instance,MAKEINTRESOURCE(-iconIndex),IMAGE_ICON,EXTRA_LARGE_ICON_SIZE,EXTRA_LARGE_ICON_SIZE,LR_DEFAULTCOLOR);
|
||||
else
|
||||
hIcon=ShExtractIcon(iconPath,iconIndex==-1?0:iconIndex,EXTRA_LARGE_ICON_SIZE);
|
||||
if (hIcon)
|
||||
hExtraLargeBitmap=BitmapFromIcon(hIcon,EXTRA_LARGE_ICON_SIZE);
|
||||
}
|
||||
if (refreshFlags & INFO_LARGE_ICON)
|
||||
hLargeBitmap = ExtractIconAsBitmap(LARGE_ICON_SIZE);
|
||||
|
||||
StoreInCache(hash,bTemp?NULL:iconPath,hSmallBitmap,hLargeBitmap,hExtraLargeBitmap,refreshFlags,smallIcon,largeIcon,extraLargeIcon,bTemp,false);
|
||||
if (refreshFlags & INFO_EXTRA_LARGE_ICON)
|
||||
hExtraLargeBitmap = ExtractIconAsBitmap(EXTRA_LARGE_ICON_SIZE);
|
||||
|
||||
StoreInCache(hash, bTemp ? nullptr : iconPath, hSmallBitmap, hLargeBitmap, hExtraLargeBitmap, refreshFlags, smallIcon, largeIcon, extraLargeIcon, bTemp, false);
|
||||
}
|
||||
|
||||
// Recursive function to preload the items for a folder
|
||||
|
||||
@@ -173,6 +173,7 @@ public:
|
||||
const ItemInfo *GetItemInfo( CString path, int refreshFlags, TLocation location=LOCATION_UNKNOWN );
|
||||
const ItemInfo *GetCustomIcon( const wchar_t *location, int index, TIconSizeType iconSizeType, bool bTemp );
|
||||
const ItemInfo *GetCustomIcon( const wchar_t *path, TIconSizeType iconSizeType );
|
||||
const ItemInfo* GetLinkIcon(IShellLink* link, TIconSizeType iconSizeType);
|
||||
const ItemInfo *GetMetroAppInfo10( const wchar_t *appid );
|
||||
void UpdateItemInfo( const ItemInfo *pInfo, int refreshFlags, bool bHasWriteLock=false );
|
||||
void WaitForShortcuts( const POINT &balloonPos );
|
||||
@@ -466,6 +467,7 @@ bool MenuGetFileTimestamp( const wchar_t *path, FILETIME *pWriteTime, FILETIME *
|
||||
STDAPI ShGetKnownFolderPath( REFKNOWNFOLDERID rfid, PWSTR *pPath );
|
||||
STDAPI ShGetKnownFolderIDList(REFKNOWNFOLDERID rfid, PIDLIST_ABSOLUTE *pPidl );
|
||||
STDAPI ShGetKnownFolderItem(REFKNOWNFOLDERID rfid, IShellItem **ppItem );
|
||||
HBITMAP ColorizeMonochromeImage(HBITMAP bitmap, DWORD color);
|
||||
|
||||
#define TASKBAR_PINNED_ROOT L"%APPDATA%\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar"
|
||||
#define START_MENU_PINNED_ROOT L"%APPDATA%\\OpenShell\\Pinned"
|
||||
|
||||
@@ -198,7 +198,13 @@ bool HasJumplist( const wchar_t *appid )
|
||||
{
|
||||
UINT count;
|
||||
if (SUCCEEDED(pCustomList->GetCategoryCount(&count)) && count>0)
|
||||
{
|
||||
// skip Settings app (it reports one category with unsupported type, thus jump-list will be empty)
|
||||
if (wcscmp(appid, L"windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel") == 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (CAutomaticList(appid).HasList())
|
||||
@@ -322,6 +328,9 @@ static void AddJumpItem( CJumpGroup &group, IUnknown *pUnknown, std::vector<CCom
|
||||
}
|
||||
}
|
||||
LOG_MENU(LOG_OPEN,L"Jumplist Link Name: %s",item.name);
|
||||
#ifdef _DEBUG
|
||||
LogPropertyStore(LOG_OPEN, pStore);
|
||||
#endif
|
||||
if (!item.name.IsEmpty())
|
||||
group.items.push_back(item);
|
||||
return;
|
||||
@@ -519,91 +528,15 @@ bool GetJumplist( const wchar_t *appid, CJumpList &list, int maxCount, int maxHe
|
||||
bool ExecuteJumpItem( const CItemManager::ItemInfo *pAppInfo, const CJumpItem &item, HWND hwnd )
|
||||
{
|
||||
Assert(GetWinVersion()>=WIN_VER_WIN7);
|
||||
if (!item.pItem) return false;
|
||||
if (!item.pItem)
|
||||
return false;
|
||||
|
||||
if (item.type==CJumpItem::TYPE_ITEM)
|
||||
{
|
||||
/* CString appid;
|
||||
{
|
||||
CItemManager::RWLock lock(&g_ItemManager,false,CItemManager::RWLOCK_ITEMS);
|
||||
appid=pAppInfo->GetAppid();
|
||||
}
|
||||
LOG_MENU(LOG_OPEN,L"Execute Item: name=%s, appid=%s",item.name,appid);*/
|
||||
CComQIPtr<IShellItem> pItem(item.pItem);
|
||||
if (!pItem)
|
||||
return false;
|
||||
/* CComString pName;
|
||||
if (FAILED(pItem->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING,&pName)))
|
||||
return false;
|
||||
wchar_t ext[_MAX_EXT];
|
||||
Strcpy(ext,_countof(ext),PathFindExtension(pName));
|
||||
|
||||
// find the correct association handler by appid and invoke it on the item
|
||||
CComPtr<IEnumAssocHandlers> pEnumHandlers;
|
||||
if (ext[0] && SUCCEEDED(SHAssocEnumHandlers(ext,ASSOC_FILTER_RECOMMENDED,&pEnumHandlers)))
|
||||
{
|
||||
CComPtr<IAssocHandler> pHandler;
|
||||
ULONG count;
|
||||
while (SUCCEEDED(pEnumHandlers->Next(1,&pHandler,&count)) && count==1)
|
||||
{
|
||||
CComQIPtr<IObjectWithAppUserModelID> pObject=pHandler;
|
||||
if (pObject)
|
||||
{
|
||||
CComString pID;
|
||||
if (SUCCEEDED(pObject->GetAppID(&pID)))
|
||||
{
|
||||
// found explicit appid
|
||||
if (_wcsicmp(appid,pID)==0)
|
||||
{
|
||||
LOG_MENU(LOG_OPEN,L"Found handler appid");
|
||||
CComPtr<IDataObject> pDataObject;
|
||||
if (SUCCEEDED(pItem->BindToHandler(NULL,BHID_DataObject,IID_IDataObject,(void**)&pDataObject)) && SUCCEEDED(pHandler->Invoke(pDataObject)))
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
pHandler=NULL;
|
||||
}
|
||||
pEnumHandlers=NULL;
|
||||
|
||||
// find the correct association handler by exe name and invoke it on the item
|
||||
wchar_t targetPath[_MAX_PATH];
|
||||
targetPath[0]=0;
|
||||
{
|
||||
CComPtr<IShellItem> pItem;
|
||||
SHCreateItemFromIDList(pAppInfo->GetPidl(),IID_IShellItem,(void**)&pItem);
|
||||
CComPtr<IShellLink> pLink;
|
||||
if (pItem)
|
||||
pItem->BindToHandler(NULL,BHID_SFUIObject,IID_IShellLink,(void**)&pLink);
|
||||
CAbsolutePidl target;
|
||||
if (pLink && SUCCEEDED(pLink->Resolve(NULL,SLR_INVOKE_MSI|SLR_NO_UI|SLR_NOUPDATE)) && SUCCEEDED(pLink->GetIDList(&target)))
|
||||
{
|
||||
if (FAILED(SHGetPathFromIDList(target,targetPath)))
|
||||
targetPath[0]=0;
|
||||
}
|
||||
}
|
||||
if (targetPath[0] && SUCCEEDED(SHAssocEnumHandlers(ext,ASSOC_FILTER_RECOMMENDED,&pEnumHandlers)))
|
||||
{
|
||||
while (SUCCEEDED(pEnumHandlers->Next(1,&pHandler,&count)) && count==1)
|
||||
{
|
||||
CComString pExe;
|
||||
if (SUCCEEDED(pHandler->GetName(&pExe)))
|
||||
{
|
||||
if (_wcsicmp(targetPath,pExe)==0)
|
||||
{
|
||||
LOG_MENU(LOG_OPEN,L"Found handler appexe %s",targetPath);
|
||||
CComPtr<IDataObject> pDataObject;
|
||||
if (SUCCEEDED(pItem->BindToHandler(NULL,BHID_DataObject,IID_IDataObject,(void**)&pDataObject)) && SUCCEEDED(pHandler->Invoke(pDataObject)))
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
pHandler=NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
// couldn't find a handler, execute the old way
|
||||
SHELLEXECUTEINFO execute={sizeof(execute),SEE_MASK_IDLIST|SEE_MASK_FLAG_LOG_USAGE};
|
||||
execute.nShow=SW_SHOWNORMAL;
|
||||
CAbsolutePidl pidl;
|
||||
@@ -617,9 +550,50 @@ bool ExecuteJumpItem( const CItemManager::ItemInfo *pAppInfo, const CJumpItem &i
|
||||
|
||||
if (item.type==CJumpItem::TYPE_LINK)
|
||||
{
|
||||
// invoke the link through its context menu
|
||||
// Name: System.AppUserModel.HostEnvironment -- PKEY_AppUserModel_HostEnvironment
|
||||
// Type: UInt32 -- VT_UI4
|
||||
// FormatID: {9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}, 14
|
||||
static const PROPERTYKEY PKEY_AppUserModel_HostEnvironment = { {0x9F4C2855, 0x9F79, 0x4B39, {0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3}}, 14 };
|
||||
|
||||
// Name: System.AppUserModel.ActivationContext -- PKEY_AppUserModel_ActivationContext
|
||||
// Type: String -- VT_LPWSTR
|
||||
// FormatID: {9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}, 20
|
||||
static const PROPERTYKEY PKEY_AppUserModel_ActivationContext = { {0x9F4C2855, 0x9F79, 0x4B39, {0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3}}, 20 };
|
||||
|
||||
CComQIPtr<IContextMenu> pMenu(item.pItem);
|
||||
if (!pMenu) return false;
|
||||
CStringA params;
|
||||
|
||||
CComQIPtr<IShellLink> pLink(item.pItem);
|
||||
if (pLink)
|
||||
{
|
||||
CComQIPtr<IPropertyStore> store(pLink);
|
||||
if (store)
|
||||
{
|
||||
auto appId = GetPropertyStoreString(store, PKEY_AppUserModel_ID);
|
||||
if (!appId.IsEmpty())
|
||||
{
|
||||
CComPtr<IShellItem2> target;
|
||||
if (SUCCEEDED(SHCreateItemInKnownFolder(FOLDERID_AppsFolder, 0, appId, IID_PPV_ARGS(&target))))
|
||||
{
|
||||
ULONG modern = 0;
|
||||
if (SUCCEEDED(target->GetUInt32(PKEY_AppUserModel_HostEnvironment, &modern)) && modern)
|
||||
{
|
||||
CComQIPtr<IContextMenu> targetMenu;
|
||||
if (SUCCEEDED(target->BindToHandler(nullptr, BHID_SFUIObject, IID_PPV_ARGS(&targetMenu))))
|
||||
{
|
||||
pMenu = targetMenu;
|
||||
params = CT2CA(GetPropertyStoreString(store, PKEY_AppUserModel_ActivationContext));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// invoke the link through its context menu
|
||||
if (!pMenu)
|
||||
return false;
|
||||
|
||||
HRESULT hr;
|
||||
HMENU menu=CreatePopupMenu();
|
||||
hr=pMenu->QueryContextMenu(menu,0,1,1000,CMF_DEFAULTONLY);
|
||||
@@ -633,6 +607,8 @@ bool ExecuteJumpItem( const CItemManager::ItemInfo *pAppInfo, const CJumpItem &i
|
||||
{
|
||||
CMINVOKECOMMANDINFO command={sizeof(command),CMIC_MASK_FLAG_LOG_USAGE};
|
||||
command.lpVerb=MAKEINTRESOURCEA(id-1);
|
||||
if (!params.IsEmpty())
|
||||
command.lpParameters = params;
|
||||
wchar_t path[_MAX_PATH];
|
||||
GetModuleFileName(NULL,path,_countof(path));
|
||||
if (_wcsicmp(PathFindFileName(path),L"explorer.exe")==0)
|
||||
|
||||
@@ -7,10 +7,13 @@
|
||||
#include "stdafx.h"
|
||||
#include "LogManager.h"
|
||||
#include "ResourceHelper.h"
|
||||
#include "ComHelper.h"
|
||||
#include <propvarutil.h>
|
||||
#include <chrono>
|
||||
|
||||
int g_LogCategories;
|
||||
static FILE *g_LogFile;
|
||||
static int g_LogTime;
|
||||
static std::chrono::time_point<std::chrono::steady_clock> g_LogTime;
|
||||
|
||||
void InitLog( int categories, const wchar_t *fname )
|
||||
{
|
||||
@@ -21,7 +24,7 @@ void InitLog( int categories, const wchar_t *fname )
|
||||
wchar_t bom=0xFEFF;
|
||||
fwrite(&bom,2,1,g_LogFile);
|
||||
g_LogCategories=categories;
|
||||
g_LogTime=GetTickCount();
|
||||
g_LogTime=std::chrono::steady_clock::now();
|
||||
LogMessage(L"version=%x, PID=%d, TID=%d, Categories=%08x\r\n",GetWinVersion(),GetCurrentProcessId(),GetCurrentThreadId(),categories);
|
||||
}
|
||||
}
|
||||
@@ -38,7 +41,7 @@ void LogMessage( const wchar_t *text, ... )
|
||||
if (!g_LogFile) return;
|
||||
|
||||
wchar_t buf[2048];
|
||||
int len=Sprintf(buf,_countof(buf),L"%8d: ",GetTickCount()-g_LogTime);
|
||||
int len=Sprintf(buf,_countof(buf),L"%8d: ",std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now()-g_LogTime).count());
|
||||
fwrite(buf,2,len,g_LogFile);
|
||||
|
||||
va_list args;
|
||||
@@ -51,3 +54,31 @@ void LogMessage( const wchar_t *text, ... )
|
||||
|
||||
fflush(g_LogFile);
|
||||
}
|
||||
|
||||
void LogPropertyStore(TLogCategory category, IPropertyStore* store)
|
||||
{
|
||||
if (!store)
|
||||
return;
|
||||
|
||||
DWORD count = 0;
|
||||
store->GetCount(&count);
|
||||
for (DWORD i = 0; i < count; i++)
|
||||
{
|
||||
PROPERTYKEY key{};
|
||||
store->GetAt(i, &key);
|
||||
|
||||
PROPVARIANT val;
|
||||
PropVariantInit(&val);
|
||||
|
||||
store->GetValue(key, &val);
|
||||
|
||||
CComString valueStr;
|
||||
PropVariantToStringAlloc(val, &valueStr);
|
||||
PropVariantClear(&val);
|
||||
|
||||
wchar_t guidStr[100]{};
|
||||
StringFromGUID2(key.fmtid, guidStr, _countof(guidStr));
|
||||
|
||||
LOG_MENU(category, L"Property: {%s, %u} = %s", guidStr, key.pid, valueStr ? valueStr : L"???");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <propsys.h>
|
||||
|
||||
// LogManager.h - logging functionality (for debugging)
|
||||
// Logs different events in the start menu
|
||||
// Turn it on by setting the LogLevel setting in the registry
|
||||
@@ -33,3 +35,5 @@ void CloseLog( void );
|
||||
void LogMessage( const wchar_t *text, ... );
|
||||
|
||||
#define STARTUP_LOG L"Software\\OpenShell\\StartMenu\\Settings|LogStartup|%LOCALAPPDATA%\\OpenShell\\StartupLog.txt"
|
||||
|
||||
void LogPropertyStore(TLogCategory category, IPropertyStore* store);
|
||||
|
||||
@@ -402,7 +402,7 @@ void CMenuContainer::OpenSubMenu( int index, TActivateType type, bool bShift )
|
||||
if (m_Options&CONTAINER_NOEXTENSIONS)
|
||||
options|=CONTAINER_NOEXTENSIONS;
|
||||
|
||||
if (item.id==MENU_PROGRAMS || item.id==MENU_APPS || (m_Options&CONTAINER_MULTICOL_REC))
|
||||
if (item.id==MENU_PROGRAMS || item.id==MENU_APPS || item.bFolder || (m_Options&CONTAINER_MULTICOL_REC))
|
||||
options|=CONTAINER_MULTICOL_REC;
|
||||
if ((options&CONTAINER_MULTICOL_REC) && !bShift)
|
||||
options|=CONTAINER_MULTICOLUMN;
|
||||
@@ -2192,11 +2192,15 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
||||
|
||||
if (res==CMD_PINSETTING)
|
||||
{
|
||||
CSearchManager::TItemCategory cat=(CSearchManager::TItemCategory)(item.categoryHash&CSearchManager::CATEGORY_MASK);
|
||||
if (cat==CSearchManager::CATEGORY_SETTING)
|
||||
CreatePinLink(pItemPidl1,item.name,NULL,0);
|
||||
else if (cat==CSearchManager::CATEGORY_METROSETTING)
|
||||
CreatePinLink(pItemPidl1,item.name,L"%windir%\\ImmersiveControlPanel\\systemsettings.exe",0);
|
||||
CString iconPath;
|
||||
if (item.pItemInfo)
|
||||
{
|
||||
CItemManager::RWLock lock(&g_ItemManager, false, CItemManager::RWLOCK_ITEMS);
|
||||
if (_wcsicmp(PathFindExtension(item.pItemInfo->GetPath()), L".settingcontent-ms") == 0)
|
||||
iconPath = L"%windir%\\ImmersiveControlPanel\\systemsettings.exe";
|
||||
}
|
||||
|
||||
CreatePinLink(pItemPidl1, item.name, iconPath.IsEmpty() ? nullptr : iconPath.GetString(), 0);
|
||||
m_bRefreshItems=true;
|
||||
}
|
||||
|
||||
@@ -2396,7 +2400,6 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
||||
}
|
||||
}
|
||||
DestroyMenu(menu2);
|
||||
HideTemp(false);
|
||||
s_bPreventClosing=false;
|
||||
|
||||
PITEMID_CHILD newPidl=NULL;
|
||||
@@ -2485,7 +2488,6 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
||||
Invalidate();
|
||||
if (m_HotItem<0) SetHotItem(index);
|
||||
}
|
||||
HideTemp(false);
|
||||
s_bPreventClosing=false;
|
||||
}
|
||||
SetContextItem(-1);
|
||||
@@ -2742,7 +2744,6 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
||||
else
|
||||
SetFocus();
|
||||
}
|
||||
HideTemp(false);
|
||||
s_bPreventClosing=false;
|
||||
s_HotPos=GetMessagePos();
|
||||
res=CMD_RENAME;
|
||||
@@ -2802,10 +2803,12 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
||||
if (bRefresh || bRefreshMain)
|
||||
info.fMask|=CMIC_MASK_NOASYNC; // wait for delete/link commands to finish so we can refresh the menu
|
||||
|
||||
if ((type!=ACTIVATE_MENU && type!=ACTIVATE_DELETE) || GetWinVersion()<WIN_VER_WIN8)
|
||||
s_bPreventClosing=true;
|
||||
for (std::vector<CMenuContainer*>::iterator it=s_Menus.begin();it!=s_Menus.end();++it)
|
||||
(*it)->EnableWindow(FALSE); // disable all menus
|
||||
s_bPreventClosing=true;
|
||||
for (auto& it : s_Menus)
|
||||
{
|
||||
it->EnableWindow(FALSE); // disable all menus
|
||||
it->SetWindowPos(HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
|
||||
}
|
||||
bool bAllPrograms=s_bAllPrograms;
|
||||
if (bAllPrograms) ::EnableWindow(g_TopWin7Menu,FALSE);
|
||||
info.hwnd=g_OwnerWindow;
|
||||
@@ -2850,9 +2853,14 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
||||
}
|
||||
}
|
||||
}
|
||||
for (std::vector<CMenuContainer*>::iterator it=s_Menus.begin();it!=s_Menus.end();++it)
|
||||
if (!(*it)->m_bDestroyed)
|
||||
(*it)->EnableWindow(TRUE); // enable all menus
|
||||
for (auto& it : s_Menus)
|
||||
{
|
||||
if (!it->m_bDestroyed)
|
||||
{
|
||||
it->EnableWindow(TRUE); // enable all menus
|
||||
it->SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
|
||||
}
|
||||
}
|
||||
if (bAllPrograms) ::EnableWindow(g_TopWin7Menu,TRUE);
|
||||
if (bRefreshMain && m_bSubMenu)
|
||||
{
|
||||
@@ -2880,7 +2888,6 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
||||
else
|
||||
SetFocus();
|
||||
}
|
||||
HideTemp(false);
|
||||
s_bPreventClosing=false;
|
||||
|
||||
if (!bKeepOpen && !bRefresh && !bRefreshMain)
|
||||
|
||||
@@ -83,6 +83,7 @@ static StdMenuOption g_StdOptions[]=
|
||||
{MENU_USERPICTURES,MENU_ENABLED}, // check policy
|
||||
{MENU_SLEEP,MENU_ENABLED}, // check power caps
|
||||
{MENU_HIBERNATE,MENU_ENABLED}, // check power caps
|
||||
{MENU_LOCK,MENU_ENABLED}, // check power settings
|
||||
{MENU_SWITCHUSER,MENU_ENABLED}, // check group policy
|
||||
{MENU_APPS,MENU_ENABLED}, // enable on Win8+
|
||||
{MENU_PCSETTINGS,MENU_ENABLED}, // enable on Win8+
|
||||
@@ -1936,15 +1937,6 @@ void CMenuContainer::GetRecentPrograms( std::vector<MenuItem> &items, int maxCou
|
||||
continue;
|
||||
}
|
||||
|
||||
{
|
||||
CComPtr<IShellItem> pAppItem;
|
||||
if (FAILED(SHCreateItemInKnownFolder(FOLDERID_AppsFolder2,0,uaItem.name,IID_IShellItem,(void**)&pAppItem)))
|
||||
continue;
|
||||
CComString pName;
|
||||
if (FAILED(pAppItem->GetDisplayName(SIGDN_NORMALDISPLAY,&pName)) || wcsncmp(pName,L"@{",2)==0)
|
||||
continue;
|
||||
}
|
||||
|
||||
uaItem.pLinkInfo=g_ItemManager.GetMetroAppInfo10(uaItem.name);
|
||||
if (!uaItem.pLinkInfo)
|
||||
{
|
||||
@@ -1955,6 +1947,11 @@ void CMenuContainer::GetRecentPrograms( std::vector<MenuItem> &items, int maxCou
|
||||
LOG_MENU(LOG_MFU,L"UserAssist: '%s', %d, %.3f",uaItem.name,data.count,uaItem.rank);
|
||||
{
|
||||
CItemManager::RWLock lock(&g_ItemManager,false,CItemManager::RWLOCK_ITEMS);
|
||||
if (uaItem.pLinkInfo->GetMetroName().IsEmpty() || wcsncmp(uaItem.pLinkInfo->GetMetroName(), L"@{",2)==0)
|
||||
{
|
||||
LOG_MENU(LOG_MFU, L"UserAssist: Dropping: No metro name");
|
||||
continue;
|
||||
}
|
||||
if (uaItem.pLinkInfo->IsNoPin())
|
||||
{
|
||||
LOG_MENU(LOG_MFU,L"UserAssist: Dropping: No pin");
|
||||
@@ -2206,10 +2203,7 @@ void CMenuContainer::AddJumpListItems( std::vector<MenuItem> &items )
|
||||
if (pLink)
|
||||
{
|
||||
pLink->GetIDList(&item.pItem1);
|
||||
wchar_t location[_MAX_PATH];
|
||||
int index;
|
||||
if (pLink->GetIconLocation(location,_countof(location),&index)==S_OK && location[0])
|
||||
item.pItemInfo=g_ItemManager.GetCustomIcon(location,index,CItemManager::ICON_SIZE_TYPE_SMALL,(index==0)); // assuming that if index!=0 the icon comes from a permanent location like a dll or exe
|
||||
item.pItemInfo = g_ItemManager.GetLinkIcon(pLink, CItemManager::ICON_SIZE_TYPE_SMALL);
|
||||
}
|
||||
}
|
||||
else if (jumpItem.type==CJumpItem::TYPE_ITEM)
|
||||
@@ -2655,17 +2649,11 @@ int CMenuContainer::AddSearchItems( const std::vector<SearchItem> &items, const
|
||||
if (!categoryName.IsEmpty())
|
||||
{
|
||||
MenuItem item(MENU_SEARCH_CATEGORY);
|
||||
if (categoryHash==CSearchManager::CATEGORY_PROGRAM || categoryHash==CSearchManager::CATEGORY_SETTING)
|
||||
{
|
||||
item.name.Format(L"%s (%d)",categoryName,originalCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
item.name=categoryName;
|
||||
item.bSplit=(s_Skin.More_bitmap_Size.cx>0);
|
||||
}
|
||||
item.name.Format(L"%s (%d)",categoryName,originalCount);
|
||||
item.nameHash=CalcFNVHash(categoryName);
|
||||
item.categoryHash=categoryHash;
|
||||
if (categoryHash!=CSearchManager::CATEGORY_PROGRAM || categoryHash!=CSearchManager::CATEGORY_SETTING)
|
||||
item.bSplit=(s_Skin.More_bitmap_Size.cx>0);
|
||||
m_Items.push_back(item);
|
||||
}
|
||||
}
|
||||
@@ -2723,7 +2711,7 @@ bool CMenuContainer::InitSearchItems( void )
|
||||
unsigned int runCategoryHash=0;
|
||||
CString runCommand;
|
||||
CComString runExe;
|
||||
if (!bAutoComlpete && !s_bNoRun && s_SearchResults.programs.empty() && s_SearchResults.settings.empty())
|
||||
if (!bAutoComlpete && !s_bNoRun && s_SearchResults.programs.empty() && s_SearchResults.settings.empty() && s_SearchResults.metrosettings.empty())
|
||||
{
|
||||
if (s_bWin7Style)
|
||||
m_SearchBox.GetWindowText(runCommand);
|
||||
@@ -2780,6 +2768,12 @@ bool CMenuContainer::InitSearchItems( void )
|
||||
if (m_SearchCategoryHash==CSearchManager::CATEGORY_PROGRAM)
|
||||
selectedCount=(int)s_SearchResults.programs.size();
|
||||
}
|
||||
if (!s_SearchResults.metrosettings.empty())
|
||||
{
|
||||
counts.push_back((int)s_SearchResults.metrosettings.size());
|
||||
if (m_SearchCategoryHash==CSearchManager::CATEGORY_METROSETTING)
|
||||
selectedCount=(int)s_SearchResults.metrosettings.size();
|
||||
}
|
||||
if (!s_SearchResults.settings.empty())
|
||||
{
|
||||
counts.push_back((int)s_SearchResults.settings.size());
|
||||
@@ -2828,13 +2822,15 @@ bool CMenuContainer::InitSearchItems( void )
|
||||
|
||||
// add categories
|
||||
std::list<CSearchManager::SearchCategory>::const_iterator it=s_SearchResults.indexed.begin();
|
||||
for (size_t idx=0;idx<s_SearchResults.indexed.size()+2;idx++)
|
||||
for (size_t idx=0;idx<s_SearchResults.indexed.size()+3;idx++)
|
||||
{
|
||||
items.clear();
|
||||
unsigned int categoryHash;
|
||||
if (idx==0)
|
||||
categoryHash=CSearchManager::CATEGORY_PROGRAM;
|
||||
else if (idx==1)
|
||||
categoryHash=CSearchManager::CATEGORY_METROSETTING;
|
||||
else if (idx==2)
|
||||
categoryHash=CSearchManager::CATEGORY_SETTING;
|
||||
else
|
||||
categoryHash=it->categoryHash;
|
||||
@@ -2853,7 +2849,7 @@ bool CMenuContainer::InitSearchItems( void )
|
||||
}
|
||||
if (count<=0)
|
||||
{
|
||||
if (idx>=2) ++it;
|
||||
if (idx>=3) ++it;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -2870,6 +2866,16 @@ bool CMenuContainer::InitSearchItems( void )
|
||||
name=FindTranslation(L"Search.CategoryPrograms",L"Programs");
|
||||
}
|
||||
else if (idx==1)
|
||||
{
|
||||
originalCount=(int)s_SearchResults.metrosettings.size();
|
||||
if (count>originalCount)
|
||||
count=originalCount;
|
||||
items.reserve(count);
|
||||
for (std::vector<const CItemManager::ItemInfo*>::const_iterator it=s_SearchResults.metrosettings.begin();it!=s_SearchResults.metrosettings.end() && (int)items.size()<count;++it)
|
||||
items.push_back(SearchItem(*it));
|
||||
name=FindTranslation(L"Search.CategoryPCSettings", L"Settings");
|
||||
}
|
||||
else if (idx==2)
|
||||
{
|
||||
originalCount=(int)s_SearchResults.settings.size();
|
||||
if (count>originalCount)
|
||||
@@ -2877,7 +2883,7 @@ bool CMenuContainer::InitSearchItems( void )
|
||||
items.reserve(count);
|
||||
for (std::vector<const CItemManager::ItemInfo*>::const_iterator it=s_SearchResults.settings.begin();it!=s_SearchResults.settings.end() && (int)items.size()<count;++it)
|
||||
items.push_back(SearchItem(*it));
|
||||
name=FindTranslation(L"Search.CategorySettings",L"Settings");
|
||||
name=FindTranslation(L"Search.CategorySettings",L"Control Panel");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -6364,11 +6370,6 @@ LRESULT CMenuContainer::OnRefresh( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CMenuContainer::HideTemp( bool bHide )
|
||||
{
|
||||
::PostMessage(g_OwnerWindow,WM_CLEAR,bHide,0);
|
||||
}
|
||||
|
||||
LRESULT CMenuContainer::OnActivate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
|
||||
{
|
||||
if (LOWORD(wParam)!=WA_INACTIVE)
|
||||
@@ -6378,6 +6379,9 @@ LRESULT CMenuContainer::OnActivate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOO
|
||||
return 0;
|
||||
}
|
||||
#ifndef PREVENT_CLOSING
|
||||
if (s_bPreventClosing)
|
||||
return 0;
|
||||
|
||||
if (lParam)
|
||||
{
|
||||
// check if another menu window is being activated
|
||||
@@ -6388,24 +6392,15 @@ LRESULT CMenuContainer::OnActivate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOO
|
||||
|
||||
if ((HWND)lParam==g_OwnerWindow || (HWND)lParam==g_TopWin7Menu)
|
||||
return 0;
|
||||
|
||||
if (s_bPreventClosing && (::GetWindowLong((HWND)lParam,GWL_EXSTYLE)&WS_EX_TOPMOST))
|
||||
return 0;
|
||||
}
|
||||
|
||||
// a non-top-most window tries to activate while we are still here
|
||||
if (s_bPreventClosing && (!g_TopWin7Menu || !s_bAllPrograms))
|
||||
HideTemp(true);
|
||||
else
|
||||
{
|
||||
for (std::vector<CMenuContainer*>::reverse_iterator it=s_Menus.rbegin();it!=s_Menus.rend();++it)
|
||||
if ((*it)->m_hWnd && !(*it)->m_bDestroyed)
|
||||
{
|
||||
(*it)->PostMessage(WM_CLOSE);
|
||||
(*it)->m_bClosing=true;
|
||||
}
|
||||
if (g_TopWin7Menu && s_bAllPrograms) ::PostMessage(g_TopWin7Menu,WM_CLOSE,0,0);
|
||||
}
|
||||
for (std::vector<CMenuContainer*>::reverse_iterator it=s_Menus.rbegin();it!=s_Menus.rend();++it)
|
||||
if ((*it)->m_hWnd && !(*it)->m_bDestroyed)
|
||||
{
|
||||
(*it)->PostMessage(WM_CLOSE);
|
||||
(*it)->m_bClosing=true;
|
||||
}
|
||||
if (g_TopWin7Menu && s_bAllPrograms) ::PostMessage(g_TopWin7Menu,WM_CLOSE,0,0);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
@@ -6670,8 +6665,7 @@ bool CMenuContainer::GetDescription( int index, wchar_t *text, int size )
|
||||
{
|
||||
if (SUCCEEDED(pLink->GetDescription(text,size)) && text[0])
|
||||
return true;
|
||||
wchar_t args[256];
|
||||
if (SUCCEEDED(pLink->GetArguments(args,_countof(args))) && args[0])
|
||||
if (jumpItem.bHasArguments)
|
||||
{
|
||||
// don't use default tip for items with arguments
|
||||
Strcpy(text,size,item.name);
|
||||
@@ -7329,8 +7323,9 @@ static void NewVersionCallback( VersionData &data )
|
||||
wchar_t cmdLine[1024];
|
||||
Sprintf(cmdLine,_countof(cmdLine),L"\"%s\" -popup",path);
|
||||
STARTUPINFO startupInfo={sizeof(startupInfo)};
|
||||
PROCESS_INFORMATION processInfo;
|
||||
memset(&processInfo,0,sizeof(processInfo));
|
||||
// don't display busy cursor as we are doing this on background
|
||||
startupInfo.dwFlags=STARTF_FORCEOFFFEEDBACK;
|
||||
PROCESS_INFORMATION processInfo{};
|
||||
if (CreateProcess(path,cmdLine,NULL,NULL,TRUE,0,NULL,NULL,&startupInfo,&processInfo))
|
||||
{
|
||||
CloseHandle(processInfo.hThread);
|
||||
@@ -7406,35 +7401,46 @@ bool CMenuContainer::HasMoreResults( void )
|
||||
|
||||
RECT CMenuContainer::CalculateWorkArea( const RECT &taskbarRect )
|
||||
{
|
||||
RECT rc=s_MenuLimits;
|
||||
if ((s_TaskBarEdge==ABE_LEFT || s_TaskBarEdge==ABE_RIGHT) && GetSettingBool(L"ShowNextToTaskbar"))
|
||||
RECT rc;
|
||||
if (!GetSettingBool(L"AlignToWorkArea"))
|
||||
{
|
||||
// when the taskbar is on the side and the menu is not on top of it
|
||||
// the start button is assumed at the top
|
||||
if (s_TaskBarEdge==ABE_LEFT)
|
||||
rc.left=taskbarRect.right;
|
||||
rc = s_MenuLimits;
|
||||
if ((s_TaskBarEdge == ABE_LEFT || s_TaskBarEdge == ABE_RIGHT) && GetSettingBool(L"ShowNextToTaskbar"))
|
||||
{
|
||||
// when the taskbar is on the side and the menu is not on top of it
|
||||
// the start button is assumed at the top
|
||||
if (s_TaskBarEdge == ABE_LEFT)
|
||||
rc.left = taskbarRect.right;
|
||||
else
|
||||
rc.right = taskbarRect.left;
|
||||
}
|
||||
else
|
||||
rc.right=taskbarRect.left;
|
||||
{
|
||||
if (s_TaskBarEdge == ABE_BOTTOM)
|
||||
{
|
||||
// taskbar is at the bottom
|
||||
rc.bottom = taskbarRect.top;
|
||||
}
|
||||
else if (s_TaskBarEdge == ABE_TOP)
|
||||
{
|
||||
// taskbar is at the top
|
||||
rc.top = taskbarRect.bottom;
|
||||
}
|
||||
else
|
||||
{
|
||||
// taskbar is on the side, start button must be at the top
|
||||
rc.top = s_StartRect.bottom;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (s_TaskBarEdge==ABE_BOTTOM)
|
||||
{
|
||||
// taskbar is at the bottom
|
||||
rc.bottom=taskbarRect.top;
|
||||
}
|
||||
else if (s_TaskBarEdge==ABE_TOP)
|
||||
{
|
||||
// taskbar is at the top
|
||||
rc.top=taskbarRect.bottom;
|
||||
}
|
||||
else
|
||||
{
|
||||
// taskbar is on the side, start button must be at the top
|
||||
rc.top=s_StartRect.bottom;
|
||||
}
|
||||
// Get working area of the monitor the specified taskbar is on
|
||||
MONITORINFO info{ sizeof(MONITORINFO) };
|
||||
HMONITOR mon = MonitorFromRect(&taskbarRect, 0);
|
||||
GetMonitorInfo(mon, &info);
|
||||
rc = info.rcWork;
|
||||
}
|
||||
|
||||
if (!s_bLockWorkArea)
|
||||
{
|
||||
// exclude floating keyboard
|
||||
@@ -7460,6 +7466,32 @@ RECT CMenuContainer::CalculateWorkArea( const RECT &taskbarRect )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//calculate offsets
|
||||
int xOff = GetSettingInt(L"HorizontalMenuOffset");
|
||||
int yOff = GetSettingInt(L"VerticalMenuOffset");
|
||||
if (s_TaskBarEdge == ABE_BOTTOM)
|
||||
{
|
||||
if (xOff != 0)
|
||||
rc.left += xOff;
|
||||
if (yOff != 0)
|
||||
rc.bottom += yOff;
|
||||
}
|
||||
else if (s_TaskBarEdge == ABE_TOP || s_TaskBarEdge == ABE_LEFT)
|
||||
{
|
||||
if (xOff != 0)
|
||||
rc.left += xOff;
|
||||
if (yOff != 0)
|
||||
rc.top += yOff;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (xOff != 0)
|
||||
rc.right += xOff;
|
||||
if (yOff != 0)
|
||||
rc.top += yOff;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -7709,27 +7741,57 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr
|
||||
|
||||
s_bHasUpdates=(!bRemote || GetSettingBool(L"RemoteShutdown")) && GetSettingBool(L"CheckWinUpdates") && CheckForUpdates();
|
||||
|
||||
SYSTEM_POWER_CAPABILITIES powerCaps;
|
||||
GetPwrCapabilities(&powerCaps);
|
||||
|
||||
bool bHibernate=false;
|
||||
if (powerCaps.HiberFilePresent)
|
||||
// Check control panel options for power buttons
|
||||
bool bHibernate = true, bSleep = true, bLock = true;
|
||||
{
|
||||
bHibernate=true;
|
||||
/* disabled for now, use group policy to hide Hibernate
|
||||
// disable hibernate if hybrid sleep (fast s4) is enabled
|
||||
SYSTEM_POWER_STATUS status;
|
||||
if (GetSystemPowerStatus(&status) && (status.ACLineStatus==0 || status.ACLineStatus==1))
|
||||
CRegKey regKeyButtons;
|
||||
if (regKeyButtons.Open(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FlyoutMenuSettings", KEY_READ) == ERROR_SUCCESS)
|
||||
{
|
||||
GUID *pScheme;
|
||||
if (PowerGetActiveScheme(NULL,&pScheme)==ERROR_SUCCESS)
|
||||
{
|
||||
DWORD index;
|
||||
if ((status.ACLineStatus==1?PowerReadACValueIndex:PowerReadDCValueIndex)(NULL,pScheme,&GUID_SLEEP_SUBGROUP,&GUID_HIBERNATE_FASTS4_POLICY,&index)==ERROR_SUCCESS && index)
|
||||
bHibernate=false;
|
||||
LocalFree(pScheme);
|
||||
}
|
||||
}*/
|
||||
DWORD dwValue = 1;
|
||||
if (regKeyButtons.QueryDWORDValue(L"ShowHibernateOption", dwValue) == ERROR_SUCCESS)
|
||||
if (dwValue == 0)
|
||||
bHibernate = false;
|
||||
|
||||
if (regKeyButtons.QueryDWORDValue(L"ShowLockOption", dwValue) == ERROR_SUCCESS)
|
||||
if (dwValue == 0)
|
||||
bLock = false;
|
||||
|
||||
if (regKeyButtons.QueryDWORDValue(L"ShowSleepOption", dwValue) == ERROR_SUCCESS)
|
||||
if (dwValue == 0)
|
||||
bSleep = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (bHibernate || bSleep)
|
||||
{
|
||||
SYSTEM_POWER_CAPABILITIES powerCaps;
|
||||
GetPwrCapabilities(&powerCaps);
|
||||
|
||||
// no sleep capabilities, turn off the sleep option
|
||||
if (!(powerCaps.SystemS1 || powerCaps.SystemS2 || powerCaps.SystemS3 || powerCaps.AoAc))
|
||||
{
|
||||
bSleep = false;
|
||||
}
|
||||
|
||||
// no hibernate capabilities, turn off hibernate option
|
||||
if (!powerCaps.HiberFilePresent)
|
||||
{
|
||||
bHibernate = false;
|
||||
/* disabled for now, use group policy to hide Hibernate
|
||||
// disable hibernate if hybrid sleep (fast s4) is enabled
|
||||
SYSTEM_POWER_STATUS status;
|
||||
if (GetSystemPowerStatus(&status) && (status.ACLineStatus==0 || status.ACLineStatus==1))
|
||||
{
|
||||
GUID *pScheme;
|
||||
if (PowerGetActiveScheme(NULL,&pScheme)==ERROR_SUCCESS)
|
||||
{
|
||||
DWORD index;
|
||||
if ((status.ACLineStatus==1?PowerReadACValueIndex:PowerReadDCValueIndex)(NULL,pScheme,&GUID_SLEEP_SUBGROUP,&GUID_HIBERNATE_FASTS4_POLICY,&index)==ERROR_SUCCESS && index)
|
||||
bHibernate=false;
|
||||
LocalFree(pScheme);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0;i<_countof(g_StdOptions);i++)
|
||||
@@ -7939,8 +8001,11 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr
|
||||
g_StdOptions[i].options=MENU_ENABLED|MENU_EXPANDED;
|
||||
}
|
||||
break;
|
||||
case MENU_LOCK:
|
||||
g_StdOptions[i].options=(bLock)?MENU_ENABLED|MENU_EXPANDED:0;
|
||||
break;
|
||||
case MENU_SLEEP:
|
||||
g_StdOptions[i].options=(!s_bNoClose && (powerCaps.SystemS1 || powerCaps.SystemS2 || powerCaps.SystemS3 || powerCaps.AoAc))?MENU_ENABLED|MENU_EXPANDED:0;
|
||||
g_StdOptions[i].options=(!s_bNoClose && bSleep)?MENU_ENABLED|MENU_EXPANDED:0;
|
||||
break;
|
||||
case MENU_HIBERNATE:
|
||||
g_StdOptions[i].options=(!s_bNoClose && bHibernate)?MENU_ENABLED|MENU_EXPANDED:0;
|
||||
|
||||
@@ -957,7 +957,6 @@ private:
|
||||
friend LRESULT CALLBACK SubclassTopMenuProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
||||
friend HRESULT CreatePinLink( PCIDLIST_ABSOLUTE sourcePidl, const wchar_t *name, const wchar_t *iconPath, int iconIndex );
|
||||
|
||||
static void HideTemp( bool bHide );
|
||||
static void AddMRUShortcut( const wchar_t *path );
|
||||
static void AddMRUAppId( const wchar_t *appid );
|
||||
static void DeleteMRUShortcut( const wchar_t *path );
|
||||
|
||||
@@ -2200,6 +2200,21 @@ void CMenuContainer::DrawBackground( HDC hdc, const RECT &drawRect )
|
||||
else
|
||||
iconSize.cx=iconSize.cy=0;
|
||||
|
||||
COLORREF color, shadowColor;
|
||||
{
|
||||
bool bHotColor = (bHot && !bSplit) || stateLeft > 0;
|
||||
if (item.id == MENU_EMPTY || item.id == MENU_EMPTY_TOP)
|
||||
{
|
||||
color = settings.textColors[bHotColor ? 3 : 2];
|
||||
shadowColor = settings.textShadowColors[bHotColor ? 3 : 2];
|
||||
}
|
||||
else
|
||||
{
|
||||
color = settings.textColors[bHotColor ? 1 : 0];
|
||||
shadowColor = settings.textShadowColors[bHotColor ? 1 : 0];
|
||||
}
|
||||
}
|
||||
|
||||
// draw icon
|
||||
if (drawType==MenuSkin::PROGRAMS_BUTTON || drawType==MenuSkin::PROGRAMS_BUTTON_NEW)
|
||||
{
|
||||
@@ -2256,15 +2271,21 @@ void CMenuContainer::DrawBackground( HDC hdc, const RECT &drawRect )
|
||||
const CItemManager::IconInfo *pIcon=(settings.iconSize==MenuSkin::ICON_SIZE_LARGE)?item.pItemInfo->largeIcon:item.pItemInfo->smallIcon;
|
||||
if (pIcon && pIcon->bitmap)
|
||||
{
|
||||
HBITMAP temp = ColorizeMonochromeImage(pIcon->bitmap, color);
|
||||
HBITMAP bitmap = temp ? temp : pIcon->bitmap;
|
||||
|
||||
BITMAP info;
|
||||
GetObject(pIcon->bitmap,sizeof(info),&info);
|
||||
HGDIOBJ bmp0=SelectObject(hdc2,pIcon->bitmap);
|
||||
GetObject(bitmap,sizeof(info),&info);
|
||||
HGDIOBJ bmp0=SelectObject(hdc2,bitmap);
|
||||
if (bmp0)
|
||||
{
|
||||
BLENDFUNCTION func={AC_SRC_OVER,0,255,AC_SRC_ALPHA};
|
||||
AlphaBlend(hdc,iconX,iconY,iconSize.cx,iconSize.cy,hdc2,0,0,info.bmWidth,info.bmHeight,func);
|
||||
SelectObject(hdc2,bmp0);
|
||||
}
|
||||
|
||||
if (temp)
|
||||
DeleteObject(temp);
|
||||
}
|
||||
}
|
||||
else if (item.id==MENU_SHUTDOWN_BUTTON && s_bHasUpdates && s_Skin.Shutdown_bitmap.GetBitmap())
|
||||
@@ -2287,18 +2308,6 @@ void CMenuContainer::DrawBackground( HDC hdc, const RECT &drawRect )
|
||||
|
||||
// draw text
|
||||
SelectObject(hdc,settings.font);
|
||||
COLORREF color, shadowColor;
|
||||
bool bHotColor=(bHot && !bSplit) || stateLeft>0;
|
||||
if (item.id==MENU_EMPTY || item.id==MENU_EMPTY_TOP)
|
||||
{
|
||||
color=settings.textColors[bHotColor?3:2];
|
||||
shadowColor=settings.textShadowColors[bHotColor?3:2];
|
||||
}
|
||||
else
|
||||
{
|
||||
color=settings.textColors[bHotColor?1:0];
|
||||
shadowColor=settings.textShadowColors[bHotColor?1:0];
|
||||
}
|
||||
RECT rc={itemRect.left+settings.iconPadding.left+settings.iconPadding.right+settings.textPadding.left,itemRect.top+settings.textPadding.top,
|
||||
itemRect.right-settings.arrPadding.cx-settings.arrPadding.cy-settings.textPadding.right,itemRect.bottom-settings.textPadding.bottom};
|
||||
if (item.id==MENU_SHUTDOWN_BUTTON)
|
||||
|
||||
@@ -301,21 +301,12 @@ bool CanUninstallMetroApp( const wchar_t *appid )
|
||||
// Uninstalls the app with the given id
|
||||
void UninstallMetroApp( const wchar_t *appid )
|
||||
{
|
||||
CComPtr<IShellItem> pAppItem;
|
||||
if (SUCCEEDED(SHCreateItemInKnownFolder(FOLDERID_AppsFolder2,0,appid,IID_IShellItem,(void**)&pAppItem)))
|
||||
auto packageName = GetPackageFullName(appid);
|
||||
if (!packageName.IsEmpty())
|
||||
{
|
||||
CComPtr<IPropertyStore> pStore;
|
||||
pAppItem->BindToHandler(NULL,BHID_PropertyStore,IID_IPropertyStore,(void**)&pStore);
|
||||
if (pStore)
|
||||
{
|
||||
CString packageName=GetPropertyStoreString(pStore,PKEY_MetroPackageName);
|
||||
if (!packageName.IsEmpty())
|
||||
{
|
||||
wchar_t command[1024];
|
||||
Sprintf(command,_countof(command),L"Remove-AppxPackage %s",packageName);
|
||||
ShellExecute(NULL,L"open",L"powershell.exe",command,NULL,SW_HIDE);
|
||||
}
|
||||
}
|
||||
wchar_t command[1024];
|
||||
Sprintf(command, _countof(command), L"Remove-AppxPackage %s", packageName);
|
||||
ShellExecute(NULL, L"open", L"powershell.exe", command, NULL, SW_HIDE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -381,3 +372,16 @@ bool IsEdgeDefaultBrowser( void )
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
CString GetPackageFullName(const wchar_t* appId)
|
||||
{
|
||||
CComPtr<IShellItem> item;
|
||||
if (SUCCEEDED(SHCreateItemInKnownFolder(FOLDERID_AppsFolder, 0, appId, IID_PPV_ARGS(&item))))
|
||||
{
|
||||
CComPtr<IPropertyStore> store;
|
||||
if (SUCCEEDED(item->BindToHandler(nullptr, BHID_PropertyStore, IID_PPV_ARGS(&store))))
|
||||
return GetPropertyStoreString(store, PKEY_MetroPackageName);
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
@@ -53,3 +53,6 @@ CComPtr<IContextMenu> GetMetroPinMenu( const wchar_t *appid );
|
||||
|
||||
// Determines if Edge is the default browser
|
||||
bool IsEdgeDefaultBrowser( void );
|
||||
|
||||
// Returns full package name for given App ID
|
||||
CString GetPackageFullName(const wchar_t* appId);
|
||||
|
||||
@@ -60,9 +60,9 @@ void CProgramsTree::Create( CMenuContainer *pOwner )
|
||||
HWND hWnd=CreateWindowEx(0,WC_TREEVIEW,NULL,WS_CHILD|TVS_EDITLABELS|TVS_FULLROWSELECT|(CMenuContainer::s_TipHideTime?TVS_INFOTIP:0)|TVS_NOHSCROLL|TVS_SHOWSELALWAYS|TVS_NONEVENHEIGHT,0,0,0,0,pOwner->m_hWnd,NULL,g_Instance,NULL);
|
||||
TreeView_SetExtendedStyle(hWnd,TVS_EX_AUTOHSCROLL,TVS_EX_AUTOHSCROLL);
|
||||
const MenuSkin &skin=CMenuContainer::s_Skin;
|
||||
m_TreeTheme=OpenThemeData(m_hWnd,L"treeview");
|
||||
m_TreeTheme=OpenThemeData(hWnd,L"treeview");
|
||||
if (skin.BHasScrollbar)
|
||||
m_ScrollTheme=OpenThemeData(m_hWnd,L"scrollbar");
|
||||
m_ScrollTheme=OpenThemeData(hWnd,L"scrollbar");
|
||||
|
||||
const MenuSkin::ItemDrawSettings &settings=skin.ItemSettings[MenuSkin::PROGRAMS_TREE_ITEM];
|
||||
|
||||
@@ -1601,8 +1601,6 @@ HRESULT CProgramsTree::Drop( IDataObject *pDataObj, DWORD grfKeyState, POINTL pt
|
||||
CMenuContainer::s_bPreventClosing=true;
|
||||
m_pOwner->AddRef();
|
||||
pTarget->Drop(pDataObj,grfKeyState,pt,pdwEffect);
|
||||
if (!bOld)
|
||||
CMenuContainer::HideTemp(false);
|
||||
CMenuContainer::s_bPreventClosing=bOld;
|
||||
for (std::vector<CMenuContainer*>::iterator it=CMenuContainer::s_Menus.begin();it!=CMenuContainer::s_Menus.end();++it)
|
||||
if (!(*it)->m_bDestroyed)
|
||||
|
||||
@@ -139,18 +139,25 @@ void CSearchManager::CloseMenu( void )
|
||||
Lock lock(this,LOCK_DATA);
|
||||
m_LastRequestId++;
|
||||
m_LastProgramsRequestId=m_LastRequestId;
|
||||
if (g_LogCategories&LOG_SEARCH)
|
||||
if (g_LogCategories & LOG_SEARCH)
|
||||
{
|
||||
for (std::vector<SearchItem>::const_iterator it=m_ProgramItems.begin();it!=m_ProgramItems.end();++it)
|
||||
for (const auto& item : m_ProgramItems)
|
||||
{
|
||||
if (it->category==CATEGORY_PROGRAM)
|
||||
LOG_MENU(LOG_SEARCH,L"Program: '%s', %d",it->name,it->rank);
|
||||
if (item.category == CATEGORY_PROGRAM)
|
||||
LOG_MENU(LOG_SEARCH, L"Program: '%s', %d", item.name, item.rank);
|
||||
}
|
||||
std::sort(m_SettingsItems.begin(),m_SettingsItems.end());
|
||||
for (std::vector<SearchItem>::const_iterator it=m_SettingsItems.begin();it!=m_SettingsItems.end();++it)
|
||||
|
||||
std::sort(m_SettingsItems.begin(), m_SettingsItems.end());
|
||||
|
||||
for (const auto& item : m_SettingsItems)
|
||||
{
|
||||
if (it->category==CATEGORY_SETTING)
|
||||
LOG_MENU(LOG_SEARCH,L"Setting: '%s', %d",it->name,it->rank);
|
||||
if (item.category == CATEGORY_SETTING)
|
||||
LOG_MENU(LOG_SEARCH, L"Setting: '%s', %d", item.name, item.rank);
|
||||
}
|
||||
for (const auto& item : m_SettingsItems)
|
||||
{
|
||||
if (item.category == CATEGORY_METROSETTING)
|
||||
LOG_MENU(LOG_SEARCH, L"MetroSetting: '%s', %d", item.name, item.rank);
|
||||
}
|
||||
}
|
||||
if (m_bProgramsFound)
|
||||
@@ -170,6 +177,7 @@ void CSearchManager::CloseMenu( void )
|
||||
m_SettingsItems.clear();
|
||||
m_SettingsHash=FNV_HASH0;
|
||||
m_bSettingsFound=false;
|
||||
m_bMetroSettingsFound = false;
|
||||
|
||||
m_IndexedItems.clear();
|
||||
m_AutoCompleteItems.clear();
|
||||
@@ -310,7 +318,9 @@ bool CSearchManager::AddSearchItem( IShellItem *pItem, const wchar_t *name, int
|
||||
PROPVARIANT val;
|
||||
PropVariantInit(&val);
|
||||
pItem2->GetProperty(PKEY_Keywords,&val);
|
||||
wchar_t keywords[1024];
|
||||
if (val.vt==VT_EMPTY)
|
||||
pItem2->GetProperty(PKEY_HighKeywords,&val);
|
||||
wchar_t keywords[2048];
|
||||
int len=0;
|
||||
if (val.vt==VT_BSTR || val.vt==VT_LPWSTR)
|
||||
{
|
||||
@@ -334,7 +344,7 @@ bool CSearchManager::AddSearchItem( IShellItem *pItem, const wchar_t *name, int
|
||||
}
|
||||
|
||||
Lock lock(this,LOCK_DATA);
|
||||
if (category==CATEGORY_PROGRAM || category==CATEGORY_SETTING)
|
||||
if (category==CATEGORY_PROGRAM || category==CATEGORY_SETTING || category==CATEGORY_METROSETTING)
|
||||
{
|
||||
if (searchRequest.requestId<m_LastProgramsRequestId)
|
||||
return false;
|
||||
@@ -345,10 +355,10 @@ bool CSearchManager::AddSearchItem( IShellItem *pItem, const wchar_t *name, int
|
||||
return false;
|
||||
}
|
||||
bool res=true;
|
||||
if (category==CATEGORY_PROGRAM || category==CATEGORY_SETTING)
|
||||
if (category==CATEGORY_PROGRAM || category==CATEGORY_SETTING || category==CATEGORY_METROSETTING)
|
||||
{
|
||||
std::vector<SearchItem> &items=(category==CATEGORY_PROGRAM)?m_ProgramItems:m_SettingsItems;
|
||||
if (category==CATEGORY_SETTING)
|
||||
if (category==CATEGORY_SETTING || category==CATEGORY_METROSETTING)
|
||||
{
|
||||
// remove duplicate settings
|
||||
for (std::vector<SearchItem>::const_iterator it=items.begin();it!=items.end();++it)
|
||||
@@ -381,6 +391,8 @@ bool CSearchManager::AddSearchItem( IShellItem *pItem, const wchar_t *name, int
|
||||
}
|
||||
|
||||
items.push_back(item);
|
||||
if (item.category==CATEGORY_METROSETTING)
|
||||
m_bMetroSettingsFound=true;
|
||||
}
|
||||
else if (category==CATEGORY_AUTOCOMPLETE)
|
||||
{
|
||||
@@ -409,7 +421,7 @@ void CSearchManager::CollectSearchItems( IShellItem *pFolder, int flags, TItemCa
|
||||
CComPtr<IShellItem> pChild;
|
||||
while (pChild=NULL,pEnum->Next(1,&pChild,NULL)==S_OK)
|
||||
{
|
||||
if (category==CATEGORY_PROGRAM || category==CATEGORY_SETTING)
|
||||
if (category==CATEGORY_PROGRAM || category==CATEGORY_SETTING || category==CATEGORY_METROSETTING)
|
||||
{
|
||||
if (searchRequest.requestId<m_LastProgramsRequestId)
|
||||
break;
|
||||
@@ -428,7 +440,7 @@ void CSearchManager::CollectSearchItems( IShellItem *pFolder, int flags, TItemCa
|
||||
{
|
||||
// go into subfolders but not archives or links to folders
|
||||
CollectSearchItems(pChild,flags,category,searchRequest);
|
||||
if (category==CATEGORY_PROGRAM || category==CATEGORY_SETTING)
|
||||
if (category==CATEGORY_PROGRAM || category==CATEGORY_SETTING || category==CATEGORY_METROSETTING)
|
||||
{
|
||||
if (searchRequest.requestId<m_LastProgramsRequestId)
|
||||
break;
|
||||
@@ -670,7 +682,7 @@ void CSearchManager::SearchThread( void )
|
||||
if (GetWinVersion()>=WIN_VER_WIN8 && searchRequest.bSearchMetroApps)
|
||||
{
|
||||
std::vector<MetroLink> links;
|
||||
GetMetroLinks(links,false);
|
||||
GetMetroLinks(links,true);
|
||||
for (std::vector<MetroLink>::const_iterator it=links.begin();it!=links.end();++it)
|
||||
{
|
||||
if (GetWinVersion()<WIN_VER_WIN10)
|
||||
@@ -733,6 +745,14 @@ void CSearchManager::SearchThread( void )
|
||||
if (searchRequest.requestId<m_LastProgramsRequestId)
|
||||
continue;
|
||||
}
|
||||
if (searchRequest.bSearchMetroSettings)
|
||||
{
|
||||
CComPtr<IShellItem> pFolder;
|
||||
if (SUCCEEDED(SHCreateItemFromParsingName(L"shell:::{82E749ED-B971-4550-BAF7-06AA2BF7E836}",NULL,IID_IShellItem,(void**)&pFolder)))
|
||||
CollectSearchItems(pFolder,(searchRequest.bSearchKeywords?COLLECT_KEYWORDS:0)|COLLECT_NOREFRESH,CATEGORY_METROSETTING,searchRequest);
|
||||
if (searchRequest.requestId<m_LastProgramsRequestId)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
bool bRefresh=false;
|
||||
{
|
||||
@@ -780,7 +800,7 @@ void CSearchManager::SearchThread( void )
|
||||
{
|
||||
std::list<SearchScope> scopeList;
|
||||
|
||||
if (searchRequest.bSearchMetroSettings)
|
||||
if (searchRequest.bSearchMetroSettings && !m_bMetroSettingsFound)
|
||||
{
|
||||
scopeList.push_back(SearchScope());
|
||||
SearchScope &scope=*scopeList.rbegin();
|
||||
@@ -1240,7 +1260,7 @@ void CSearchManager::SearchThread( void )
|
||||
Lock lock(this,LOCK_DATA);
|
||||
m_IndexedItems.push_back(SearchCategory());
|
||||
pCategory=&*m_IndexedItems.rbegin();
|
||||
pCategory->name.Format(L"%s (%d)",it->name,it->resultCount);
|
||||
pCategory->name=it->name;
|
||||
pCategory->categoryHash=it->categoryHash;
|
||||
pCategory->search.Clone(it->search);
|
||||
}
|
||||
@@ -1348,6 +1368,7 @@ void CSearchManager::GetSearchResults( SearchResults &results )
|
||||
{
|
||||
results.programs.clear();
|
||||
results.settings.clear();
|
||||
results.metrosettings.clear();
|
||||
results.indexed.clear();
|
||||
results.autocomplete.clear();
|
||||
results.autoCompletePath.Empty();
|
||||
@@ -1397,14 +1418,19 @@ void CSearchManager::GetSearchResults( SearchResults &results )
|
||||
std::vector<SearchItem> &settings=m_bSettingsFound?m_SettingsItems:m_SettingsItemsOld;
|
||||
for (std::vector<SearchItem>::iterator it=settings.begin();it!=settings.end();++it)
|
||||
{
|
||||
int match=(it->category==CATEGORY_SETTING)?it->MatchText(m_SearchText,bSearchSubWord):0;
|
||||
int match=(it->category==CATEGORY_SETTING || it->category==CATEGORY_METROSETTING)?it->MatchText(m_SearchText,bSearchSubWord):0;
|
||||
it->rank=(it->rank&0xFFFFFFFE)|(match>>1);
|
||||
}
|
||||
std::sort(settings.begin(),settings.end());
|
||||
for (std::vector<SearchItem>::const_iterator it=settings.begin();it!=settings.end();++it)
|
||||
{
|
||||
if (it->category==CATEGORY_SETTING && it->MatchText(m_SearchText,bSearchSubWord))
|
||||
results.settings.push_back(it->pInfo);
|
||||
if (it->MatchText(m_SearchText, bSearchSubWord))
|
||||
{
|
||||
if (it->category==CATEGORY_SETTING)
|
||||
results.settings.push_back(it->pInfo);
|
||||
if (it->category==CATEGORY_METROSETTING)
|
||||
results.metrosettings.push_back(it->pInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1423,7 +1449,7 @@ void CSearchManager::GetSearchResults( SearchResults &results )
|
||||
results.autocomplete.push_back(it->pInfo);
|
||||
}
|
||||
}
|
||||
results.bResults=(!results.programs.empty() || !results.settings.empty() || !results.indexed.empty() || !results.autocomplete.empty());
|
||||
results.bResults=(!results.programs.empty() || !results.settings.empty() || !results.metrosettings.empty() || !results.indexed.empty() || !results.autocomplete.empty());
|
||||
results.bSearching=(m_LastCompletedId!=m_LastRequestId);
|
||||
}
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@ public:
|
||||
CString autoCompletePath;
|
||||
std::vector<const CItemManager::ItemInfo*> programs;
|
||||
std::vector<const CItemManager::ItemInfo*> settings;
|
||||
std::vector<const CItemManager::ItemInfo*> metrosettings;
|
||||
std::vector<const CItemManager::ItemInfo*> autocomplete;
|
||||
std::list<SearchCategory> indexed;
|
||||
};
|
||||
@@ -149,6 +150,7 @@ private:
|
||||
unsigned int m_SettingsHashOld;
|
||||
bool m_bProgramsFound;
|
||||
bool m_bSettingsFound;
|
||||
bool m_bMetroSettingsFound = false;
|
||||
std::vector<SearchItem> m_AutoCompleteItems;
|
||||
std::list<SearchCategory> m_IndexedItems;
|
||||
std::vector<ItemRank> m_ItemRanks;
|
||||
|
||||
@@ -1001,7 +1001,7 @@ static const CStdCommand g_StdCommands[]={
|
||||
{L"settings",IDS_SETTINGS_ITEM,IDS_SETTINGS_MENU_TIP,L"SettingsMenu",L"$Menu.Settings",L"",L"shell32.dll,330"},
|
||||
{L"search",IDS_SEARCH_MENU_ITEM,IDS_SEARCH_TIP,L"SearchMenu",L"$Menu.Search",L"",L"shell32.dll,323"},
|
||||
{L"search_box",IDS_SEARCH_BOX_ITEM,IDS_SEARCH_BOX_TIP,L"SearchBoxItem",L"$Menu.SearchBox",NULL,L"none",NULL,StdMenuItem::MENU_TRACK|StdMenuItem::MENU_OPENUP},
|
||||
{L"help",IDS_HELP_ITEM,IDS_HELP_TIP,L"HelpItem",L"$Menu.Help",L"$Menu.HelpTip",L"shell32.dll,324"},
|
||||
{L"help",IDS_HELP_ITEM,IDS_HELP_TIP,L"HelpItem",L"$Menu.Help",L"$Menu.HelpTip",L"imageres.dll,99"},
|
||||
{L"run",IDS_RUN_ITEM,IDS_RUN_TIP,L"RunItem",L"$Menu.Run",L"$Menu.RunTip",L"shell32.dll,328"},
|
||||
{L"logoff",IDS_SHUTDOWN_LOGOFF,IDS_LOGOFF_TIP,L"LogOffItem",L"$Menu.Logoff",L"$Menu.LogOffTip",L"shell32.dll,325",NULL,StdMenuItem::MENU_STYLE_CLASSIC1},
|
||||
{L"logoff",IDS_SHUTDOWN_LOGOFF,IDS_LOGOFF_TIP,L"LogOffItem",L"$Menu.Logoff",L"$Menu.LogOffTip",L"none",NULL,StdMenuItem::MENU_STYLE_CLASSIC2},
|
||||
@@ -1057,7 +1057,7 @@ L"RecentDocumentsItem.Label=$Menu.Documents\n"
|
||||
L"RecentDocumentsItem.Icon=shell32.dll,327\n"
|
||||
L"RecentDocumentsItem.Settings=ITEMS_FIRST\n"
|
||||
L"SettingsMenu.Command=settings\n"
|
||||
L"SettingsMenu.Items=ControlPanelItem, PCSettingsItem, SEPARATOR, SecurityItem, NetworkItem, PrintersItem, TaskbarSettingsItem, ProgramsFeaturesItem, SEPARATOR, MenuSettingsItem\n"
|
||||
L"SettingsMenu.Items=PCSettingsItem, ControlPanelItem, SEPARATOR, SecurityItem, NetworkItem, PrintersItem, TaskbarSettingsItem, ProgramsFeaturesItem, SEPARATOR, MenuSettingsItem\n"
|
||||
L"SettingsMenu.Label=$Menu.Settings\n"
|
||||
L"SettingsMenu.Icon=shell32.dll,330\n"
|
||||
L"SearchMenu.Command=search\n"
|
||||
@@ -1068,7 +1068,7 @@ L"ComputerItem.Command=computer\n"
|
||||
L"HelpItem.Command=help\n"
|
||||
L"HelpItem.Label=$Menu.Help\n"
|
||||
L"HelpItem.Tip=$Menu.HelpTip\n"
|
||||
L"HelpItem.Icon=shell32.dll,324\n"
|
||||
L"HelpItem.Icon=imageres.dll,99\n"
|
||||
L"RunItem.Command=run\n"
|
||||
L"RunItem.Label=$Menu.Run\n"
|
||||
L"RunItem.Tip=$Menu.RunTip\n"
|
||||
@@ -1183,7 +1183,7 @@ L"ShutdownItem.Icon=none\n"
|
||||
;
|
||||
|
||||
const wchar_t *g_DefaultStartMenu2=
|
||||
L"Items=COLUMN_PADDING, ProgramsMenu, AppsMenu, SearchBoxItem, COLUMN_BREAK, FavoritesItem, UserFilesItem, UserDocumentsItem, UserPicturesItem, ComputerItem, RecentDocumentsItem, SEPARATOR, ControlPanelItem, PCSettingsItem, SecurityItem, NetworkItem, PrintersItem, SEPARATOR, SearchMenu, HelpItem, RunItem, COLUMN_PADDING, SEPARATOR, ShutdownBoxItem\n"
|
||||
L"Items=COLUMN_PADDING, ProgramsMenu, AppsMenu, SearchBoxItem, COLUMN_BREAK, FavoritesItem, UserFilesItem, UserDocumentsItem, UserPicturesItem, ComputerItem, RecentDocumentsItem, SEPARATOR, PCSettingsItem, ControlPanelItem, SecurityItem, NetworkItem, PrintersItem, SEPARATOR, SearchMenu, HelpItem, RunItem, COLUMN_PADDING, SEPARATOR, ShutdownBoxItem\n"
|
||||
L"ProgramsMenu.Command=programs\n"
|
||||
L"ProgramsMenu.Label=$Menu.Programs\n"
|
||||
L"ProgramsMenu.Icon=shell32.dll,326\n"
|
||||
@@ -1203,7 +1203,7 @@ L"SearchMenu.Icon=shell32.dll,323\n"
|
||||
L"HelpItem.Command=help\n"
|
||||
L"HelpItem.Label=$Menu.Help\n"
|
||||
L"HelpItem.Tip=$Menu.HelpTip\n"
|
||||
L"HelpItem.Icon=shell32.dll,324\n"
|
||||
L"HelpItem.Icon=imageres.dll,99\n"
|
||||
L"RunItem.Command=run\n"
|
||||
L"RunItem.Label=$Menu.Run\n"
|
||||
L"RunItem.Tip=$Menu.RunTip\n"
|
||||
@@ -1379,9 +1379,9 @@ L"Item13.Settings=ITEM_DISABLED\n"
|
||||
L"Item14.Command=network_connections\n"
|
||||
L"Item14.Settings=ITEM_DISABLED\n"
|
||||
L"Item15.Command=separator\n"
|
||||
L"Item16.Command=control_panel\n"
|
||||
L"Item16.Command=pc_settings\n"
|
||||
L"Item16.Settings=TRACK_RECENT\n"
|
||||
L"Item17.Command=pc_settings\n"
|
||||
L"Item17.Command=control_panel\n"
|
||||
L"Item17.Settings=TRACK_RECENT\n"
|
||||
L"Item18.Command=admin\n"
|
||||
L"Item18.Settings=TRACK_RECENT|ITEM_DISABLED\n"
|
||||
@@ -3718,7 +3718,6 @@ protected:
|
||||
CWindow m_ImageClassic1, m_ImageClassic2, m_ImageWin7;
|
||||
CWindow m_Tooltip;
|
||||
CWindow m_ButtonAero, m_ButtonClassic, m_ButtonCustom;
|
||||
bool m_bLargeBitmaps;
|
||||
HICON m_hIcon;
|
||||
CString m_IconPath;
|
||||
|
||||
@@ -3737,14 +3736,13 @@ LRESULT CMenuStyleDlg::OnInitDialog( UINT uMsg, WPARAM wParam, LPARAM lParam, BO
|
||||
HDC hdc=::GetDC(NULL);
|
||||
int dpi=GetDeviceCaps(hdc,LOGPIXELSY);
|
||||
::ReleaseDC(NULL,hdc);
|
||||
m_bLargeBitmaps=dpi>=144;
|
||||
if (m_bLargeBitmaps)
|
||||
bool bLargeBitmaps=dpi>=144;
|
||||
{
|
||||
HBITMAP bmp=(HBITMAP)LoadImage(g_Instance,MAKEINTRESOURCE(IDB_STYLE_CLASSIC1150),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
|
||||
HBITMAP bmp=LoadImageResource(g_Instance,MAKEINTRESOURCE(bLargeBitmaps?IDB_STYLE_CLASSIC1150:IDB_STYLE_CLASSIC1),true,true);
|
||||
m_ImageClassic1.SendMessage(STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)bmp);
|
||||
bmp=(HBITMAP)LoadImage(g_Instance,MAKEINTRESOURCE(IDB_STYLE_CLASSIC2150),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
|
||||
bmp=LoadImageResource(g_Instance,MAKEINTRESOURCE(bLargeBitmaps?IDB_STYLE_CLASSIC2150:IDB_STYLE_CLASSIC2),true,true);
|
||||
m_ImageClassic2.SendMessage(STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)bmp);
|
||||
bmp=(HBITMAP)LoadImage(g_Instance,MAKEINTRESOURCE(IDB_STYLE_WIN7150),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
|
||||
bmp=LoadImageResource(g_Instance,MAKEINTRESOURCE(bLargeBitmaps?IDB_STYLE_WIN7150:IDB_STYLE_WIN7),true,true);
|
||||
m_ImageWin7.SendMessage(STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)bmp);
|
||||
}
|
||||
|
||||
@@ -3779,7 +3777,6 @@ LRESULT CMenuStyleDlg::OnDestroy( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&
|
||||
{
|
||||
if (m_hIcon) DestroyIcon(m_hIcon);
|
||||
m_hIcon=NULL;
|
||||
if (m_bLargeBitmaps)
|
||||
{
|
||||
HBITMAP bmp=(HBITMAP)m_ImageClassic1.SendMessage(STM_GETIMAGE,IMAGE_BITMAP);
|
||||
if (bmp) DeleteObject(bmp);
|
||||
@@ -4351,6 +4348,9 @@ CSetting g_Settings[]={
|
||||
{L"InvertMetroIcons",CSetting::TYPE_BOOL,IDS_INVERT_ICONS,IDS_INVERT_ICONS_TIP,0},
|
||||
{L"MaxMainMenuWidth",CSetting::TYPE_INT,IDS_MENU_WIDTH,IDS_MENU_WIDTH_TIP,60,CSetting::FLAG_MENU_CLASSIC_BOTH},
|
||||
{L"MaxMenuWidth",CSetting::TYPE_INT,IDS_SUBMENU_WIDTH,IDS_SUBMENU_WIDTH_TIP,60},
|
||||
{L"AlignToWorkArea",CSetting::TYPE_BOOL,IDS_ALIGN_WORK_AREA,IDS_ALIGN_WORK_AREA_TIP,0},
|
||||
{L"HorizontalMenuOffset",CSetting::TYPE_INT,IDS_HOR_OFFSET,IDS_HOR_OFFSET_TIP,0},
|
||||
{L"VerticalMenuOffset",CSetting::TYPE_INT,IDS_VERT_OFFSET,IDS_VERT_OFFSET_TIP,0 },
|
||||
{L"OverrideDPI",CSetting::TYPE_INT,IDS_DPI_OVERRIDE,IDS_DPI_OVERRIDE_TIP,0,CSetting::FLAG_COLD},
|
||||
{L"MainMenuAnimate",CSetting::TYPE_BOOL,IDS_ANIMATION7,IDS_ANIMATION7_TIP,1,CSetting::FLAG_MENU_WIN7},
|
||||
{L"MainMenuAnimation",CSetting::TYPE_INT,IDS_ANIMATION,IDS_ANIMATION_TIP,-1}, // system animation type
|
||||
@@ -4416,7 +4416,7 @@ CSetting g_Settings[]={
|
||||
{L"StartButtonIconSize",CSetting::TYPE_INT,IDS_BUTTON_ICON_SIZE,IDS_BUTTON_ICON_SIZE_TIP,0,0,L"#StartButtonType=1",L"ClasicButton"},
|
||||
{L"StartButtonText",CSetting::TYPE_STRING,IDS_BUTTON_TEXT,IDS_BUTTON_TEXT_TIP,L"$Menu.Start",0,L"#StartButtonType=1",L"ClasicButton"},
|
||||
|
||||
{L"Taskbar",CSetting::TYPE_GROUP,IDS_TASKBAR_SETTINGS},
|
||||
{L"Taskbar",CSetting::TYPE_GROUP,IDS_TASKBAR_SETTINGS,0,0,CSetting::FLAG_BASIC},
|
||||
{L"CustomTaskbar",CSetting::TYPE_BOOL,IDS_TASK_CUSTOM,IDS_TASK_CUSTOM_TIP,0,CSetting::FLAG_CALLBACK},
|
||||
{L"TaskbarLook",CSetting::TYPE_INT,IDS_TASK_LOOK,IDS_TASK_LOOK_TIP,1,CSetting::FLAG_CALLBACK,L"CustomTaskbar",L"CustomTaskbar"},
|
||||
{L"Opaque",CSetting::TYPE_RADIO,IDS_TASK_OPAQUE,IDS_TASK_OPAQUE_TIP},
|
||||
@@ -4425,8 +4425,8 @@ CSetting g_Settings[]={
|
||||
{L"AeroGlass",CSetting::TYPE_RADIO,IDS_TASK_AEROGLASS,IDS_TASK_AEROGLASS_TIP,0,CSetting::FLAG_HIDDEN},
|
||||
{L"TaskbarOpacity",CSetting::TYPE_INT,IDS_TASK_OPACITY,IDS_TASK_OPACITY_TIP,DEFAULT_TASK_OPACITY10,CSetting::FLAG_CALLBACK,L"TaskbarLook",L"CustomTaskbar"},
|
||||
{L"TaskbarColor",CSetting::TYPE_COLOR,IDS_TASK_COLOR,IDS_TASK_COLOR_TIP,0,CSetting::FLAG_CALLBACK,L"CustomTaskbar",L"CustomTaskbar"},
|
||||
{L"TaskbarTextColor",CSetting::TYPE_COLOR,IDS_TASK_TEXTCOLOR,IDS_TASK_TEXTCOLOR_TIP,0xFFFFFF,CSetting::FLAG_CALLBACK|(1<<24),L"CustomTaskbar",L"CustomTaskbar"},
|
||||
{L"TaskbarTexture",CSetting::TYPE_BITMAP_JPG,IDS_TASK_TEXTURE,IDS_TASK_TEXTURE_TIP,L"",CSetting::FLAG_CALLBACK,L"CustomTaskbar",L"CustomTaskbar"},
|
||||
{L"TaskbarTextColor",CSetting::TYPE_COLOR,IDS_TASK_TEXTCOLOR,IDS_TASK_TEXTCOLOR_TIP,0xFFFFFF,CSetting::FLAG_COLD|(1<<24),L"CustomTaskbar",L"CustomTaskbar"},
|
||||
{L"TaskbarTexture",CSetting::TYPE_BITMAP_JPG,IDS_TASK_TEXTURE,IDS_TASK_TEXTURE_TIP,L"",CSetting::FLAG_COLD,L"CustomTaskbar",L"CustomTaskbar"},
|
||||
{L"TaskbarTileH",CSetting::TYPE_INT,IDS_TASK_STRETCHH,IDS_TASK_STRETCHH_TIP,1,CSetting::FLAG_CALLBACK,L"#TaskbarTexture",L"TaskbarTexture"},
|
||||
{L"Tile",CSetting::TYPE_RADIO,IDS_TASK_TILE,IDS_TASK_TILE_TIP},
|
||||
{L"Stretch",CSetting::TYPE_RADIO,IDS_TASK_STRETCH,IDS_TASK_STRETCH_TIP},
|
||||
@@ -4659,11 +4659,19 @@ void UpdateSettings( void )
|
||||
else if (dpi<96) dpi=96;
|
||||
else if (dpi>480) dpi=480;
|
||||
|
||||
int iconSize=24;
|
||||
if (dpi<=96)
|
||||
iconSize=16;
|
||||
else if (dpi<=120)
|
||||
iconSize=20;
|
||||
int iconSize=16;
|
||||
if (dpi>=240)
|
||||
iconSize=40; // for 250% scaling
|
||||
else if (dpi>=216)
|
||||
iconSize=36; // for 225% scaling
|
||||
else if (dpi>=192)
|
||||
iconSize=32; // for 200% scaling
|
||||
else if (dpi>=168)
|
||||
iconSize=28; // for 175% scaling
|
||||
else if (dpi>=144)
|
||||
iconSize=24; // for 150% scaling
|
||||
else if (dpi>=120)
|
||||
iconSize=20; // for 125% scaling
|
||||
UpdateSetting(L"SmallIconSize",CComVariant(iconSize),false);
|
||||
UpdateSetting(L"LargeIconSize",CComVariant(iconSize*2),false);
|
||||
|
||||
|
||||
@@ -375,7 +375,10 @@ COLORREF MenuSkin::GetMetroColor( const wchar_t *names ) const
|
||||
if (GetImmersiveUserColorSetPreference!=NULL)
|
||||
{
|
||||
wchar_t text[256];
|
||||
Sprintf(text,_countof(text),L"Immersive%s",name);
|
||||
if (wcsncmp(name,L"Immersive",9)==0)
|
||||
wcscpy_s(text,name);
|
||||
else
|
||||
Sprintf(text,_countof(text),L"Immersive%s",name);
|
||||
int type=GetImmersiveColorTypeFromName(text);
|
||||
data.colorType=type<0?-1:type;
|
||||
if (type>=0)
|
||||
@@ -1495,8 +1498,21 @@ bool MenuSkin::ComputeOptionStates( const std::map<CString,CString> &options, st
|
||||
values.push_back(L"ALL_PROGRAMS");
|
||||
if (SkinType==SKIN_TYPE_CLASSIC2)
|
||||
values.push_back(L"TWO_COLUMNS");
|
||||
// for compatibility with existing skins
|
||||
if (Dpi>=144)
|
||||
values.push_back(L"HIGH_DPI");
|
||||
if (Dpi>=240)
|
||||
values.push_back(L"240_DPI"); // 250% scaling
|
||||
else if (Dpi>=216)
|
||||
values.push_back(L"216_DPI"); // 225% scaling
|
||||
else if (Dpi>=192)
|
||||
values.push_back(L"192_DPI"); // 200% scaling
|
||||
else if (Dpi>=168)
|
||||
values.push_back(L"168_DPI"); // 175% scaling
|
||||
else if (Dpi>=144)
|
||||
values.push_back(L"144_DPI"); // 150% scaling
|
||||
else if (Dpi>=120)
|
||||
values.push_back(L"120_DPI"); // 125% scaling
|
||||
if (ForceTouch || (GetWinVersion()>=WIN_VER_WIN8 && GetSettingBool(L"EnableTouch") && (GetSystemMetrics(SM_DIGITIZER)&NID_INTEGRATED_TOUCH)!=0))
|
||||
values.push_back(L"TOUCH_ENABLED");
|
||||
if (GetSettingInt(L"SearchBox")!=SEARCHBOX_HIDDEN)
|
||||
|
||||
@@ -292,7 +292,6 @@ public:
|
||||
// message handlers
|
||||
BEGIN_MSG_MAP( COwnerWindow )
|
||||
MESSAGE_HANDLER( WM_ACTIVATE, OnActivate )
|
||||
MESSAGE_HANDLER( WM_CLEAR, OnClear )
|
||||
MESSAGE_HANDLER( WM_SYSCOLORCHANGE, OnColorChange )
|
||||
MESSAGE_HANDLER( WM_SETTINGCHANGE, OnSettingChange )
|
||||
MESSAGE_HANDLER( WM_DISPLAYCHANGE, OnDisplayChange )
|
||||
@@ -304,7 +303,7 @@ protected:
|
||||
if (LOWORD(wParam)!=WA_INACTIVE)
|
||||
return 0;
|
||||
|
||||
if (CMenuContainer::s_bPreventClosing && lParam && (::GetWindowLongPtr((HWND)lParam,GWL_EXSTYLE)&WS_EX_TOPMOST))
|
||||
if (CMenuContainer::s_bPreventClosing)
|
||||
return 0;
|
||||
|
||||
// check if another menu window is being activated
|
||||
@@ -313,41 +312,13 @@ protected:
|
||||
if ((*it)->m_hWnd==(HWND)lParam)
|
||||
return 0;
|
||||
|
||||
if (CMenuContainer::s_bPreventClosing)
|
||||
{
|
||||
CMenuContainer::HideTemp(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (std::vector<CMenuContainer*>::reverse_iterator it=CMenuContainer::s_Menus.rbegin();it!=CMenuContainer::s_Menus.rend();++it)
|
||||
if (!(*it)->m_bDestroyed)
|
||||
(*it)->PostMessage(WM_CLOSE);
|
||||
}
|
||||
for (std::vector<CMenuContainer*>::reverse_iterator it=CMenuContainer::s_Menus.rbegin();it!=CMenuContainer::s_Menus.rend();++it)
|
||||
if (!(*it)->m_bDestroyed)
|
||||
(*it)->PostMessage(WM_CLOSE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
LRESULT OnClear( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
|
||||
{
|
||||
bool bHide=(wParam!=0); // hide or destroy
|
||||
if (CMenuContainer::s_bTempHidden!=bHide)
|
||||
{
|
||||
CMenuContainer::s_bTempHidden=bHide;
|
||||
if (bHide && CMenuContainer::s_UserPicture.m_hWnd)
|
||||
CMenuContainer::s_UserPicture.ShowWindow(SW_HIDE);
|
||||
for (std::vector<CMenuContainer*>::iterator it=CMenuContainer::s_Menus.begin();it!=CMenuContainer::s_Menus.end();++it)
|
||||
{
|
||||
if ((*it)->m_hWnd && !(*it)->m_bDestroyed)
|
||||
{
|
||||
(*it)->m_bClosing=true;
|
||||
if (!bHide)
|
||||
(*it)->PostMessage(WM_CLOSE);
|
||||
else
|
||||
(*it)->ShowWindow(SW_HIDE);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
LRESULT OnColorChange( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
|
||||
{
|
||||
@@ -2819,6 +2790,9 @@ static void OpenCortana( void )
|
||||
|
||||
static void InitStartMenuDLL( void )
|
||||
{
|
||||
LogToFile(STARTUP_LOG, L"StartMenu DLL: InitStartMenuDLL");
|
||||
WaitDllInitThread();
|
||||
|
||||
InitializeIatHooks();
|
||||
if (IsWin81Update1())
|
||||
{
|
||||
@@ -2846,39 +2820,40 @@ static void InitStartMenuDLL( void )
|
||||
}
|
||||
}
|
||||
|
||||
if (GetWinVersion()>=WIN_VER_WIN10)
|
||||
if (GetSettingBool(L"CustomTaskbar"))
|
||||
{
|
||||
HMODULE shlwapi=GetModuleHandle(L"shlwapi.dll");
|
||||
if (shlwapi)
|
||||
if (GetWinVersion()>=WIN_VER_WIN10)
|
||||
{
|
||||
g_SHFillRectClr=(tSHFillRectClr)GetProcAddress(shlwapi,MAKEINTRESOURCEA(197));
|
||||
if (g_SHFillRectClr)
|
||||
HMODULE shlwapi=GetModuleHandle(L"shlwapi.dll");
|
||||
if (shlwapi)
|
||||
{
|
||||
g_SHFillRectClrHook=SetIatHook(GetModuleHandle(NULL),"shlwapi.dll",MAKEINTRESOURCEA(197),SHFillRectClr2);
|
||||
if (!g_SHFillRectClrHook)
|
||||
g_SHFillRectClrHook=SetIatHook(GetModuleHandle(NULL),"api-ms-win-shlwapi-winrt-storage-l1-1-1.dll",MAKEINTRESOURCEA(197),SHFillRectClr2);
|
||||
g_SHFillRectClr=(tSHFillRectClr)GetProcAddress(shlwapi,MAKEINTRESOURCEA(197));
|
||||
if (g_SHFillRectClr)
|
||||
{
|
||||
g_SHFillRectClrHook=SetIatHook(GetModuleHandle(NULL),"shlwapi.dll",MAKEINTRESOURCEA(197),SHFillRectClr2);
|
||||
if (!g_SHFillRectClrHook)
|
||||
g_SHFillRectClrHook=SetIatHook(GetModuleHandle(NULL),"api-ms-win-shlwapi-winrt-storage-l1-1-1.dll",MAKEINTRESOURCEA(197),SHFillRectClr2);
|
||||
}
|
||||
}
|
||||
g_StretchDIBitsHook=SetIatHook(GetModuleHandle(NULL),"gdi32.dll","StretchDIBits",StretchDIBits2);
|
||||
}
|
||||
g_StretchDIBitsHook=SetIatHook(GetModuleHandle(NULL),"gdi32.dll","StretchDIBits",StretchDIBits2);
|
||||
}
|
||||
|
||||
{
|
||||
HWND dlg=CreateWindow(L"#32770",L"",WS_POPUP,0,0,0,0,NULL,0,0,0);
|
||||
HWND toolbar=CreateWindow(TOOLBARCLASSNAME,L"",WS_CHILD|TBS_TOOLTIPS,0,0,0,0,dlg,0,0,0);
|
||||
DestroyWindow(dlg);
|
||||
}
|
||||
{
|
||||
HWND dlg=CreateWindow(L"#32770",L"",WS_POPUP,0,0,0,0,NULL,0,0,0);
|
||||
HWND toolbar=CreateWindow(TOOLBARCLASSNAME,L"",WS_CHILD|TBS_TOOLTIPS,0,0,0,0,dlg,0,0,0);
|
||||
DestroyWindow(dlg);
|
||||
}
|
||||
|
||||
if (GetWinVersion()<=WIN_VER_WIN81)
|
||||
g_DrawThemeBackgroundHook=SetIatHook(GetModuleHandle(NULL),"uxtheme.dll","DrawThemeBackground",DrawThemeBackground2);
|
||||
g_DrawThemeTextHook=SetIatHook(GetModuleHandle(NULL),"uxtheme.dll","DrawThemeText",DrawThemeText2);
|
||||
g_DrawThemeTextExHook=SetIatHook(GetModuleHandle(NULL),"uxtheme.dll","DrawThemeTextEx",DrawThemeTextEx2);
|
||||
g_DrawThemeTextCtlHook=SetIatHook(GetModuleHandle(L"comctl32.dll"),"uxtheme.dll","DrawThemeText",DrawThemeText2);
|
||||
if (GetWinVersion()>=WIN_VER_WIN10)
|
||||
g_SetWindowCompositionAttributeHook=SetIatHook(GetModuleHandle(NULL),"user32.dll","SetWindowCompositionAttribute",SetWindowCompositionAttribute2);
|
||||
if (GetWinVersion()<=WIN_VER_WIN81)
|
||||
g_DrawThemeBackgroundHook=SetIatHook(GetModuleHandle(NULL),"uxtheme.dll","DrawThemeBackground",DrawThemeBackground2);
|
||||
g_DrawThemeTextHook=SetIatHook(GetModuleHandle(NULL),"uxtheme.dll","DrawThemeText",DrawThemeText2);
|
||||
g_DrawThemeTextExHook=SetIatHook(GetModuleHandle(NULL),"uxtheme.dll","DrawThemeTextEx",DrawThemeTextEx2);
|
||||
g_DrawThemeTextCtlHook=SetIatHook(GetModuleHandle(L"comctl32.dll"),"uxtheme.dll","DrawThemeText",DrawThemeText2);
|
||||
if (GetWinVersion()>=WIN_VER_WIN10)
|
||||
g_SetWindowCompositionAttributeHook=SetIatHook(GetModuleHandle(NULL),"user32.dll","SetWindowCompositionAttribute",SetWindowCompositionAttribute2);
|
||||
}
|
||||
|
||||
g_TaskbarThreadId=GetCurrentThreadId();
|
||||
LogToFile(STARTUP_LOG,L"StartMenu DLL: InitStartMenuDLL");
|
||||
WaitDllInitThread();
|
||||
g_bTrimHooks=GetWinVersion()==WIN_VER_WIN7 && (GetSettingInt(L"CompatibilityFixes")&COMPATIBILITY_TRIM_HOOKS);
|
||||
InitManagers(false);
|
||||
int level=GetSettingInt(L"CrashDump");
|
||||
|
||||
@@ -369,19 +369,20 @@ IDI_START10 ICON "start10.ico"
|
||||
IDB_ARROWS BITMAP "menu_arrows.bmp"
|
||||
IDB_ARROWS150 BITMAP "menu_arrows150.bmp"
|
||||
IDB_SEARCH_ICONS BITMAP "search_icons.bmp"
|
||||
IDB_STYLE_CLASSIC1 BITMAP "style_classic.bmp"
|
||||
IDB_STYLE_CLASSIC2 BITMAP "style_vista.bmp"
|
||||
IDB_STYLE_WIN7 BITMAP "style_7.bmp"
|
||||
IDB_BTN_CLASSIC BITMAP "btn_classic.bmp"
|
||||
IDB_STYLE_CLASSIC1150 BITMAP "style_classic150.bmp"
|
||||
IDB_STYLE_CLASSIC2150 BITMAP "style_vista150.bmp"
|
||||
IDB_STYLE_WIN7150 BITMAP "style_7150.bmp"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMAGE
|
||||
//
|
||||
|
||||
IDB_STYLE_CLASSIC1 IMAGE "style_classic.png"
|
||||
IDB_STYLE_CLASSIC2 IMAGE "style_vista.png"
|
||||
IDB_STYLE_WIN7 IMAGE "style_7.png"
|
||||
IDB_STYLE_CLASSIC1150 IMAGE "style_classic150.png"
|
||||
IDB_STYLE_CLASSIC2150 IMAGE "style_vista150.png"
|
||||
IDB_STYLE_WIN7150 IMAGE "style_7150.png"
|
||||
|
||||
IDB_BUTTON96 IMAGE "button96.png"
|
||||
IDB_BUTTON120 IMAGE "button120.png"
|
||||
IDB_BUTTON144 IMAGE "button144.png"
|
||||
@@ -643,6 +644,12 @@ BEGIN
|
||||
IDS_PIC_COMMAND_TIP "Enter the command you want to run when you click on the user picture"
|
||||
IDS_NAME_COMMAND "User name command"
|
||||
IDS_NAME_COMMAND_TIP "Enter the command you want to run when you click on the user name"
|
||||
IDS_ALIGN_WORK_AREA "Align start menu to working area"
|
||||
IDS_ALIGN_WORK_AREA_TIP "Align the start menu to the working area instead of to the taskbar. Use with custom taskbars"
|
||||
IDS_HOR_OFFSET "Horizontal position offset"
|
||||
IDS_HOR_OFFSET_TIP "Offset the start menu horizontally by the amount of pixels specified"
|
||||
IDS_VERT_OFFSET "Vertical position offset"
|
||||
IDS_VERT_OFFSET_TIP "Offset the start menu vertically by the amount of pixels specified"
|
||||
IDS_SMALL_SIZE_SM "Small icon size"
|
||||
IDS_SMALL_SIZE_SM_TIP "Set the small icon size. The default is 16 for DPI<=96, 20 for 96<DPI<=120 and 24 for DPI>120"
|
||||
IDS_LARGE_SIZE_SM "Large icon size"
|
||||
@@ -1153,21 +1160,21 @@ END
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_STRING7100 "This is the default skin when no other skin is selected or if the selected skin fails to load.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7101 "Windows Aero skin\n\nDefault skin to use for the Windows Aero theme.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7102 "Windows Basic skin\n\nDefault skin to use for the Windows Basic theme.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7103 "Classic skin\n\nClassic look with large or small icons.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7100 "This is the default skin when no other skin is selected or if the selected skin fails to load.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7101 "Windows Aero skin\n\nDefault skin to use for the Windows Aero theme.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7102 "Windows Basic skin\n\nDefault skin to use for the Windows Basic theme.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7103 "Classic skin\n\nClassic look with large or small icons.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_STRING7104 "Full Glass skin\n\nTransparent menu with large or small icons.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7105 "Smoked Glass skin\n\nSimple transparent menu with dark background.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7106 "Windows XP Luna skin\n\nA start menu similar to the one in Windows XP.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7107 "Windows 8 skin\n\nDefault skin to use for Windows 8.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7108 "Midnight skin\n\nSkin with dark background.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7109 "Metro skin\n\nSkin that uses the start screen colors.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7110 "Metallic skin\n\nA start menu skin with metallic look.\n\nPart of <A HREF=""http://www.classicshell.net/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7104 "Full Glass skin\n\nTransparent menu with large or small icons.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7105 "Smoked Glass skin\n\nSimple transparent menu with dark background.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7106 "Windows XP Luna skin\n\nA start menu similar to the one in Windows XP.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7107 "Windows 8 skin\n\nDefault skin to use for Windows 8.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7108 "Midnight skin\n\nSkin with dark background.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7109 "Metro skin\n\nSkin that uses the start screen colors.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
IDS_STRING7110 "Metallic skin\n\nA start menu skin with metallic look.\n\nPart of <A HREF=""https://github.com/Open-Shell/Open-Shell-Menu/"">Open-Shell</A> (c) 2009-2017, Ivo Beltchev"
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
|
||||
@@ -30,46 +30,46 @@
|
||||
<ProjectGuid>{85DEECBB-1F9B-4983-9D54-3BF42182B7E7}</ProjectGuid>
|
||||
<RootNamespace>StartMenuDLL</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Setup|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<UseOfAtl>Static</UseOfAtl>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
@@ -136,7 +136,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
@@ -161,7 +160,6 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\Lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
|
||||
@@ -754,6 +754,12 @@
|
||||
#define IDS_SELECT_LAST 3657
|
||||
#define IDS_SELECT_LAST_TIP 3658
|
||||
#define IDS_CLEAR_CACHE 3659
|
||||
#define IDS_ALIGN_WORK_AREA 3660
|
||||
#define IDS_ALIGN_WORK_AREA_TIP 3661
|
||||
#define IDS_HOR_OFFSET 3662
|
||||
#define IDS_HOR_OFFSET_TIP 3663
|
||||
#define IDS_VERT_OFFSET 3664
|
||||
#define IDS_VERT_OFFSET_TIP 3665
|
||||
#define IDS_STRING7001 7001
|
||||
#define IDS_STRING7002 7002
|
||||
#define IDS_STRING7003 7003
|
||||
|
||||
|
Before Width: | Height: | Size: 125 KiB |
BIN
Src/StartMenu/StartMenuDLL/style_7.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 270 KiB |
BIN
Src/StartMenu/StartMenuDLL/style_7150.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 84 KiB |
BIN
Src/StartMenu/StartMenuDLL/style_classic.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 182 KiB |
BIN
Src/StartMenu/StartMenuDLL/style_classic150.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 120 KiB |
BIN
Src/StartMenu/StartMenuDLL/style_vista.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 259 KiB |
BIN
Src/StartMenu/StartMenuDLL/style_vista150.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
434
Src/StartMenu/StartMenuHelper/ModernSettings.cpp
Normal file
@@ -0,0 +1,434 @@
|
||||
// Modern settings helper
|
||||
|
||||
// - parse modern settings definitions from %windir%\ImmersiveControlPanel\Settings\AllSystemSettings_{253E530E-387D-4BC2-959D-E6F86122E5F2}.xml
|
||||
// - store cached data (parsed settings, localized strings) in %LOCALAPPDATA%\OpenShell\ModernSettings.dat
|
||||
// - provide mapped view over cached data
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "ModernSettings.h"
|
||||
#include "ResourceHelper.h"
|
||||
#include <Shlobj.h>
|
||||
#include <Shlwapi.h>
|
||||
#include <functional>
|
||||
#include <iterator>
|
||||
#include <mutex>
|
||||
|
||||
enum class Id : uint32_t
|
||||
{
|
||||
Header = 'SMSO',
|
||||
Undef = 0,
|
||||
Blob,
|
||||
FileName,
|
||||
DeepLink,
|
||||
Icon,
|
||||
Glyph,
|
||||
PageId,
|
||||
HostId,
|
||||
GroupId,
|
||||
SettingId,
|
||||
Description,
|
||||
Keywords,
|
||||
};
|
||||
|
||||
#pragma pack(1)
|
||||
struct FileHdr
|
||||
{
|
||||
uint32_t openShellVersion = GetVersionEx(g_Instance);
|
||||
uint32_t windowsVersion = GetVersionEx(GetModuleHandle(L"user32.dll"));
|
||||
uint32_t userLanguageId = GetUserDefaultUILanguage();
|
||||
|
||||
bool operator==(const FileHdr& other) const
|
||||
{
|
||||
return (windowsVersion == other.windowsVersion) &&
|
||||
(openShellVersion == other.openShellVersion) &&
|
||||
(userLanguageId == other.userLanguageId);
|
||||
}
|
||||
};
|
||||
|
||||
struct ItemHdr
|
||||
{
|
||||
Id id;
|
||||
uint32_t size;
|
||||
|
||||
const uint8_t* data() const
|
||||
{
|
||||
return (const uint8_t*)this + sizeof(*this);
|
||||
}
|
||||
|
||||
const ItemHdr* next() const
|
||||
{
|
||||
return (const ItemHdr*)(data() + size);
|
||||
}
|
||||
|
||||
std::wstring_view asString() const
|
||||
{
|
||||
std::wstring_view retval((const wchar_t*)data(), size / sizeof(wchar_t));
|
||||
if (!retval.empty() && retval.back() == 0)
|
||||
{
|
||||
retval.remove_suffix(1);
|
||||
return retval;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
};
|
||||
#pragma pack()
|
||||
|
||||
class AttributeWriter
|
||||
{
|
||||
public:
|
||||
std::vector<uint8_t> buffer()
|
||||
{
|
||||
return std::move(m_buffer);
|
||||
}
|
||||
|
||||
void addBlob(Id id, const void* data, size_t size)
|
||||
{
|
||||
ItemHdr hdr{ id, (uint32_t)size };
|
||||
append(&hdr, sizeof(hdr));
|
||||
append(data, size);
|
||||
}
|
||||
|
||||
void addString(Id id, const std::wstring& str)
|
||||
{
|
||||
if (!str.empty())
|
||||
addBlob(id, str.data(), (str.size() + 1) * sizeof(str[0]));
|
||||
}
|
||||
|
||||
private:
|
||||
void append(const void* data, size_t size)
|
||||
{
|
||||
m_buffer.insert(m_buffer.end(), (const uint8_t*)data, (const uint8_t*)data + size);
|
||||
}
|
||||
|
||||
std::vector<uint8_t> m_buffer;
|
||||
};
|
||||
|
||||
static void ProcessAttributes(const void* buffer, size_t size, std::function<void(const ItemHdr&)> callback)
|
||||
{
|
||||
if (size < sizeof(ItemHdr))
|
||||
return;
|
||||
|
||||
auto item = (const ItemHdr*)buffer;
|
||||
auto last = (const ItemHdr*)((const uint8_t*)buffer + size);
|
||||
|
||||
while (item < last)
|
||||
{
|
||||
auto next = item->next();
|
||||
if (next <= item || next > last)
|
||||
break;
|
||||
|
||||
callback(*item);
|
||||
|
||||
item = next;
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
|
||||
static std::wstring TranslateIndirectString(const WCHAR* string)
|
||||
{
|
||||
std::wstring retval;
|
||||
retval.resize(1024);
|
||||
|
||||
if (SUCCEEDED(::SHLoadIndirectString(string, retval.data(), (UINT)retval.size(), nullptr)))
|
||||
{
|
||||
retval.resize(wcslen(retval.data()));
|
||||
return retval;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
static std::wstring TranslateIndirectMultiString(const WCHAR* string)
|
||||
{
|
||||
std::wstring retval;
|
||||
std::wstring_view str(string);
|
||||
|
||||
// remove '@'
|
||||
str.remove_prefix(1);
|
||||
|
||||
while (!str.empty())
|
||||
{
|
||||
auto len = str.find(L'@', 1);
|
||||
if (len == std::wstring::npos)
|
||||
len = str.length();
|
||||
|
||||
std::wstring tmp(str.substr(0, len));
|
||||
retval += TranslateIndirectString(tmp.c_str());
|
||||
|
||||
str.remove_prefix(len);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static std::wstring GetTranslatedString(CComPtr<IXMLDOMNode>& parent, const WCHAR* name)
|
||||
{
|
||||
CComPtr<IXMLDOMNode> node;
|
||||
if (parent->selectSingleNode(CComBSTR(name), &node) == S_OK)
|
||||
{
|
||||
CComBSTR value;
|
||||
if (node->get_text(&value) == S_OK)
|
||||
{
|
||||
if (value[0] == L'@')
|
||||
{
|
||||
if (value[1] == L'@')
|
||||
return TranslateIndirectMultiString(value);
|
||||
else
|
||||
return TranslateIndirectString(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (LPWSTR)value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
static void ParseFileName(CComPtr<IXMLDOMNode>& parent, AttributeWriter& writer)
|
||||
{
|
||||
writer.addString(Id::FileName, GetTranslatedString(parent, L"Filename"));
|
||||
}
|
||||
|
||||
static void ParseApplicationInformation(CComPtr<IXMLDOMNode>& parent, AttributeWriter& writer)
|
||||
{
|
||||
CComPtr<IXMLDOMNode> node;
|
||||
if (parent->selectSingleNode(CComBSTR(L"ApplicationInformation"), &node) == S_OK)
|
||||
{
|
||||
writer.addString(Id::DeepLink, GetTranslatedString(node, L"DeepLink"));
|
||||
writer.addString(Id::Icon, GetTranslatedString(node, L"Icon"));
|
||||
writer.addString(Id::Glyph, GetTranslatedString(node, L"Glyph"));
|
||||
}
|
||||
}
|
||||
|
||||
static void ParseSettingIdentity(CComPtr<IXMLDOMNode>& parent, AttributeWriter& writer)
|
||||
{
|
||||
CComPtr<IXMLDOMNode> node;
|
||||
if (parent->selectSingleNode(CComBSTR(L"SettingIdentity"), &node) == S_OK)
|
||||
{
|
||||
writer.addString(Id::PageId, GetTranslatedString(node, L"PageID"));
|
||||
writer.addString(Id::HostId, GetTranslatedString(node, L"HostID"));
|
||||
writer.addString(Id::GroupId, GetTranslatedString(node, L"GroupID"));
|
||||
writer.addString(Id::SettingId, GetTranslatedString(node, L"SettingID"));
|
||||
}
|
||||
}
|
||||
|
||||
static void ParseSettingInformation(CComPtr<IXMLDOMNode>& parent, AttributeWriter& writer)
|
||||
{
|
||||
CComPtr<IXMLDOMNode> node;
|
||||
if (parent->selectSingleNode(CComBSTR(L"SettingInformation"), &node) == S_OK)
|
||||
{
|
||||
auto description = GetTranslatedString(node, L"Description");
|
||||
if (description.empty())
|
||||
description = GetTranslatedString(node, L"Name");
|
||||
|
||||
writer.addString(Id::Description, description);
|
||||
|
||||
auto keywords = GetTranslatedString(node, L"HighKeywords");
|
||||
keywords += GetTranslatedString(node, L"LowKeywords");
|
||||
keywords += GetTranslatedString(node, L"Keywords");
|
||||
|
||||
writer.addString(Id::Keywords, keywords);
|
||||
}
|
||||
}
|
||||
|
||||
static std::vector<uint8_t> ParseSetting(CComPtr<IXMLDOMNode>& parent)
|
||||
{
|
||||
AttributeWriter writer;
|
||||
|
||||
ParseFileName(parent, writer);
|
||||
ParseApplicationInformation(parent, writer);
|
||||
ParseSettingIdentity(parent, writer);
|
||||
ParseSettingInformation(parent, writer);
|
||||
|
||||
return writer.buffer();
|
||||
}
|
||||
|
||||
static std::vector<uint8_t> ParseModernSettings()
|
||||
{
|
||||
AttributeWriter writer;
|
||||
|
||||
CComPtr<IXMLDOMDocument> doc;
|
||||
if (SUCCEEDED(doc.CoCreateInstance(L"Msxml2.FreeThreadedDOMDocument")))
|
||||
{
|
||||
doc->put_async(VARIANT_FALSE);
|
||||
|
||||
wchar_t path[MAX_PATH]{};
|
||||
wcscpy_s(path, LR"(%windir%\ImmersiveControlPanel\Settings\AllSystemSettings_{253E530E-387D-4BC2-959D-E6F86122E5F2}.xml)");
|
||||
DoEnvironmentSubst(path, _countof(path));
|
||||
|
||||
VARIANT_BOOL loaded;
|
||||
if (SUCCEEDED(doc->load(CComVariant(path), &loaded)) && loaded)
|
||||
{
|
||||
CComPtr<IXMLDOMNode> root;
|
||||
if (doc->selectSingleNode(CComBSTR(L"PCSettings"), &root) == S_OK)
|
||||
{
|
||||
FileHdr hdr{};
|
||||
writer.addBlob(Id::Header, &hdr, sizeof(hdr));
|
||||
|
||||
CComPtr<IXMLDOMNode> node;
|
||||
root->get_firstChild(&node);
|
||||
while (node)
|
||||
{
|
||||
auto buffer = ParseSetting(node);
|
||||
if (!buffer.empty())
|
||||
writer.addBlob(Id::Blob, buffer.data(), buffer.size());
|
||||
|
||||
CComPtr<IXMLDOMNode> next;
|
||||
if (FAILED(node->get_nextSibling(&next)))
|
||||
break;
|
||||
node = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return writer.buffer();
|
||||
}
|
||||
|
||||
ModernSettings::ModernSettings(const wchar_t* fname) : m_storage(fname)
|
||||
{
|
||||
if (m_storage)
|
||||
{
|
||||
bool valid = false;
|
||||
auto s = m_storage.get();
|
||||
ProcessAttributes(s.data, s.size, [&](const ItemHdr& item) {
|
||||
switch (item.id)
|
||||
{
|
||||
case Id::Header:
|
||||
if (item.size >= sizeof(FileHdr))
|
||||
{
|
||||
const auto hdr = (const FileHdr*)item.data();
|
||||
if (FileHdr() == *hdr)
|
||||
valid = true;
|
||||
}
|
||||
break;
|
||||
case Id::Blob:
|
||||
if (valid)
|
||||
{
|
||||
const Blob blob = { item.data(), item.size };
|
||||
ModernSettings::Setting s(blob);
|
||||
if (s)
|
||||
m_settings.emplace(s.fileName, blob);
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
ModernSettings::Setting::Setting(const Blob& blob)
|
||||
{
|
||||
ProcessAttributes(blob.data, blob.size, [&](const ItemHdr& item) {
|
||||
switch (item.id)
|
||||
{
|
||||
case Id::FileName:
|
||||
fileName = item.asString();
|
||||
break;
|
||||
case Id::DeepLink:
|
||||
deepLink = item.asString();
|
||||
break;
|
||||
case Id::Glyph:
|
||||
glyph = item.asString();
|
||||
break;
|
||||
case Id::Icon:
|
||||
icon = item.asString();
|
||||
break;
|
||||
case Id::PageId:
|
||||
pageId = item.asString();
|
||||
break;
|
||||
case Id::HostId:
|
||||
hostId = item.asString();
|
||||
break;
|
||||
case Id::GroupId:
|
||||
groupId = item.asString();
|
||||
break;
|
||||
case Id::SettingId:
|
||||
settingId = item.asString();
|
||||
break;
|
||||
case Id::Description:
|
||||
description = item.asString();;
|
||||
break;
|
||||
case Id::Keywords:
|
||||
keywords = item.asString();
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
std::vector<std::wstring_view> ModernSettings::enumerate() const
|
||||
{
|
||||
std::vector<std::wstring_view> retval;
|
||||
retval.reserve(m_settings.size());
|
||||
|
||||
for (const auto& i : m_settings)
|
||||
retval.emplace_back(i.first);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
ModernSettings::Setting ModernSettings::get(const std::wstring_view& name) const
|
||||
{
|
||||
auto it = m_settings.find(name);
|
||||
if (it != m_settings.end())
|
||||
return { (*it).second };
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
static std::mutex s_lock;
|
||||
static std::shared_ptr<ModernSettings> s_settings;
|
||||
|
||||
std::wstring GetLocalAppData()
|
||||
{
|
||||
WCHAR path[MAX_PATH]{};
|
||||
wcscpy_s(path, L"%LOCALAPPDATA%\\OpenShell");
|
||||
DoEnvironmentSubst(path, _countof(path));
|
||||
|
||||
// make sure directory exists
|
||||
SHCreateDirectory(nullptr, path);
|
||||
|
||||
return { path };
|
||||
}
|
||||
|
||||
std::shared_ptr<ModernSettings> GetModernSettings()
|
||||
{
|
||||
std::unique_lock l(s_lock);
|
||||
|
||||
if (!s_settings)
|
||||
{
|
||||
auto path = GetLocalAppData();
|
||||
path += L"\\ModernSettings.dat";
|
||||
|
||||
// try to open cached settings
|
||||
s_settings = std::make_shared<ModernSettings>(path.c_str());
|
||||
if (s_settings->size() == 0)
|
||||
{
|
||||
// file doesn't exist or wrong format
|
||||
s_settings.reset();
|
||||
|
||||
// re-parse settings
|
||||
auto buffer = ParseModernSettings();
|
||||
if (!buffer.empty())
|
||||
{
|
||||
// store to file
|
||||
{
|
||||
File f(path.c_str(), GENERIC_WRITE, 0, CREATE_ALWAYS);
|
||||
if (f)
|
||||
{
|
||||
DWORD written;
|
||||
::WriteFile(f, buffer.data(), (DWORD)buffer.size(), &written, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
// and try again
|
||||
s_settings = std::make_shared<ModernSettings>(path.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return s_settings;
|
||||
}
|
||||
139
Src/StartMenu/StartMenuHelper/ModernSettings.h
Normal file
@@ -0,0 +1,139 @@
|
||||
// Modern settings helper
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
struct Blob
|
||||
{
|
||||
const void* data = nullptr;
|
||||
size_t size = 0;
|
||||
};
|
||||
|
||||
class File
|
||||
{
|
||||
public:
|
||||
File(const WCHAR* fileName, DWORD desiredAccess, DWORD shareMode, DWORD creationDisposition = OPEN_EXISTING, DWORD flagsAndAttributes = FILE_ATTRIBUTE_NORMAL)
|
||||
{
|
||||
m_handle = ::CreateFile(fileName, desiredAccess, shareMode, nullptr, creationDisposition, flagsAndAttributes, nullptr);
|
||||
}
|
||||
|
||||
~File()
|
||||
{
|
||||
if (m_handle != INVALID_HANDLE_VALUE)
|
||||
::CloseHandle(m_handle);
|
||||
}
|
||||
|
||||
File(const File&) = delete;
|
||||
File& operator=(const File&) = delete;
|
||||
|
||||
explicit operator bool() const
|
||||
{
|
||||
return (m_handle != INVALID_HANDLE_VALUE);
|
||||
}
|
||||
|
||||
operator HANDLE() const
|
||||
{
|
||||
return m_handle;
|
||||
}
|
||||
|
||||
uint64_t size() const
|
||||
{
|
||||
LARGE_INTEGER li = {};
|
||||
return ::GetFileSizeEx(m_handle, &li) ? li.QuadPart : (uint64_t)-1;
|
||||
}
|
||||
|
||||
private:
|
||||
HANDLE m_handle;
|
||||
};
|
||||
|
||||
class MappedFile
|
||||
{
|
||||
public:
|
||||
MappedFile(const WCHAR* fileName) : m_file(fileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_DELETE)
|
||||
{
|
||||
if (m_file)
|
||||
{
|
||||
auto mapping = ::CreateFileMapping(m_file, nullptr, PAGE_READONLY, 0, 0, nullptr);
|
||||
if (mapping)
|
||||
{
|
||||
m_view.data = ::MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
|
||||
if (m_view.data)
|
||||
m_view.size = (size_t)m_file.size();
|
||||
|
||||
::CloseHandle(mapping);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
~MappedFile()
|
||||
{
|
||||
if (m_view.data)
|
||||
::UnmapViewOfFile(m_view.data);
|
||||
}
|
||||
|
||||
MappedFile(const MappedFile&) = delete;
|
||||
MappedFile& operator=(const MappedFile&) = delete;
|
||||
|
||||
explicit operator bool() const
|
||||
{
|
||||
return (m_view.data != nullptr);
|
||||
}
|
||||
|
||||
Blob get() const
|
||||
{
|
||||
return m_view;
|
||||
}
|
||||
|
||||
private:
|
||||
File m_file;
|
||||
Blob m_view;
|
||||
};
|
||||
|
||||
class ModernSettings
|
||||
{
|
||||
public:
|
||||
ModernSettings(const wchar_t* fname);
|
||||
|
||||
size_t size() const
|
||||
{
|
||||
return m_settings.size();
|
||||
}
|
||||
|
||||
struct Setting
|
||||
{
|
||||
std::wstring_view fileName;
|
||||
|
||||
std::wstring_view deepLink;
|
||||
std::wstring_view icon;
|
||||
std::wstring_view glyph;
|
||||
|
||||
std::wstring_view pageId;
|
||||
std::wstring_view hostId;
|
||||
std::wstring_view groupId;
|
||||
std::wstring_view settingId;
|
||||
std::wstring_view description;
|
||||
std::wstring_view keywords;
|
||||
|
||||
Setting() = default;
|
||||
Setting(const Blob& blob);
|
||||
|
||||
explicit operator bool() const
|
||||
{
|
||||
return !fileName.empty();
|
||||
}
|
||||
};
|
||||
|
||||
std::vector<std::wstring_view> enumerate() const;
|
||||
Setting get(const std::wstring_view& name) const;
|
||||
|
||||
private:
|
||||
MappedFile m_storage;
|
||||
std::map<std::wstring_view, Blob> m_settings;
|
||||
};
|
||||
|
||||
// retrieve actual instance of ModernSettings
|
||||
std::shared_ptr<ModernSettings> GetModernSettings();
|
||||
210
Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.cpp
Normal file
@@ -0,0 +1,210 @@
|
||||
// Context menu handler for Open-Shell Modern Settings shell folder
|
||||
|
||||
// Based on Explorer Data Provider Sample (https://docs.microsoft.com/en-us/windows/win32/shell/samples-explorerdataprovider)
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "ModernSettings.h"
|
||||
#include "ModernSettingsContextMenu.h"
|
||||
#include "ComHelper.h"
|
||||
|
||||
#define MENUVERB_OPEN 0
|
||||
|
||||
struct ICIVERBTOIDMAP
|
||||
{
|
||||
LPCWSTR pszCmd; // verbW
|
||||
LPCSTR pszCmdA; // verbA
|
||||
UINT idCmd; // hmenu id
|
||||
};
|
||||
|
||||
static const ICIVERBTOIDMAP g_ContextMenuIDMap[] =
|
||||
{
|
||||
{ L"open", "open", MENUVERB_OPEN },
|
||||
};
|
||||
|
||||
HRESULT _MapICIVerbToCmdID(LPCMINVOKECOMMANDINFO pici, UINT* pid)
|
||||
{
|
||||
if (IS_INTRESOURCE(pici->lpVerb))
|
||||
{
|
||||
*pid = LOWORD((UINT_PTR)pici->lpVerb);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if (pici->fMask & CMIC_MASK_UNICODE)
|
||||
{
|
||||
for (const auto& i : g_ContextMenuIDMap)
|
||||
{
|
||||
if (StrCmpIC(((LPCMINVOKECOMMANDINFOEX)pici)->lpVerbW, i.pszCmd) == 0)
|
||||
{
|
||||
*pid = i.idCmd;
|
||||
return S_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (const auto& i : g_ContextMenuIDMap)
|
||||
{
|
||||
if (StrCmpICA(pici->lpVerb, i.pszCmdA) == 0)
|
||||
{
|
||||
*pid = i.idCmd;
|
||||
return S_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
static bool ActivateModernSettingPage(const WCHAR* page)
|
||||
{
|
||||
CComPtr<IApplicationActivationManager> mgr;
|
||||
mgr.CoCreateInstance(CLSID_ApplicationActivationManager);
|
||||
if (mgr)
|
||||
{
|
||||
DWORD pid = 0;
|
||||
return SUCCEEDED(mgr->ActivateApplication(L"windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel", page, AO_NONE, &pid));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
extern ModernSettings::Setting GetModernSetting(LPCITEMIDLIST pidl);
|
||||
|
||||
static HRESULT Execute(const wchar_t* cmd)
|
||||
{
|
||||
return (intptr_t)::ShellExecute(nullptr, L"open", cmd, nullptr, nullptr, SW_SHOWNORMAL) > 32 ? S_OK : E_FAIL;
|
||||
}
|
||||
|
||||
static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl)
|
||||
{
|
||||
auto child = ILFindLastID(pidl);
|
||||
auto setting = GetModernSetting(child);
|
||||
|
||||
if (!setting)
|
||||
return E_INVALIDARG;
|
||||
|
||||
if (setting.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}")
|
||||
{
|
||||
if (setting.deepLink.empty())
|
||||
return E_INVALIDARG;
|
||||
|
||||
std::wstring cmd(L"windowsdefender://");
|
||||
cmd += setting.deepLink;
|
||||
|
||||
return Execute(cmd.c_str());
|
||||
}
|
||||
|
||||
if (setting.hostId == L"{7E0522FC-1AC4-41CA-AFD0-3610417A9C41}")
|
||||
{
|
||||
if (setting.pageId.empty())
|
||||
return E_INVALIDARG;
|
||||
|
||||
std::wstring cmd(L"shell:::");
|
||||
cmd += setting.pageId;
|
||||
|
||||
return Execute(cmd.c_str());
|
||||
}
|
||||
|
||||
if (setting.hostId == L"{12B1697E-D3A0-4DBC-B568-CCF64A3F934D}")
|
||||
{
|
||||
if (setting.deepLink.empty())
|
||||
return E_INVALIDARG;
|
||||
|
||||
std::wstring cmd(setting.deepLink);
|
||||
|
||||
if (cmd.compare(0, 8, L"shell:::") == 0)
|
||||
return Execute(cmd.c_str());
|
||||
|
||||
cmd.resize(MAX_PATH);
|
||||
DoEnvironmentSubst(cmd.data(), (UINT)cmd.size());
|
||||
|
||||
STARTUPINFO startupInfo = { sizeof(startupInfo) };
|
||||
PROCESS_INFORMATION processInfo{};
|
||||
|
||||
if (!CreateProcess(nullptr, cmd.data(), nullptr, nullptr, FALSE, 0, nullptr, nullptr, &startupInfo, &processInfo))
|
||||
return E_FAIL;
|
||||
|
||||
CloseHandle(processInfo.hThread);
|
||||
CloseHandle(processInfo.hProcess);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if (setting.pageId.empty())
|
||||
return E_INVALIDARG;
|
||||
|
||||
std::wstring page;
|
||||
|
||||
page += L"page=";
|
||||
page += setting.pageId;
|
||||
|
||||
if (!setting.settingId.empty())
|
||||
{
|
||||
page += L"&target=";
|
||||
page += setting.settingId;
|
||||
}
|
||||
else if (!setting.groupId.empty())
|
||||
{
|
||||
page += L"&group=";
|
||||
page += setting.groupId;
|
||||
}
|
||||
|
||||
page += L"&ActivationType=Search";
|
||||
|
||||
ActivateModernSettingPage(page.c_str());
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
// CModernSettingsContextMenu
|
||||
|
||||
HRESULT CModernSettingsContextMenu::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT /* idCmdLast */, UINT /* uFlags */)
|
||||
{
|
||||
InsertMenu(hmenu, indexMenu++, MF_BYPOSITION, idCmdFirst + MENUVERB_OPEN, L"Open");
|
||||
// other verbs could go here...
|
||||
|
||||
// indicate that we added one verb.
|
||||
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (USHORT)(1));
|
||||
}
|
||||
|
||||
HRESULT CModernSettingsContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO pici)
|
||||
{
|
||||
HRESULT hr = E_INVALIDARG;
|
||||
UINT uID;
|
||||
// Is this command for us?
|
||||
if (SUCCEEDED(_MapICIVerbToCmdID(pici, &uID)))
|
||||
{
|
||||
if (uID == MENUVERB_OPEN && m_pdtobj)
|
||||
{
|
||||
CAbsolutePidl pidl;
|
||||
hr = SHGetIDListFromObject(m_pdtobj, &pidl);
|
||||
if (SUCCEEDED(hr))
|
||||
hr = OpenItemByPidl(pidl);
|
||||
}
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT CModernSettingsContextMenu::GetCommandString(UINT_PTR /* idCmd */, UINT /* uType */, UINT* /* pRes */, LPSTR /* pszName */, UINT /* cchMax */)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT CModernSettingsContextMenu::Initialize(PCIDLIST_ABSOLUTE /* pidlFolder */, IDataObject* pdtobj, HKEY /* hkeyProgID */)
|
||||
{
|
||||
m_pdtobj = pdtobj;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CModernSettingsContextMenu::SetSite(IUnknown* punkSite)
|
||||
{
|
||||
m_punkSite = punkSite;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CModernSettingsContextMenu::GetSite(REFIID riid, void** ppvSite)
|
||||
{
|
||||
return m_punkSite ? m_punkSite->QueryInterface(riid, ppvSite) : E_FAIL;
|
||||
}
|
||||
60
Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.h
Normal file
@@ -0,0 +1,60 @@
|
||||
// Context menu handler for Open-Shell Modern Settings shell folder
|
||||
|
||||
#pragma once
|
||||
#include "resource.h"
|
||||
#include "StartMenuHelper_i.h"
|
||||
#include <shlobj.h>
|
||||
|
||||
// CModernSettingsContextMenu
|
||||
|
||||
class ATL_NO_VTABLE CModernSettingsContextMenu :
|
||||
public CComObjectRootEx<CComSingleThreadModel>,
|
||||
public CComCoClass<CModernSettingsContextMenu, &CLSID_ModernSettingsContextMenu>,
|
||||
public IContextMenu,
|
||||
public IShellExtInit,
|
||||
public IObjectWithSite
|
||||
{
|
||||
public:
|
||||
CModernSettingsContextMenu()
|
||||
{
|
||||
}
|
||||
|
||||
DECLARE_REGISTRY_RESOURCEID(IDR_MODERNSETTINGSCONTEXTMENU)
|
||||
|
||||
DECLARE_NOT_AGGREGATABLE(CModernSettingsContextMenu)
|
||||
|
||||
BEGIN_COM_MAP(CModernSettingsContextMenu)
|
||||
COM_INTERFACE_ENTRY(IContextMenu)
|
||||
COM_INTERFACE_ENTRY(IShellExtInit)
|
||||
COM_INTERFACE_ENTRY(IObjectWithSite)
|
||||
END_COM_MAP()
|
||||
|
||||
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
||||
|
||||
HRESULT FinalConstruct()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
void FinalRelease()
|
||||
{
|
||||
}
|
||||
|
||||
// IContextMenu
|
||||
IFACEMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
|
||||
IFACEMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
|
||||
IFACEMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType, UINT* pRes, LPSTR pszName, UINT cchMax);
|
||||
|
||||
// IShellExtInit
|
||||
IFACEMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hkeyProgID);
|
||||
|
||||
// IObjectWithSite
|
||||
IFACEMETHODIMP SetSite(IUnknown* punkSite);
|
||||
IFACEMETHODIMP GetSite(REFIID riid, void** ppvSite);
|
||||
|
||||
private:
|
||||
CComPtr<IDataObject> m_pdtobj;
|
||||
CComPtr<IUnknown> m_punkSite;
|
||||
};
|
||||
|
||||
OBJECT_ENTRY_AUTO(__uuidof(ModernSettingsContextMenu), CModernSettingsContextMenu)
|
||||
19
Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.rgs
Normal file
@@ -0,0 +1,19 @@
|
||||
HKCR
|
||||
{
|
||||
NoRemove CLSID
|
||||
{
|
||||
ForceRemove {5ab14324-c087-42c1-b905-a0bfdb4e9532} = s 'Open-Shell Modern Settings Context Menu'
|
||||
{
|
||||
InprocServer32 = s '%MODULE%'
|
||||
{
|
||||
val ThreadingModel = s 'Apartment'
|
||||
}
|
||||
ShellEx
|
||||
{
|
||||
MayChangeDefaultMenu = s ''
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
593
Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp
Normal file
@@ -0,0 +1,593 @@
|
||||
// Open-Shell Modern Settings shell folder
|
||||
// Provides folder that contains all modern settings
|
||||
//
|
||||
// To open the folder press Win+R and type:
|
||||
// shell:::{82E749ED-B971-4550-BAF7-06AA2BF7E836}
|
||||
|
||||
// Based on Explorer Data Provider Sample (https://docs.microsoft.com/en-us/windows/win32/shell/samples-explorerdataprovider)
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "ModernSettings.h"
|
||||
#include "ModernSettingsShellFolder.h"
|
||||
#include <propkey.h>
|
||||
#include <strsafe.h>
|
||||
#include <Uxtheme.h>
|
||||
|
||||
struct ColumnDescription
|
||||
{
|
||||
const wchar_t* name;
|
||||
PROPERTYKEY key;
|
||||
};
|
||||
|
||||
static const ColumnDescription g_columnDescriptions[] =
|
||||
{
|
||||
{L"Name", PKEY_ItemNameDisplay},
|
||||
{L"Keywords", PKEY_Keywords},
|
||||
{L"Filename", PKEY_FileName},
|
||||
};
|
||||
|
||||
#define MAGIC 'SMSO'
|
||||
|
||||
#pragma pack(1)
|
||||
struct FVITEMID
|
||||
{
|
||||
USHORT cb;
|
||||
DWORD magic;
|
||||
WORD size;
|
||||
wchar_t data[1];
|
||||
};
|
||||
#pragma pack()
|
||||
|
||||
static const FVITEMID* PidlToItem(LPCITEMIDLIST pidl)
|
||||
{
|
||||
if (pidl)
|
||||
{
|
||||
auto item = (const FVITEMID*)pidl;
|
||||
if (item->cb && item->magic == MAGIC)
|
||||
return item;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ModernSettings::Setting GetModernSetting(LPCITEMIDLIST pidl)
|
||||
{
|
||||
auto item = PidlToItem(pidl);
|
||||
if (item)
|
||||
{
|
||||
auto settings = GetModernSettings();
|
||||
if (settings)
|
||||
return settings->get({ item->data, item->size / sizeof(wchar_t) });
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
STDAPI StringToStrRet(PCWSTR pszName, STRRET* pStrRet)
|
||||
{
|
||||
pStrRet->uType = STRRET_WSTR;
|
||||
return SHStrDup(pszName, &pStrRet->pOleStr);
|
||||
}
|
||||
|
||||
// CModernSettingsShellFolderEnumIDList
|
||||
|
||||
class ATL_NO_VTABLE CModernSettingsShellFolderEnumIDList :
|
||||
public CComObjectRoot,
|
||||
public IEnumIDList
|
||||
{
|
||||
public:
|
||||
BEGIN_COM_MAP(CModernSettingsShellFolderEnumIDList)
|
||||
COM_INTERFACE_ENTRY(IEnumIDList)
|
||||
END_COM_MAP()
|
||||
|
||||
// IEnumIDList
|
||||
IFACEMETHODIMP Next(ULONG celt, PITEMID_CHILD* rgelt, ULONG* pceltFetched)
|
||||
{
|
||||
ULONG celtFetched = 0;
|
||||
|
||||
HRESULT hr = (pceltFetched || celt <= 1) ? S_OK : E_INVALIDARG;
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
ULONG i = 0;
|
||||
while (SUCCEEDED(hr) && i < celt && m_item < m_items.size())
|
||||
{
|
||||
hr = m_parent->CreateChildID(m_items[m_item], &rgelt[i]);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
celtFetched++;
|
||||
i++;
|
||||
}
|
||||
|
||||
m_item++;
|
||||
}
|
||||
}
|
||||
|
||||
if (pceltFetched)
|
||||
*pceltFetched = celtFetched;
|
||||
|
||||
return (celtFetched == celt) ? S_OK : S_FALSE;
|
||||
}
|
||||
IFACEMETHODIMP Skip(DWORD celt)
|
||||
{
|
||||
m_item += celt;
|
||||
return S_OK;
|
||||
}
|
||||
IFACEMETHODIMP Reset()
|
||||
{
|
||||
m_item = 0;
|
||||
return S_OK;
|
||||
}
|
||||
IFACEMETHODIMP Clone(IEnumIDList** ppenum)
|
||||
{
|
||||
// this method is rarely used and it's acceptable to not implement it.
|
||||
*ppenum = NULL;
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
void Initialize(CModernSettingsShellFolder* parent)
|
||||
{
|
||||
m_parent = parent;
|
||||
|
||||
m_settings = GetModernSettings();
|
||||
if (m_settings)
|
||||
m_items = m_settings->enumerate();
|
||||
}
|
||||
|
||||
private:
|
||||
CComPtr<CModernSettingsShellFolder> m_parent;
|
||||
std::shared_ptr<ModernSettings> m_settings;
|
||||
std::vector<std::wstring_view> m_items;
|
||||
DWORD m_item = 0;
|
||||
};
|
||||
|
||||
// Extract icon
|
||||
|
||||
static void BitmapDataToStraightAlpha(void* bits, UINT width, UINT height)
|
||||
{
|
||||
RGBQUAD* data = (RGBQUAD*)bits;
|
||||
for (UINT y = 0; y < height; y++)
|
||||
{
|
||||
for (UINT x = 0; x < width; x++)
|
||||
{
|
||||
auto alpha = data->rgbReserved;
|
||||
if (alpha)
|
||||
{
|
||||
data->rgbBlue = (BYTE)((DWORD)data->rgbBlue * 255 / alpha);
|
||||
data->rgbGreen = (BYTE)((DWORD)data->rgbGreen * 255 / alpha);
|
||||
data->rgbRed = (BYTE)((DWORD)data->rgbRed * 255 / alpha);
|
||||
}
|
||||
data++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HICON IconFromGlyph(UINT glyph, UINT size)
|
||||
{
|
||||
ICONINFO info{};
|
||||
|
||||
info.fIcon = TRUE;
|
||||
info.hbmMask = CreateBitmap(size, size, 1, 1, nullptr);
|
||||
|
||||
BITMAPINFO bi{};
|
||||
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
|
||||
bi.bmiHeader.biWidth = size;
|
||||
bi.bmiHeader.biHeight = -((LONG)size);
|
||||
bi.bmiHeader.biPlanes = 1;
|
||||
bi.bmiHeader.biBitCount = 32;
|
||||
|
||||
void* bits = nullptr;
|
||||
info.hbmColor = CreateDIBSection(nullptr, &bi, 0, &bits, nullptr, 0);
|
||||
|
||||
HDC dc = CreateCompatibleDC(nullptr);
|
||||
SelectObject(dc, info.hbmColor);
|
||||
|
||||
HFONT font = CreateFontW(size, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, L"Segoe MDL2 Assets");
|
||||
SelectObject(dc, font);
|
||||
|
||||
RECT rc{};
|
||||
rc.right = size;
|
||||
rc.bottom = size;
|
||||
|
||||
auto theme = OpenThemeData(nullptr, L"CompositedWindow::Window");
|
||||
DTTOPTS opts{};
|
||||
opts.dwSize = sizeof(opts);
|
||||
opts.dwFlags = DTT_TEXTCOLOR | DTT_COMPOSITED;
|
||||
opts.crText = 0x00FFFFFF;
|
||||
DrawThemeTextEx(theme, dc, 0, 0, (LPCWSTR)&glyph, 1, DT_CENTER | DT_VCENTER | DT_SINGLELINE, &rc, &opts);
|
||||
CloseThemeData(theme);
|
||||
|
||||
DeleteObject(font);
|
||||
DeleteDC(dc);
|
||||
|
||||
BitmapDataToStraightAlpha(bits, size, size);
|
||||
|
||||
HICON retval = CreateIconIndirect(&info);
|
||||
|
||||
DeleteObject(info.hbmColor);
|
||||
DeleteObject(info.hbmMask);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
class ATL_NO_VTABLE GlyphExtractIcon :
|
||||
public CComObjectRoot,
|
||||
public IExtractIconW
|
||||
{
|
||||
public:
|
||||
|
||||
BEGIN_COM_MAP(GlyphExtractIcon)
|
||||
COM_INTERFACE_ENTRY(IExtractIconW)
|
||||
END_COM_MAP()
|
||||
|
||||
void SetGlyph(USHORT glyph)
|
||||
{
|
||||
m_glyph = glyph;
|
||||
}
|
||||
|
||||
// IExtractIconW methods
|
||||
IFACEMETHODIMP GetIconLocation(UINT uFlags, _Out_writes_(cchMax) PWSTR pszIconFile, UINT cchMax, _Out_ int* piIndex, _Out_ UINT* pwFlags)
|
||||
{
|
||||
StringCchCopy(pszIconFile, cchMax, L"OpenShell-ModernSettingIcon");
|
||||
*piIndex = m_glyph;
|
||||
*pwFlags = GIL_NOTFILENAME;
|
||||
return S_OK;
|
||||
}
|
||||
IFACEMETHODIMP Extract(_In_ PCWSTR pszFile, UINT nIconIndex, _Out_opt_ HICON* phiconLarge, _Out_opt_ HICON* phiconSmall, UINT nIconSize)
|
||||
{
|
||||
if (phiconLarge)
|
||||
*phiconLarge = IconFromGlyph(nIconIndex, LOWORD(nIconSize));
|
||||
if (phiconSmall)
|
||||
*phiconSmall = IconFromGlyph(nIconIndex, HIWORD(nIconSize));
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
USHORT m_glyph = 0;
|
||||
};
|
||||
|
||||
|
||||
// CModernSettingsShellFolder
|
||||
|
||||
// IShellFolder methods
|
||||
|
||||
// Translates a display name into an item identifier list.
|
||||
HRESULT CModernSettingsShellFolder::ParseDisplayName(HWND hwnd, IBindCtx* pbc, PWSTR pszName, ULONG* pchEaten, PIDLIST_RELATIVE* ppidl, ULONG* pdwAttributes)
|
||||
{
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
// Allows a client to determine the contents of a folder by
|
||||
// creating an item identifier enumeration object and returning
|
||||
// its IEnumIDList interface. The methods supported by that
|
||||
// interface can then be used to enumerate the folder's contents.
|
||||
HRESULT CModernSettingsShellFolder::EnumObjects(HWND /* hwnd */, DWORD grfFlags, IEnumIDList** ppenumIDList)
|
||||
{
|
||||
CComObject<CModernSettingsShellFolderEnumIDList>* enumIdList;
|
||||
auto hr = CComObject<CModernSettingsShellFolderEnumIDList>::CreateInstance(&enumIdList);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
enumIdList->Initialize(this);
|
||||
hr = enumIdList->QueryInterface(IID_PPV_ARGS(ppenumIDList));
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
// Factory for handlers for the specified item.
|
||||
HRESULT CModernSettingsShellFolder::BindToObject(PCUIDLIST_RELATIVE pidl, IBindCtx* pbc, REFIID riid, void** ppv)
|
||||
{
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
HRESULT CModernSettingsShellFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, IBindCtx* pbc, REFIID riid, void** ppv)
|
||||
{
|
||||
return BindToObject(pidl, pbc, riid, ppv);
|
||||
}
|
||||
|
||||
// Called to determine the equivalence and/or sort order of two idlists.
|
||||
HRESULT CModernSettingsShellFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
|
||||
{
|
||||
UINT column = LOWORD(lParam);
|
||||
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (USHORT)(StrCmp(GetColumnDisplayName(pidl1, column).data(), GetColumnDisplayName(pidl2, column).data())));
|
||||
}
|
||||
|
||||
// Called by the Shell to create the View Object and return it.
|
||||
HRESULT CModernSettingsShellFolder::CreateViewObject(HWND hwnd, REFIID riid, void** ppv)
|
||||
{
|
||||
HRESULT hr = E_NOINTERFACE;
|
||||
*ppv = NULL;
|
||||
|
||||
if (riid == IID_IShellView)
|
||||
{
|
||||
SFV_CREATE csfv = { sizeof(csfv), 0 };
|
||||
hr = QueryInterface(IID_PPV_ARGS(&csfv.pshf));
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = SHCreateShellFolderView(&csfv, (IShellView**)ppv);
|
||||
csfv.pshf->Release();
|
||||
}
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
// Retrieves the attributes of one or more file objects or subfolders.
|
||||
HRESULT CModernSettingsShellFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, ULONG* rgfInOut)
|
||||
{
|
||||
*rgfInOut &= SFGAO_CANLINK;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
// Retrieves an OLE interface that can be used to carry out
|
||||
// actions on the specified file objects or folders.
|
||||
HRESULT CModernSettingsShellFolder::GetUIObjectOf(HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT* /* prgfInOut */, void** ppv)
|
||||
{
|
||||
HRESULT hr = E_NOINTERFACE;
|
||||
*ppv = nullptr;
|
||||
|
||||
if (riid == IID_IContextMenu)
|
||||
{
|
||||
// The default context menu will call back for IQueryAssociations to determine the
|
||||
// file associations with which to populate the menu.
|
||||
const DEFCONTEXTMENU dcm = { hwnd, nullptr, m_pidl, static_cast<IShellFolder2*>(this), cidl, apidl, nullptr, 0, nullptr };
|
||||
hr = SHCreateDefaultContextMenu(&dcm, riid, ppv);
|
||||
}
|
||||
else if (riid == IID_IExtractIconW)
|
||||
{
|
||||
hr = E_INVALIDARG;
|
||||
|
||||
auto s = GetModernSetting(*apidl);
|
||||
if (s)
|
||||
{
|
||||
if (!s.icon.empty())
|
||||
{
|
||||
CComPtr<IDefaultExtractIconInit> pdxi;
|
||||
hr = SHCreateDefaultExtractIcon(IID_PPV_ARGS(&pdxi));
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
WCHAR icon_path[MAX_PATH];
|
||||
|
||||
StringCchCopy(icon_path, _countof(icon_path), s.icon.data());
|
||||
auto location = PathParseIconLocation(icon_path);
|
||||
|
||||
hr = pdxi->SetNormalIcon(icon_path, location);
|
||||
if (SUCCEEDED(hr))
|
||||
hr = pdxi->QueryInterface(riid, ppv);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
auto glyph = !s.glyph.empty() ? s.glyph.front() : 0xe115;
|
||||
|
||||
CComObject<GlyphExtractIcon>* extract;
|
||||
hr = CComObject<GlyphExtractIcon>::CreateInstance(&extract);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
extract->SetGlyph(glyph);
|
||||
hr = extract->QueryInterface(riid, ppv);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (riid == IID_IDataObject)
|
||||
{
|
||||
hr = SHCreateDataObject(m_pidl, cidl, apidl, nullptr, riid, ppv);
|
||||
}
|
||||
else if (riid == IID_IQueryAssociations)
|
||||
{
|
||||
WCHAR szFolderViewImplClassID[64];
|
||||
hr = StringFromGUID2(CLSID_ModernSettingsShellFolder, szFolderViewImplClassID, ARRAYSIZE(szFolderViewImplClassID));
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
const ASSOCIATIONELEMENT assocItem = { ASSOCCLASS_CLSID_STR, nullptr, szFolderViewImplClassID };
|
||||
hr = AssocCreateForClasses(&assocItem, 1, riid, ppv);
|
||||
}
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
// Retrieves the display name for the specified file object or subfolder.
|
||||
HRESULT CModernSettingsShellFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, SHGDNF shgdnFlags, STRRET* pName)
|
||||
{
|
||||
auto setting = GetModernSetting(pidl);
|
||||
if (!setting)
|
||||
return E_INVALIDARG;
|
||||
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
if (shgdnFlags & SHGDN_FORPARSING)
|
||||
{
|
||||
if (shgdnFlags & SHGDN_INFOLDER)
|
||||
{
|
||||
// This form of the display name needs to be handled by ParseDisplayName.
|
||||
hr = StringToStrRet(setting.fileName.data(), pName);
|
||||
}
|
||||
else
|
||||
{
|
||||
WCHAR szDisplayName[MAX_PATH];
|
||||
CComString pszThisFolder;
|
||||
hr = SHGetNameFromIDList(m_pidl, (shgdnFlags & SHGDN_FORADDRESSBAR) ? SIGDN_DESKTOPABSOLUTEEDITING : SIGDN_DESKTOPABSOLUTEPARSING, &pszThisFolder);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
StringCchCopy(szDisplayName, ARRAYSIZE(szDisplayName), pszThisFolder);
|
||||
StringCchCat(szDisplayName, ARRAYSIZE(szDisplayName), L"\\");
|
||||
StringCchCat(szDisplayName, ARRAYSIZE(szDisplayName), setting.fileName.data());
|
||||
|
||||
hr = StringToStrRet(szDisplayName, pName);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = StringToStrRet(setting.description.data(), pName);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
// Sets the display name of a file object or subfolder, changing the item identifier in the process.
|
||||
HRESULT CModernSettingsShellFolder::SetNameOf(HWND /* hwnd */, PCUITEMID_CHILD /* pidl */, PCWSTR /* pszName */, DWORD /* uFlags */, PITEMID_CHILD* ppidlOut)
|
||||
{
|
||||
*ppidlOut = NULL;
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
// IShellFolder2 methods
|
||||
|
||||
// Requests the GUID of the default search object for the folder.
|
||||
HRESULT CModernSettingsShellFolder::GetDefaultSearchGUID(GUID* /* pguid */)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT CModernSettingsShellFolder::EnumSearches(IEnumExtraSearch** ppEnum)
|
||||
{
|
||||
*ppEnum = NULL;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
// Retrieves the default sorting and display column (indices from GetDetailsOf).
|
||||
HRESULT CModernSettingsShellFolder::GetDefaultColumn(DWORD /* dwRes */, ULONG* pSort, ULONG* pDisplay)
|
||||
{
|
||||
*pSort = 0;
|
||||
*pDisplay = 0;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
// Retrieves the default state for a specified column.
|
||||
HRESULT CModernSettingsShellFolder::GetDefaultColumnState(UINT iColumn, SHCOLSTATEF* pcsFlags)
|
||||
{
|
||||
if (iColumn < _countof(g_columnDescriptions))
|
||||
{
|
||||
*pcsFlags = SHCOLSTATE_ONBYDEFAULT | SHCOLSTATE_TYPE_STR;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
// Retrieves detailed information, identified by a property set ID (FMTID) and property ID (PID), on an item in a Shell folder.
|
||||
HRESULT CModernSettingsShellFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const PROPERTYKEY* pkey, VARIANT* pv)
|
||||
{
|
||||
for (const auto& desc : g_columnDescriptions)
|
||||
{
|
||||
if (IsEqualPropertyKey(*pkey, desc.key))
|
||||
{
|
||||
auto str = GetColumnDisplayName(pidl, (UINT)std::distance(g_columnDescriptions, &desc));
|
||||
|
||||
pv->vt = VT_BSTR;
|
||||
pv->bstrVal = SysAllocString(str.data());
|
||||
return pv->bstrVal ? S_OK : E_OUTOFMEMORY;
|
||||
}
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
// Retrieves detailed information, identified by a column index, on an item in a Shell folder.
|
||||
HRESULT CModernSettingsShellFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS* pDetails)
|
||||
{
|
||||
pDetails->cxChar = 24;
|
||||
|
||||
if (!pidl)
|
||||
{
|
||||
// No item means we're returning information about the column itself.
|
||||
|
||||
if (iColumn >= _countof(g_columnDescriptions))
|
||||
{
|
||||
// GetDetailsOf is called with increasing column indices until failure.
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
pDetails->fmt = LVCFMT_LEFT;
|
||||
return StringToStrRet(g_columnDescriptions[iColumn].name, &pDetails->str);
|
||||
}
|
||||
|
||||
auto str = GetColumnDisplayName(pidl, iColumn);
|
||||
return StringToStrRet(str.data(), &pDetails->str);
|
||||
}
|
||||
|
||||
// Converts a column name to the appropriate property set ID (FMTID) and property ID (PID).
|
||||
HRESULT CModernSettingsShellFolder::MapColumnToSCID(UINT iColumn, PROPERTYKEY* pkey)
|
||||
{
|
||||
if (iColumn < _countof(g_columnDescriptions))
|
||||
{
|
||||
*pkey = g_columnDescriptions[iColumn].key;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
// IPersist method
|
||||
HRESULT CModernSettingsShellFolder::GetClassID(CLSID* pClassID)
|
||||
{
|
||||
*pClassID = CLSID_ModernSettingsShellFolder;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
// IPersistFolder method
|
||||
HRESULT CModernSettingsShellFolder::Initialize(PCIDLIST_ABSOLUTE pidl)
|
||||
{
|
||||
m_pidl = pidl;
|
||||
return m_pidl ? S_OK : E_FAIL;
|
||||
}
|
||||
|
||||
// IPersistFolder2 methods
|
||||
// Retrieves the PIDLIST_ABSOLUTE for the folder object.
|
||||
HRESULT CModernSettingsShellFolder::GetCurFolder(PIDLIST_ABSOLUTE* ppidl)
|
||||
{
|
||||
*ppidl = NULL;
|
||||
HRESULT hr = m_pidl ? S_OK : E_FAIL;
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
*ppidl = ILCloneFull(m_pidl);
|
||||
hr = *ppidl ? S_OK : E_OUTOFMEMORY;
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT CModernSettingsShellFolder::CreateChildID(const std::wstring_view& fileName, PITEMID_CHILD* ppidl)
|
||||
{
|
||||
auto size = fileName.size() * sizeof(wchar_t);
|
||||
|
||||
// Sizeof an object plus the next cb plus the characters in the string.
|
||||
UINT nIDSize = sizeof(FVITEMID) + sizeof(USHORT) + (WORD)size;
|
||||
|
||||
// Allocate and zero the memory.
|
||||
FVITEMID* lpMyObj = (FVITEMID*)CoTaskMemAlloc(nIDSize);
|
||||
|
||||
HRESULT hr = lpMyObj ? S_OK : E_OUTOFMEMORY;
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
ZeroMemory(lpMyObj, nIDSize);
|
||||
lpMyObj->cb = static_cast<short>(nIDSize - sizeof(lpMyObj->cb));
|
||||
lpMyObj->magic = MAGIC;
|
||||
lpMyObj->size = (WORD)size;
|
||||
memcpy(lpMyObj->data, fileName.data(), size);
|
||||
|
||||
*ppidl = (PITEMID_CHILD)lpMyObj;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
std::wstring_view CModernSettingsShellFolder::GetColumnDisplayName(PCUITEMID_CHILD pidl, UINT iColumn)
|
||||
{
|
||||
auto setting = GetModernSetting(pidl);
|
||||
if (setting)
|
||||
{
|
||||
switch (iColumn)
|
||||
{
|
||||
case 0:
|
||||
return setting.description;
|
||||
case 1:
|
||||
return setting.keywords;
|
||||
case 2:
|
||||
return setting.fileName;
|
||||
}
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
85
Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.h
Normal file
@@ -0,0 +1,85 @@
|
||||
// Open-Shell Modern Settings shell folder
|
||||
// Provides folder that contains all modern settings
|
||||
|
||||
#pragma once
|
||||
#include "resource.h"
|
||||
#include "ComHelper.h"
|
||||
#include "StartMenuHelper_i.h"
|
||||
#include <shlobj.h>
|
||||
#include <string>
|
||||
|
||||
// CModernSettingsShellFolder
|
||||
|
||||
class ATL_NO_VTABLE CModernSettingsShellFolder :
|
||||
public CComObjectRootEx<CComSingleThreadModel>,
|
||||
public CComCoClass<CModernSettingsShellFolder, &CLSID_ModernSettingsShellFolder>,
|
||||
public IShellFolder2,
|
||||
public IPersistFolder2
|
||||
{
|
||||
public:
|
||||
CModernSettingsShellFolder()
|
||||
{
|
||||
}
|
||||
|
||||
DECLARE_REGISTRY_RESOURCEID(IDR_MODERNSETTINGSSHELLFOLDER)
|
||||
|
||||
DECLARE_NOT_AGGREGATABLE(CModernSettingsShellFolder)
|
||||
|
||||
BEGIN_COM_MAP(CModernSettingsShellFolder)
|
||||
COM_INTERFACE_ENTRY(IShellFolder)
|
||||
COM_INTERFACE_ENTRY(IShellFolder2)
|
||||
COM_INTERFACE_ENTRY(IPersist)
|
||||
COM_INTERFACE_ENTRY(IPersistFolder)
|
||||
COM_INTERFACE_ENTRY(IPersistFolder2)
|
||||
END_COM_MAP()
|
||||
|
||||
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
||||
|
||||
HRESULT FinalConstruct()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
void FinalRelease()
|
||||
{
|
||||
}
|
||||
|
||||
// IShellFolder
|
||||
IFACEMETHODIMP ParseDisplayName(HWND hwnd, IBindCtx* pbc, PWSTR pszName, ULONG* pchEaten, PIDLIST_RELATIVE* ppidl, ULONG* pdwAttributes);
|
||||
IFACEMETHODIMP EnumObjects(HWND hwnd, DWORD grfFlags, IEnumIDList** ppenumIDList);
|
||||
IFACEMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, IBindCtx* pbc, REFIID riid, void** ppv);
|
||||
IFACEMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, IBindCtx* pbc, REFIID riid, void** ppv);
|
||||
IFACEMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2);
|
||||
IFACEMETHODIMP CreateViewObject(HWND hwnd, REFIID riid, void** ppv);
|
||||
IFACEMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, ULONG* rgfInOut);
|
||||
IFACEMETHODIMP GetUIObjectOf(HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT* prgfInOut, void** ppv);
|
||||
IFACEMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, SHGDNF shgdnFlags, STRRET* pName);
|
||||
IFACEMETHODIMP SetNameOf(HWND hwnd, PCUITEMID_CHILD pidl, PCWSTR pszName, DWORD uFlags, PITEMID_CHILD* ppidlOut);
|
||||
|
||||
// IShellFolder2
|
||||
IFACEMETHODIMP GetDefaultSearchGUID(GUID* pGuid);
|
||||
IFACEMETHODIMP EnumSearches(IEnumExtraSearch** ppenum);
|
||||
IFACEMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG* pSort, ULONG* pDisplay);
|
||||
IFACEMETHODIMP GetDefaultColumnState(UINT iColumn, SHCOLSTATEF* pbState);
|
||||
IFACEMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const PROPERTYKEY* pkey, VARIANT* pv);
|
||||
IFACEMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS* pDetails);
|
||||
IFACEMETHODIMP MapColumnToSCID(UINT iColumn, PROPERTYKEY* pkey);
|
||||
|
||||
// IPersist
|
||||
IFACEMETHODIMP GetClassID(CLSID* pClassID);
|
||||
|
||||
// IPersistFolder
|
||||
IFACEMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidl);
|
||||
|
||||
// IPersistFolder2
|
||||
IFACEMETHODIMP GetCurFolder(PIDLIST_ABSOLUTE* ppidl);
|
||||
|
||||
HRESULT CreateChildID(const std::wstring_view& fileName, PITEMID_CHILD* ppidl);
|
||||
|
||||
private:
|
||||
std::wstring_view GetColumnDisplayName(PCUITEMID_CHILD pidl, UINT iColumn);
|
||||
|
||||
CAbsolutePidl m_pidl; // where this folder is in the name space
|
||||
};
|
||||
|
||||
OBJECT_ENTRY_AUTO(__uuidof(ModernSettingsShellFolder), CModernSettingsShellFolder)
|
||||
26
Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.rgs
Normal file
@@ -0,0 +1,26 @@
|
||||
HKCR
|
||||
{
|
||||
NoRemove CLSID
|
||||
{
|
||||
ForceRemove {82e749ed-b971-4550-baf7-06aa2bf7e836} = s 'Open-Shell Modern Settings'
|
||||
{
|
||||
InprocServer32 = s '%MODULE%'
|
||||
{
|
||||
val ThreadingModel = s 'Apartment'
|
||||
}
|
||||
ShellFolder
|
||||
{
|
||||
val Attributes = d '&HA0000000'
|
||||
}
|
||||
ShellEx
|
||||
{
|
||||
ContextMenuHandlers
|
||||
{
|
||||
Default = s '{5ab14324-c087-42c1-b905-a0bfdb4e9532}'
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,8 @@ const CLSID g_ExplorerClsid= {0xECD4FC4D, 0x521C, 0x11D0, {0xB7, 0x92, 0x00, 0xA
|
||||
const CLSID g_EmulationClsid= {0xD3214FBB, 0x3CA1, 0x406A, {0xB3, 0xE8, 0x3E, 0xB7, 0xC3, 0x93, 0xA1, 0x5E}};
|
||||
#define EMULATION_KEY L"TreatAs"
|
||||
|
||||
#define SHELLEXT_NAME L"StartMenuExt"
|
||||
|
||||
static void AdjustPrivileges( void )
|
||||
{
|
||||
HANDLE hToken;
|
||||
@@ -46,6 +48,18 @@ static void AdjustPrivileges( void )
|
||||
}
|
||||
}
|
||||
|
||||
static void AddShellExt(const wchar_t* progID, const LPSECURITY_ATTRIBUTES sa)
|
||||
{
|
||||
HKEY hkey = NULL;
|
||||
|
||||
if (RegCreateKeyEx(HKEY_CLASSES_ROOT, CString(progID) + L"\\ShellEx\\ContextMenuHandlers\\" SHELLEXT_NAME, NULL, NULL, REG_OPTION_BACKUP_RESTORE, KEY_WRITE, sa, &hkey, NULL) == ERROR_SUCCESS)
|
||||
{
|
||||
wchar_t val[] = L"{E595F05F-903F-4318-8B0A-7F633B520D2B}";
|
||||
RegSetValueEx(hkey, NULL, NULL, REG_SZ, (BYTE*)val, sizeof(val));
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
}
|
||||
|
||||
static void AddRegistryKeys( bool bPin )
|
||||
{
|
||||
AdjustPrivileges();
|
||||
@@ -103,21 +117,12 @@ static void AddRegistryKeys( bool bPin )
|
||||
RegSetValueEx(hkey,NULL,NULL,REG_SZ,(BYTE*)val,sizeof(val));
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
hkey=NULL;
|
||||
|
||||
if (bPin)
|
||||
{
|
||||
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,L"Launcher.ImmersiveApplication\\ShellEx\\ContextMenuHandlers\\StartMenuExt",NULL,NULL,REG_OPTION_BACKUP_RESTORE,KEY_WRITE,&sa,&hkey,NULL)==ERROR_SUCCESS)
|
||||
{
|
||||
wchar_t val[]=L"{E595F05F-903F-4318-8B0A-7F633B520D2B}";
|
||||
RegSetValueEx(hkey,NULL,NULL,REG_SZ,(BYTE*)val,sizeof(val));
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,L"Launcher.SystemSettings\\ShellEx\\ContextMenuHandlers\\StartMenuExt",NULL,NULL,REG_OPTION_BACKUP_RESTORE,KEY_WRITE,&sa,&hkey,NULL)==ERROR_SUCCESS)
|
||||
{
|
||||
wchar_t val[]=L"{E595F05F-903F-4318-8B0A-7F633B520D2B}";
|
||||
RegSetValueEx(hkey,NULL,NULL,REG_SZ,(BYTE*)val,sizeof(val));
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
AddShellExt(L"Launcher.ImmersiveApplication", &sa);
|
||||
AddShellExt(L"Launcher.DesktopPackagedApplication", &sa);
|
||||
AddShellExt(L"Launcher.SystemSettings", &sa);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -127,6 +132,16 @@ static void AddRegistryKeys( bool bPin )
|
||||
FreeSid(pAdminSID);
|
||||
}
|
||||
|
||||
static void RemoveShellExt(const wchar_t* progID)
|
||||
{
|
||||
HKEY hkey = NULL;
|
||||
if (RegCreateKeyEx(HKEY_CLASSES_ROOT, CString(progID) + L"\\ShellEx\\ContextMenuHandlers", NULL, NULL, REG_OPTION_BACKUP_RESTORE, KEY_WRITE | DELETE, NULL, &hkey, NULL) == ERROR_SUCCESS)
|
||||
{
|
||||
RegDeleteTree(hkey, SHELLEXT_NAME);
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
}
|
||||
|
||||
static void RemoveRegistryKeys( bool bPin )
|
||||
{
|
||||
AdjustPrivileges();
|
||||
@@ -136,19 +151,12 @@ static void RemoveRegistryKeys( bool bPin )
|
||||
RegDeleteTree(hkey,EMULATION_KEY);
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
hkey=NULL;
|
||||
|
||||
if (bPin)
|
||||
{
|
||||
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,L"Launcher.ImmersiveApplication\\ShellEx\\ContextMenuHandlers",NULL,NULL,REG_OPTION_BACKUP_RESTORE,KEY_WRITE|DELETE,NULL,&hkey,NULL)==ERROR_SUCCESS)
|
||||
{
|
||||
RegDeleteTree(hkey,L"StartMenuExt");
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,L"Launcher.SystemSettings\\ShellEx\\ContextMenuHandlers",NULL,NULL,REG_OPTION_BACKUP_RESTORE,KEY_WRITE|DELETE,NULL,&hkey,NULL)==ERROR_SUCCESS)
|
||||
{
|
||||
RegDeleteTree(hkey,L"StartMenuExt");
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
RemoveShellExt(L"Launcher.ImmersiveApplication");
|
||||
RemoveShellExt(L"Launcher.DesktopPackagedApplication");
|
||||
RemoveShellExt(L"Launcher.SystemSettings");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
import "oaidl.idl";
|
||||
import "ocidl.idl";
|
||||
import "shobjidl.idl";
|
||||
|
||||
[
|
||||
object,
|
||||
@@ -31,4 +32,21 @@ library StartMenuHelperLib
|
||||
{
|
||||
[default] interface IStartMenuExt;
|
||||
};
|
||||
[
|
||||
uuid(82e749ed-b971-4550-baf7-06aa2bf7e836)
|
||||
]
|
||||
coclass ModernSettingsShellFolder
|
||||
{
|
||||
interface IShellFolder2;
|
||||
interface IPersistFolder2;
|
||||
};
|
||||
[
|
||||
uuid(5ab14324-c087-42c1-b905-a0bfdb4e9532)
|
||||
]
|
||||
coclass ModernSettingsContextMenu
|
||||
{
|
||||
interface IContextMenu;
|
||||
interface IShellExtInit;
|
||||
interface IObjectWithSite;
|
||||
};
|
||||
};
|
||||
|
||||