https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7eb90143f8bd4af34f494…
commit 7eb90143f8bd4af34f49437e456293cd67bd39f6
Author: Oleg Dubinskiy <oleg.dubinskij2013(a)yandex.ua>
AuthorDate: Sun Sep 20 20:19:59 2020 +0300
Commit: GitHub <noreply(a)github.com>
CommitDate: Sun Sep 20 19:19:59 2020 +0200
[RAPPS] Display custom applications icons for installed applications CORE-17257
(#3144)
* [RAPPS] Display custom applications icons for installed applications
- Implement `RetrieveIcon` helper function in `CInstalledApplicationInfo` class, which
retrueves the current app's icon from registry, same as it done for
`CAvailableApplicationInfo`.
- Use it for loading the icon in `CAppsListView::AddInstalledApplication` function,
via `ExtractIconW`. Load default Rapps icon only when the app has no its custom icon.
- Retrieve `DisplayIcon` value from registry in `CInstalledApps::Enum` function, same
as other registry values (like app name, description, etc).Store it in `szDisplayIcon`
string, which is used in `CInstalledApplicationInfo::RetrieveIcon` for retrieving the data
of that value.
- Increase `LISTVIEW_ICON_SIZE` macro from 24 to 32, so 32x32 icon size is now used
instead of 24x24. This makes displayed icons more accurate, since most of apps contain
32x32 icon, so they look a bit distorted with 24x24 size.
---
base/applications/rapps/appview.cpp | 22 ++++++++++++++++++++--
base/applications/rapps/include/appview.h | 2 +-
base/applications/rapps/include/installed.h | 2 ++
base/applications/rapps/installed.cpp | 11 +++++++++++
4 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/base/applications/rapps/appview.cpp b/base/applications/rapps/appview.cpp
index 58584fa3b72..0bdcc67cdbc 100644
--- a/base/applications/rapps/appview.cpp
+++ b/base/applications/rapps/appview.cpp
@@ -1382,7 +1382,26 @@ BOOL
CAppsListView::AddInstalledApplication(CInstalledApplicationInfo *InstAppIn
return FALSE;
}
- HICON hIcon = (HICON)LoadIconW(hInst, MAKEINTRESOURCEW(IDI_MAIN));
+ /* Load icon from registry */
+ HICON hIcon = NULL;
+ ATL::CStringW szIconPath;
+ if (InstAppInfo->RetrieveIcon(szIconPath))
+ {
+ PathParseIconLocationW((LPWSTR)szIconPath.GetString());
+
+ /* Load only the 1st icon from the application executable,
+ * because all apps provide the executables which have the main icon
+ * as 1st in the index , so we don't need other icons here */
+ hIcon = ExtractIconW(hInst,
+ szIconPath.GetString(),
+ 0);
+ }
+
+ if (!hIcon)
+ {
+ /* Load default icon */
+ hIcon = LoadIconW(hInst, MAKEINTRESOURCEW(IDI_MAIN));
+ }
int IconIndex = ImageList_AddIcon(m_hImageListView, hIcon);
DestroyIcon(hIcon);
@@ -2024,4 +2043,3 @@ BOOL CApplicationView::ItemCheckStateChanged(BOOL bChecked, LPVOID
CallbackParam
return TRUE;
}
// **** CApplicationView ****
-
diff --git a/base/applications/rapps/include/appview.h
b/base/applications/rapps/include/appview.h
index 7e8b9da6bc0..668131245ce 100644
--- a/base/applications/rapps/include/appview.h
+++ b/base/applications/rapps/include/appview.h
@@ -20,7 +20,7 @@
using namespace Gdiplus;
-#define LISTVIEW_ICON_SIZE 24
+#define LISTVIEW_ICON_SIZE 32
// default broken-image icon size
#define BROKENIMG_ICON_SIZE 96
diff --git a/base/applications/rapps/include/installed.h
b/base/applications/rapps/include/installed.h
index a719ed9057f..6e950056481 100644
--- a/base/applications/rapps/include/installed.h
+++ b/base/applications/rapps/include/installed.h
@@ -16,9 +16,11 @@ public:
CInstalledApplicationInfo(BOOL bIsUserKey, REGSAM RegWowKey, HKEY hKey);
BOOL GetApplicationRegString(LPCWSTR lpKeyName, ATL::CStringW& String);
BOOL GetApplicationRegDword(LPCWSTR lpKeyName, DWORD *lpValue);
+ BOOL RetrieveIcon(ATL::CStringW& IconLocation);
BOOL UninstallApplication(BOOL bModify);
LSTATUS RemoveFromRegistry();
+ ATL::CStringW szDisplayIcon;
ATL::CStringW szDisplayName;
ATL::CStringW szDisplayVersion;
ATL::CStringW szPublisher;
diff --git a/base/applications/rapps/installed.cpp
b/base/applications/rapps/installed.cpp
index 955ba012130..4179334a60a 100644
--- a/base/applications/rapps/installed.cpp
+++ b/base/applications/rapps/installed.cpp
@@ -126,6 +126,16 @@ BOOL CInstalledApplicationInfo::GetApplicationRegDword(LPCWSTR
lpKeyName, DWORD
return TRUE;
}
+BOOL CInstalledApplicationInfo::RetrieveIcon(ATL::CStringW& IconLocation)
+{
+ if (szDisplayIcon.IsEmpty())
+ {
+ return FALSE;
+ }
+ IconLocation = szDisplayIcon;
+ return TRUE;
+}
+
BOOL CInstalledApplicationInfo::UninstallApplication(BOOL bModify)
{
return StartProcess(bModify ? szModifyPath : szUninstallString, TRUE);
@@ -206,6 +216,7 @@ BOOL CInstalledApps::Enum(INT EnumType, APPENUMPROC lpEnumProc, PVOID
param)
// those items without display name are ignored
if (Info->GetApplicationRegString(L"DisplayName",
Info->szDisplayName))
{
+ Info->GetApplicationRegString(L"DisplayIcon",
Info->szDisplayIcon);
Info->GetApplicationRegString(L"DisplayVersion",
Info->szDisplayVersion);
Info->GetApplicationRegString(L"Publisher",
Info->szPublisher);
Info->GetApplicationRegString(L"RegOwner",
Info->szRegOwner);