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);