mirror of
https://github.com/valinet/ExplorerPatcher.git
synced 2025-01-31 12:03:50 +01:00
Fixes for weather panel, implemented icon-less modes, implemented dynamic size to fit contents
This commit is contained in:
parent
62bdf042a4
commit
83042a6d68
12
CHANGELOG.md
12
CHANGELOG.md
@ -10,6 +10,18 @@ Tested on OS build 22000.434.
|
|||||||
|
|
||||||
* Implemented Weather widget for the classic taskbar, similar to what is available in the more recent updates to Windows 10. Read more about it [here](https://github.com/valinet/ExplorerPatcher/wiki/Weather).
|
* Implemented Weather widget for the classic taskbar, similar to what is available in the more recent updates to Windows 10. Read more about it [here](https://github.com/valinet/ExplorerPatcher/wiki/Weather).
|
||||||
|
|
||||||
|
#### Feature enhancements
|
||||||
|
|
||||||
|
* The weather widget recomputes its area automatically, by default, in order to fit its contents, instead of remaining at a fixed size; there is also an option to choose between the two behaviors (.1)
|
||||||
|
* Possibility to disable the icon in the weather widget (.1)
|
||||||
|
|
||||||
|
#### Fixes
|
||||||
|
|
||||||
|
* Fixed a bug that prevented the weather widget flyout from displaying correctly when the taskbar was using small icons (#741) (.1)
|
||||||
|
* Fixed inconsistencies when displaying the weather widget and the system themes are disabled (aka the classic theme is used) (.1)
|
||||||
|
* Screen readers now read the weather data when requested for the weather widget (.1)
|
||||||
|
* Changing the Start button style or weather widget layout does not toggle taskbar auto-hide now; instead, the settings take effect immediately (.1)
|
||||||
|
|
||||||
## 22000.469.41
|
## 22000.469.41
|
||||||
|
|
||||||
Tested on OS build 22000.434.
|
Tested on OS build 22000.434.
|
||||||
|
@ -92,15 +92,6 @@ LONG NTAPI OnVex(PEXCEPTION_POINTERS ExceptionInfo)
|
|||||||
return EXCEPTION_CONTINUE_SEARCH;
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL IsHighContrast()
|
|
||||||
{
|
|
||||||
HIGHCONTRASTW highContrast;
|
|
||||||
ZeroMemory(&highContrast, sizeof(HIGHCONTRASTW));
|
|
||||||
highContrast.cbSize = sizeof(highContrast);
|
|
||||||
if (SystemParametersInfoW(SPI_GETHIGHCONTRAST, sizeof(highContrast), &highContrast, FALSE))
|
|
||||||
return highContrast.dwFlags & HCF_HIGHCONTRASTON;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
BOOL IsColorSchemeChangeMessage(LPARAM lParam)
|
BOOL IsColorSchemeChangeMessage(LPARAM lParam)
|
||||||
{
|
{
|
||||||
BOOL is = FALSE;
|
BOOL is = FALSE;
|
||||||
|
@ -107,6 +107,7 @@ HANDLE hCanStartSws = NULL;
|
|||||||
DWORD dwWeatherViewMode = EP_WEATHER_VIEW_ICONTEXT;
|
DWORD dwWeatherViewMode = EP_WEATHER_VIEW_ICONTEXT;
|
||||||
DWORD dwWeatherTemperatureUnit = EP_WEATHER_TUNIT_CELSIUS;
|
DWORD dwWeatherTemperatureUnit = EP_WEATHER_TUNIT_CELSIUS;
|
||||||
DWORD dwWeatherUpdateSchedule = EP_WEATHER_UPDATE_NORMAL;
|
DWORD dwWeatherUpdateSchedule = EP_WEATHER_UPDATE_NORMAL;
|
||||||
|
DWORD bWeatherFixedSize = FALSE;
|
||||||
WCHAR* wszWeatherTerm = NULL;
|
WCHAR* wszWeatherTerm = NULL;
|
||||||
WCHAR* wszWeatherLanguage = NULL;
|
WCHAR* wszWeatherLanguage = NULL;
|
||||||
WCHAR* wszEPWeatherKillswitch = NULL;
|
WCHAR* wszEPWeatherKillswitch = NULL;
|
||||||
@ -3504,7 +3505,7 @@ LRESULT explorer_SendMessageW(HWND hWndx, UINT uMsg, WPARAM wParam, LPARAM lPara
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
|
|
||||||
#pragma region "Set up taskbar button hooks"
|
#pragma region "Set up taskbar button hooks, implement Weather widget"
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
|
|
||||||
DWORD ShouldShowWidgetsInsteadOfCortana()
|
DWORD ShouldShowWidgetsInsteadOfCortana()
|
||||||
@ -3596,28 +3597,47 @@ BOOL explorer_DeleteMenu(HMENU hMenu, UINT uPosition, UINT uFlags)
|
|||||||
return DeleteMenu(hMenu, uPosition, uFlags);
|
return DeleteMenu(hMenu, uPosition, uFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int prev_total_h = 0;
|
||||||
SIZE (*PeopleButton_CalculateMinimumSizeFunc)(void*, SIZE*);
|
SIZE (*PeopleButton_CalculateMinimumSizeFunc)(void*, SIZE*);
|
||||||
SIZE WINAPI PeopleButton_CalculateMinimumSizeHook(void* _this, SIZE* pSz)
|
SIZE WINAPI PeopleButton_CalculateMinimumSizeHook(void* _this, SIZE* pSz)
|
||||||
{
|
{
|
||||||
SIZE ret = PeopleButton_CalculateMinimumSizeFunc(_this, pSz);
|
SIZE ret = PeopleButton_CalculateMinimumSizeFunc(_this, pSz);
|
||||||
int mul = 1;
|
|
||||||
if (epw)
|
if (epw)
|
||||||
{
|
{
|
||||||
switch (dwWeatherViewMode)
|
if (bWeatherFixedSize)
|
||||||
{
|
{
|
||||||
case EP_WEATHER_VIEW_ICONTEXT:
|
int mul = 1;
|
||||||
mul = 4;
|
switch (dwWeatherViewMode)
|
||||||
break;
|
{
|
||||||
case EP_WEATHER_VIEW_ICONTEMP:
|
case EP_WEATHER_VIEW_ICONTEXT:
|
||||||
mul = 2;
|
mul = 4;
|
||||||
break;
|
break;
|
||||||
case EP_WEATHER_VIEW_ICONONLY:
|
case EP_WEATHER_VIEW_TEXTONLY:
|
||||||
mul = 1;
|
mul = 3;
|
||||||
break;
|
break;
|
||||||
|
case EP_WEATHER_VIEW_ICONTEMP:
|
||||||
|
mul = 2;
|
||||||
|
break;
|
||||||
|
case EP_WEATHER_VIEW_ICONONLY:
|
||||||
|
case EP_WEATHER_VIEW_TEMPONLY:
|
||||||
|
mul = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pSz->cx = pSz->cx * mul;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!prev_total_h)
|
||||||
|
{
|
||||||
|
pSz->cx = 10000;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pSz->cx = prev_total_h;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//printf(">> %d %d\n", pSz->cx, pSz->cy);
|
//printf("[CalculateMinimumSize] %d %d\n", pSz->cx, pSz->cy);
|
||||||
pSz->cx = pSz->cx * mul;
|
|
||||||
if (pSz->cy && epw)
|
if (pSz->cy && epw)
|
||||||
{
|
{
|
||||||
BOOL bIsInitialized = TRUE;
|
BOOL bIsInitialized = TRUE;
|
||||||
@ -3629,7 +3649,9 @@ SIZE WINAPI PeopleButton_CalculateMinimumSizeHook(void* _this, SIZE* pSz)
|
|||||||
{
|
{
|
||||||
epw->lpVtbl->SetTerm(epw, MAX_PATH * sizeof(WCHAR), wszWeatherTerm);
|
epw->lpVtbl->SetTerm(epw, MAX_PATH * sizeof(WCHAR), wszWeatherTerm);
|
||||||
epw->lpVtbl->SetLanguage(epw, MAX_PATH * sizeof(WCHAR), wszWeatherLanguage);
|
epw->lpVtbl->SetLanguage(epw, MAX_PATH * sizeof(WCHAR), wszWeatherLanguage);
|
||||||
if (FAILED(epw->lpVtbl->Initialize(epw, wszEPWeatherKillswitch, bAllocConsole, EP_WEATHER_PROVIDER_GOOGLE, rt, rt, dwWeatherTemperatureUnit, dwWeatherUpdateSchedule * 1000, pSz->cy / 48.0)))
|
UINT dpiX = 0, dpiY = 0;
|
||||||
|
HRESULT hr = GetDpiForMonitor(MonitorFromWindow(PeopleButton_LastHWND, MONITOR_DEFAULTTOPRIMARY), MDT_DEFAULT, &dpiX, &dpiY);
|
||||||
|
if (FAILED(epw->lpVtbl->Initialize(epw, wszEPWeatherKillswitch, bAllocConsole, EP_WEATHER_PROVIDER_GOOGLE, rt, rt, dwWeatherTemperatureUnit, dwWeatherUpdateSchedule * 1000, dpiX / 96.0)))
|
||||||
{
|
{
|
||||||
epw->lpVtbl->Release(epw);
|
epw->lpVtbl->Release(epw);
|
||||||
}
|
}
|
||||||
@ -3653,24 +3675,44 @@ SIZE WINAPI PeopleButton_CalculateMinimumSizeHook(void* _this, SIZE* pSz)
|
|||||||
|
|
||||||
int PeopleBand_MulDivHook(int nNumber, int nNumerator, int nDenominator)
|
int PeopleBand_MulDivHook(int nNumber, int nNumerator, int nDenominator)
|
||||||
{
|
{
|
||||||
//printf("<< %d %d %d\n", nNumber, nNumerator, nDenominator);
|
//printf("[MulDivHook] %d %d %d\n", nNumber, nNumerator, nDenominator);
|
||||||
int mul = 1;
|
|
||||||
if (epw)
|
if (epw)
|
||||||
{
|
{
|
||||||
switch (dwWeatherViewMode)
|
if (bWeatherFixedSize)
|
||||||
{
|
{
|
||||||
case EP_WEATHER_VIEW_ICONTEXT:
|
int mul = 1;
|
||||||
mul = 4;
|
switch (dwWeatherViewMode)
|
||||||
break;
|
{
|
||||||
case EP_WEATHER_VIEW_ICONTEMP:
|
case EP_WEATHER_VIEW_ICONTEXT:
|
||||||
mul = 2;
|
mul = 4;
|
||||||
break;
|
break;
|
||||||
case EP_WEATHER_VIEW_ICONONLY:
|
case EP_WEATHER_VIEW_TEXTONLY:
|
||||||
mul = 1;
|
mul = 3;
|
||||||
break;
|
break;
|
||||||
|
case EP_WEATHER_VIEW_ICONTEMP:
|
||||||
|
mul = 2;
|
||||||
|
break;
|
||||||
|
case EP_WEATHER_VIEW_ICONONLY:
|
||||||
|
case EP_WEATHER_VIEW_TEMPONLY:
|
||||||
|
mul = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MulDiv(nNumber * mul, nNumerator, nDenominator);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (prev_total_h)
|
||||||
|
{
|
||||||
|
return prev_total_h;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prev_total_h = MulDiv(nNumber, nNumerator, nDenominator);
|
||||||
|
return prev_total_h;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return MulDiv(nNumber * mul, nNumerator, nDenominator);
|
return MulDiv(nNumber, nNumerator, nDenominator);
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD epw_cbTemperature = 0;
|
DWORD epw_cbTemperature = 0;
|
||||||
@ -3711,6 +3753,11 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
|||||||
if (a5 == 0x21 && epw)
|
if (a5 == 0x21 && epw)
|
||||||
{
|
{
|
||||||
BOOL bUseCachedData = InSendMessage();
|
BOOL bUseCachedData = InSendMessage();
|
||||||
|
BOOL bIsThemeActive = TRUE;
|
||||||
|
if (!IsThemeActive() || IsHighContrast())
|
||||||
|
{
|
||||||
|
bIsThemeActive = FALSE;
|
||||||
|
}
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
if (bUseCachedData ? TRUE : SUCCEEDED(hr = epw->lpVtbl->LockData(epw)))
|
if (bUseCachedData ? TRUE : SUCCEEDED(hr = epw->lpVtbl->LockData(epw)))
|
||||||
{
|
{
|
||||||
@ -3775,6 +3822,13 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
|||||||
{
|
{
|
||||||
if (!bUseCachedData)
|
if (!bUseCachedData)
|
||||||
{
|
{
|
||||||
|
WCHAR wszBuffer[MAX_PATH];
|
||||||
|
ZeroMemory(wszBuffer, sizeof(WCHAR) * MAX_PATH);
|
||||||
|
swprintf_s(wszBuffer, MAX_PATH, L"%s %s, %s, ", epw_wszTemperature, epw_wszUnit, epw_wszCondition);
|
||||||
|
int len = wcslen(wszBuffer);
|
||||||
|
epw->lpVtbl->GetTitle(epw, sizeof(WCHAR) * (MAX_PATH - len), wszBuffer + len, dwWeatherViewMode);
|
||||||
|
SetWindowTextW(PeopleButton_LastHWND, wszBuffer);
|
||||||
|
|
||||||
epw->lpVtbl->UnlockData(epw);
|
epw->lpVtbl->UnlockData(epw);
|
||||||
bShouldUnlockData = FALSE;
|
bShouldUnlockData = FALSE;
|
||||||
}
|
}
|
||||||
@ -3784,9 +3838,9 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
|||||||
NONCLIENTMETRICS ncm;
|
NONCLIENTMETRICS ncm;
|
||||||
ZeroMemory(&ncm, sizeof(NONCLIENTMETRICS));
|
ZeroMemory(&ncm, sizeof(NONCLIENTMETRICS));
|
||||||
ncm.cbSize = sizeof(NONCLIENTMETRICS);
|
ncm.cbSize = sizeof(NONCLIENTMETRICS);
|
||||||
SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
|
SystemParametersInfoForDpi(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0, dpiX);
|
||||||
logFont = ncm.lfCaptionFont;
|
logFont = ncm.lfCaptionFont;
|
||||||
logFont.lfHeight = -14 * (dpiX / 96.0);
|
logFont.lfWeight = FW_NORMAL;
|
||||||
if (bEmptyData)
|
if (bEmptyData)
|
||||||
{
|
{
|
||||||
DWORD dwVal = 1, dwSize = sizeof(DWORD);
|
DWORD dwVal = 1, dwSize = sizeof(DWORD);
|
||||||
@ -3810,9 +3864,16 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
|||||||
if (hDC)
|
if (hDC)
|
||||||
{
|
{
|
||||||
COLORREF rgbColor = RGB(0, 0, 0);
|
COLORREF rgbColor = RGB(0, 0, 0);
|
||||||
if (ShouldSystemUseDarkMode && ShouldSystemUseDarkMode())
|
if (bIsThemeActive)
|
||||||
{
|
{
|
||||||
rgbColor = RGB(255, 255, 255);
|
if (ShouldSystemUseDarkMode && ShouldSystemUseDarkMode())
|
||||||
|
{
|
||||||
|
rgbColor = RGB(255, 255, 255);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rgbColor = GetSysColor(COLOR_WINDOWTEXT);
|
||||||
}
|
}
|
||||||
HFONT hOldFont = SelectFont(hDC, hFont);
|
HFONT hOldFont = SelectFont(hDC, hFont);
|
||||||
if (bEmptyData)
|
if (bEmptyData)
|
||||||
@ -3846,19 +3907,22 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
|||||||
DWORD dwTextFlags = DT_SINGLELINE | DT_VCENTER | DT_HIDEPREFIX;
|
DWORD dwTextFlags = DT_SINGLELINE | DT_VCENTER | DT_HIDEPREFIX;
|
||||||
|
|
||||||
WCHAR wszText1[MAX_PATH];
|
WCHAR wszText1[MAX_PATH];
|
||||||
swprintf_s(wszText1, MAX_PATH, L"%s %s", epw_wszTemperature, dwWeatherTemperatureUnit == EP_WEATHER_TUNIT_FAHRENHEIT ? L"\u00B0F" : L"\u00B0C");// epw_wszUnit);
|
swprintf_s(wszText1, MAX_PATH, L"%s%s %s", bIsThemeActive ? L"" : L" ", epw_wszTemperature, dwWeatherTemperatureUnit == EP_WEATHER_TUNIT_FAHRENHEIT ? L"\u00B0F" : L"\u00B0C");// epw_wszUnit);
|
||||||
RECT rcText1;
|
RECT rcText1;
|
||||||
SetRect(&rcText1, 0, 0, a4->right, a4->bottom);
|
SetRect(&rcText1, 0, 0, a4->right, a4->bottom);
|
||||||
DrawTextW(hDC, wszText1, -1, &rcText1, dwTextFlags | DT_CALCRECT);
|
DrawTextW(hDC, wszText1, -1, &rcText1, dwTextFlags | DT_CALCRECT);
|
||||||
rcText1.bottom = a4->bottom;
|
rcText1.bottom = a4->bottom;
|
||||||
WCHAR wszText2[MAX_PATH];
|
WCHAR wszText2[MAX_PATH];
|
||||||
swprintf_s(wszText2, MAX_PATH, L"%s", epw_wszCondition);
|
swprintf_s(wszText2, MAX_PATH, L"%s%s", bIsThemeActive ? L"" : L" ", epw_wszCondition);
|
||||||
RECT rcText2;
|
RECT rcText2;
|
||||||
SetRect(&rcText2, 0, 0, a4->right, a4->bottom);
|
SetRect(&rcText2, 0, 0, a4->right, a4->bottom);
|
||||||
DrawTextW(hDC, wszText2, -1, &rcText2, dwTextFlags | DT_CALCRECT);
|
DrawTextW(hDC, wszText2, -1, &rcText2, dwTextFlags | DT_CALCRECT);
|
||||||
rcText2.bottom = a4->bottom;
|
rcText2.bottom = a4->bottom;
|
||||||
|
|
||||||
dwTextFlags |= DT_END_ELLIPSIS;
|
if (bWeatherFixedSize)
|
||||||
|
{
|
||||||
|
dwTextFlags |= DT_END_ELLIPSIS;
|
||||||
|
}
|
||||||
|
|
||||||
int addend = 0;
|
int addend = 0;
|
||||||
//int rt = MulDiv(48, a4->bottom, 60);
|
//int rt = MulDiv(48, a4->bottom, 60);
|
||||||
@ -3866,12 +3930,18 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
|||||||
int p = 0;// MulDiv(rt, 4, 64);
|
int p = 0;// MulDiv(rt, 4, 64);
|
||||||
int margin_h = MulDiv(12, dpiX, 144);
|
int margin_h = MulDiv(12, dpiX, 144);
|
||||||
|
|
||||||
|
BOOL bIsIconMode = (
|
||||||
|
dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEMP ||
|
||||||
|
dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEXT ||
|
||||||
|
dwWeatherViewMode == EP_WEATHER_VIEW_ICONONLY);
|
||||||
switch (dwWeatherViewMode)
|
switch (dwWeatherViewMode)
|
||||||
{
|
{
|
||||||
case EP_WEATHER_VIEW_ICONTEXT:
|
case EP_WEATHER_VIEW_ICONTEXT:
|
||||||
|
case EP_WEATHER_VIEW_TEXTONLY:
|
||||||
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
|
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
|
||||||
break;
|
break;
|
||||||
case EP_WEATHER_VIEW_ICONTEMP:
|
case EP_WEATHER_VIEW_ICONTEMP:
|
||||||
|
case EP_WEATHER_VIEW_TEMPONLY:
|
||||||
addend = (rcText1.right - rcText1.left) + margin_h;
|
addend = (rcText1.right - rcText1.left) + margin_h;
|
||||||
break;
|
break;
|
||||||
case EP_WEATHER_VIEW_ICONONLY:
|
case EP_WEATHER_VIEW_ICONONLY:
|
||||||
@ -3879,58 +3949,73 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int margin_v = (a4->bottom - rt) / 2;
|
int margin_v = (a4->bottom - rt) / 2;
|
||||||
int total_h = (margin_h - p) + rt + (margin_h - p) + addend;
|
int total_h = (bIsIconMode ? ((margin_h - p) + rt + (margin_h - p)) : margin_h) + addend;
|
||||||
if (total_h > a4->right)
|
if (bWeatherFixedSize)
|
||||||
{
|
{
|
||||||
int diff = total_h - a4->right;
|
if (total_h > a4->right)
|
||||||
rcText2.right -= diff - 2;
|
|
||||||
switch (dwWeatherViewMode)
|
|
||||||
{
|
{
|
||||||
case EP_WEATHER_VIEW_ICONTEXT:
|
int diff = total_h - a4->right;
|
||||||
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
|
rcText2.right -= diff - 2;
|
||||||
break;
|
switch (dwWeatherViewMode)
|
||||||
case EP_WEATHER_VIEW_ICONTEMP:
|
{
|
||||||
addend = (rcText1.right - rcText1.left) + margin_h;
|
case EP_WEATHER_VIEW_ICONTEXT:
|
||||||
break;
|
case EP_WEATHER_VIEW_TEXTONLY:
|
||||||
case EP_WEATHER_VIEW_ICONONLY:
|
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
|
||||||
addend = 0;
|
break;
|
||||||
break;
|
case EP_WEATHER_VIEW_ICONTEMP:
|
||||||
|
case EP_WEATHER_VIEW_TEMPONLY: // should be impossible
|
||||||
|
addend = (rcText1.right - rcText1.left) + margin_h;
|
||||||
|
break;
|
||||||
|
case EP_WEATHER_VIEW_ICONONLY:
|
||||||
|
addend = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
total_h = (margin_h - p) + rt + (margin_h - p) + addend;
|
||||||
}
|
}
|
||||||
total_h = (margin_h - p) + rt + (margin_h - p) + addend;
|
|
||||||
}
|
}
|
||||||
|
int start_x = 0; // prev_total_h - total_h;
|
||||||
int start_x = (a4->right - total_h) / 2;
|
if (bWeatherFixedSize)
|
||||||
|
{
|
||||||
|
start_x = (a4->right - total_h) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
HBITMAP hBitmap = NULL, hOldBitmap = NULL;
|
HBITMAP hBitmap = NULL, hOldBitmap = NULL;
|
||||||
void* pvBits = NULL;
|
void* pvBits = NULL;
|
||||||
SIZE size;
|
SIZE size;
|
||||||
|
|
||||||
BITMAPINFOHEADER BMIH;
|
if (bIsIconMode)
|
||||||
ZeroMemory(&BMIH, sizeof(BITMAPINFOHEADER));
|
|
||||||
BMIH.biSize = sizeof(BITMAPINFOHEADER);
|
|
||||||
BMIH.biWidth = rt;
|
|
||||||
BMIH.biHeight = -rt;
|
|
||||||
BMIH.biPlanes = 1;
|
|
||||||
BMIH.biBitCount = 32;
|
|
||||||
BMIH.biCompression = BI_RGB;
|
|
||||||
hBitmap = CreateDIBSection(hDC, &BMIH, 0, &pvBits, NULL, 0);
|
|
||||||
if (hBitmap)
|
|
||||||
{
|
{
|
||||||
memcpy(pvBits, epw_pImage, epw_cbImage);
|
BITMAPINFOHEADER BMIH;
|
||||||
hOldBitmap = SelectBitmap(hDC, hBitmap);
|
ZeroMemory(&BMIH, sizeof(BITMAPINFOHEADER));
|
||||||
|
BMIH.biSize = sizeof(BITMAPINFOHEADER);
|
||||||
|
BMIH.biWidth = rt;
|
||||||
|
BMIH.biHeight = -rt;
|
||||||
|
BMIH.biPlanes = 1;
|
||||||
|
BMIH.biBitCount = 32;
|
||||||
|
BMIH.biCompression = BI_RGB;
|
||||||
|
hBitmap = CreateDIBSection(hDC, &BMIH, 0, &pvBits, NULL, 0);
|
||||||
|
if (hBitmap)
|
||||||
|
{
|
||||||
|
memcpy(pvBits, epw_pImage, epw_cbImage);
|
||||||
|
hOldBitmap = SelectBitmap(hDC, hBitmap);
|
||||||
|
|
||||||
BLENDFUNCTION bf;
|
BLENDFUNCTION bf;
|
||||||
bf.BlendOp = AC_SRC_OVER;
|
bf.BlendOp = AC_SRC_OVER;
|
||||||
bf.BlendFlags = 0;
|
bf.BlendFlags = 0;
|
||||||
bf.SourceConstantAlpha = 0xFF;
|
bf.SourceConstantAlpha = 0xFF;
|
||||||
bf.AlphaFormat = AC_SRC_ALPHA;
|
bf.AlphaFormat = AC_SRC_ALPHA;
|
||||||
GdiAlphaBlend(hdc, start_x + (margin_h - p), margin_v, rt, rt, hDC, 0, 0, rt, rt, bf);
|
GdiAlphaBlend(hdc, start_x + (margin_h - p), margin_v, rt, rt, hDC, 0, 0, rt, rt, bf);
|
||||||
|
|
||||||
SelectBitmap(hDC, hOldBitmap);
|
SelectBitmap(hDC, hOldBitmap);
|
||||||
DeleteBitmap(hBitmap);
|
DeleteBitmap(hBitmap);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEMP || dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEXT)
|
if (dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEMP ||
|
||||||
|
dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEXT ||
|
||||||
|
dwWeatherViewMode == EP_WEATHER_VIEW_TEMPONLY ||
|
||||||
|
dwWeatherViewMode == EP_WEATHER_VIEW_TEXTONLY
|
||||||
|
)
|
||||||
{
|
{
|
||||||
size.cx = rcText1.right - rcText1.left;
|
size.cx = rcText1.right - rcText1.left;
|
||||||
size.cy = rcText1.bottom - rcText1.top;
|
size.cy = rcText1.bottom - rcText1.top;
|
||||||
@ -3946,14 +4031,16 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
|||||||
bf.BlendFlags = 0;
|
bf.BlendFlags = 0;
|
||||||
bf.SourceConstantAlpha = 0xFF;
|
bf.SourceConstantAlpha = 0xFF;
|
||||||
bf.AlphaFormat = AC_SRC_ALPHA;
|
bf.AlphaFormat = AC_SRC_ALPHA;
|
||||||
GdiAlphaBlend(hdc, start_x + (margin_h - p) + rt + (margin_h - p), 0, BMInf.bmWidth, BMInf.bmHeight, hDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf);
|
GdiAlphaBlend(hdc, start_x + (bIsIconMode ? ((margin_h - p) + rt + (margin_h - p)) : margin_h), 0, BMInf.bmWidth, BMInf.bmHeight, hDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf);
|
||||||
|
|
||||||
SelectBitmap(hDC, hOldBMP);
|
SelectBitmap(hDC, hOldBMP);
|
||||||
DeleteBitmap(hBitmap);
|
DeleteBitmap(hBitmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEXT)
|
if (dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEXT ||
|
||||||
|
dwWeatherViewMode == EP_WEATHER_VIEW_TEXTONLY
|
||||||
|
)
|
||||||
{
|
{
|
||||||
size.cx = rcText2.right - rcText2.left;
|
size.cx = rcText2.right - rcText2.left;
|
||||||
size.cy = rcText2.bottom - rcText2.top;
|
size.cy = rcText2.bottom - rcText2.top;
|
||||||
@ -3969,12 +4056,46 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
|||||||
bf.BlendFlags = 0;
|
bf.BlendFlags = 0;
|
||||||
bf.SourceConstantAlpha = 0xFF;
|
bf.SourceConstantAlpha = 0xFF;
|
||||||
bf.AlphaFormat = AC_SRC_ALPHA;
|
bf.AlphaFormat = AC_SRC_ALPHA;
|
||||||
GdiAlphaBlend(hdc, start_x + (margin_h - p) + rt + (margin_h - p) + (rcText1.right - rcText1.left) + margin_h, 0, BMInf.bmWidth, BMInf.bmHeight, hDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf);
|
GdiAlphaBlend(hdc, start_x + (bIsIconMode ? ((margin_h - p) + rt + (margin_h - p)) : margin_h) + (rcText1.right - rcText1.left) + margin_h, 0, BMInf.bmWidth, BMInf.bmHeight, hDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf);
|
||||||
|
|
||||||
SelectBitmap(hDC, hOldBMP);
|
SelectBitmap(hDC, hOldBMP);
|
||||||
DeleteBitmap(hBitmap);
|
DeleteBitmap(hBitmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bWeatherFixedSize)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (total_h != prev_total_h)
|
||||||
|
{
|
||||||
|
prev_total_h = total_h;
|
||||||
|
SendNotifyMessageW(HWND_BROADCAST, WM_WININICHANGE, 0, (LPARAM)L"TraySettings");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SetLastError(0);
|
||||||
|
LONG_PTR oldStyle = GetWindowLongPtrW(PeopleButton_LastHWND, GWL_EXSTYLE);
|
||||||
|
if (!GetLastError())
|
||||||
|
{
|
||||||
|
LONG_PTR style;
|
||||||
|
if (bIsThemeActive)
|
||||||
|
{
|
||||||
|
style = oldStyle & ~WS_EX_DLGMODALFRAME;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
style = oldStyle | WS_EX_DLGMODALFRAME;
|
||||||
|
}
|
||||||
|
if (style != oldStyle)
|
||||||
|
{
|
||||||
|
SetWindowLongPtrW(PeopleButton_LastHWND, GWL_EXSTYLE, style);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
SelectFont(hDC, hOldFont);
|
SelectFont(hDC, hOldFont);
|
||||||
DeleteDC(hDC);
|
DeleteDC(hDC);
|
||||||
@ -4267,6 +4388,15 @@ BOOL explorer_SetChildWindowNoActivateHook(HWND hWnd)
|
|||||||
if (SUCCEEDED(CoCreateInstance(&CLSID_EPWeather, NULL, CLSCTX_LOCAL_SERVER, &IID_IEPWeather, &epw)) && epw)
|
if (SUCCEEDED(CoCreateInstance(&CLSID_EPWeather, NULL, CLSCTX_LOCAL_SERVER, &IID_IEPWeather, &epw)) && epw)
|
||||||
{
|
{
|
||||||
epw->lpVtbl->SetNotifyWindow(epw, hWnd);
|
epw->lpVtbl->SetNotifyWindow(epw, hWnd);
|
||||||
|
|
||||||
|
WCHAR wszBuffer[MAX_PATH];
|
||||||
|
ZeroMemory(wszBuffer, sizeof(WCHAR) * MAX_PATH);
|
||||||
|
HMODULE hModule = GetModuleHandleW(L"pnidui.dll");
|
||||||
|
if (hModule)
|
||||||
|
{
|
||||||
|
LoadStringW(hModule, 35, wszBuffer, MAX_PATH);
|
||||||
|
}
|
||||||
|
SetWindowTextW(hWnd, wszBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4695,9 +4825,10 @@ DWORD WindowSwitcher(DWORD unused)
|
|||||||
|
|
||||||
|
|
||||||
#pragma region "Load Settings from registry"
|
#pragma region "Load Settings from registry"
|
||||||
#define REFRESHUI_NONE 0b00
|
#define REFRESHUI_NONE 0b000
|
||||||
#define REFRESHUI_GLOM 0b01
|
#define REFRESHUI_GLOM 0b001
|
||||||
#define REFRESHUI_ORB 0b10
|
#define REFRESHUI_ORB 0b010
|
||||||
|
#define REFRESHUI_PEOPLE 0b100
|
||||||
void WINAPI LoadSettings(LPARAM lParam)
|
void WINAPI LoadSettings(LPARAM lParam)
|
||||||
{
|
{
|
||||||
BOOL bIsExplorer = LOWORD(lParam);
|
BOOL bIsExplorer = LOWORD(lParam);
|
||||||
@ -5268,9 +5399,7 @@ void WINAPI LoadSettings(LPARAM lParam)
|
|||||||
);
|
);
|
||||||
if (dwWeatherViewMode != dwOldWeatherViewMode && PeopleButton_LastHWND)
|
if (dwWeatherViewMode != dwOldWeatherViewMode && PeopleButton_LastHWND)
|
||||||
{
|
{
|
||||||
ToggleTaskbarAutohide();
|
dwRefreshUIMask |= REFRESHUI_PEOPLE;
|
||||||
ToggleTaskbarAutohide();
|
|
||||||
InvalidateRect(PeopleButton_LastHWND, NULL, TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD dwOldUpdateSchedule = dwWeatherUpdateSchedule;
|
DWORD dwOldUpdateSchedule = dwWeatherUpdateSchedule;
|
||||||
@ -5311,6 +5440,7 @@ void WINAPI LoadSettings(LPARAM lParam)
|
|||||||
{
|
{
|
||||||
epw->lpVtbl->SetTerm(epw, MAX_PATH * sizeof(WCHAR), wszWeatherTerm);
|
epw->lpVtbl->SetTerm(epw, MAX_PATH * sizeof(WCHAR), wszWeatherTerm);
|
||||||
}
|
}
|
||||||
|
|
||||||
dwSize = MAX_PATH * sizeof(WCHAR);
|
dwSize = MAX_PATH * sizeof(WCHAR);
|
||||||
if (RegQueryValueExW(
|
if (RegQueryValueExW(
|
||||||
hKey,
|
hKey,
|
||||||
@ -5334,6 +5464,21 @@ void WINAPI LoadSettings(LPARAM lParam)
|
|||||||
{
|
{
|
||||||
epw->lpVtbl->SetLanguage(epw, MAX_PATH * sizeof(WCHAR), wszWeatherLanguage);
|
epw->lpVtbl->SetLanguage(epw, MAX_PATH * sizeof(WCHAR), wszWeatherLanguage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DWORD bOldWeatherFixedSize = bWeatherFixedSize;
|
||||||
|
dwSize = sizeof(DWORD);
|
||||||
|
RegQueryValueExW(
|
||||||
|
hKey,
|
||||||
|
TEXT("WeatherFixedSize"),
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
&bWeatherFixedSize,
|
||||||
|
&dwSize
|
||||||
|
);
|
||||||
|
if (bWeatherFixedSize != bOldWeatherFixedSize && epw)
|
||||||
|
{
|
||||||
|
dwRefreshUIMask |= REFRESHUI_PEOPLE;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dwTemp = TASKBARGLOMLEVEL_DEFAULT;
|
dwTemp = TASKBARGLOMLEVEL_DEFAULT;
|
||||||
@ -5563,13 +5708,19 @@ void WINAPI LoadSettings(LPARAM lParam)
|
|||||||
{
|
{
|
||||||
Explorer_RefreshUI(0);
|
Explorer_RefreshUI(0);
|
||||||
}
|
}
|
||||||
if (dwRefreshUIMask & REFRESHUI_ORB)
|
if ((dwRefreshUIMask & REFRESHUI_ORB) || (dwRefreshUIMask & REFRESHUI_PEOPLE))
|
||||||
{
|
{
|
||||||
|
SendNotifyMessageW(HWND_BROADCAST, WM_WININICHANGE, 0, (LPARAM)L"TraySettings");
|
||||||
|
if (dwRefreshUIMask & REFRESHUI_ORB)
|
||||||
|
{
|
||||||
|
InvalidateRect(FindWindowW(L"ExplorerPatcher_GUI_" _T(EP_CLSID), NULL), NULL, FALSE);
|
||||||
|
}
|
||||||
|
if (dwRefreshUIMask & REFRESHUI_PEOPLE)
|
||||||
|
{
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
ToggleTaskbarAutohide();
|
InvalidateRect(PeopleButton_LastHWND, NULL, TRUE);
|
||||||
ToggleTaskbarAutohide();
|
|
||||||
#endif
|
#endif
|
||||||
InvalidateRect(FindWindowW(L"ExplorerPatcher_GUI_" _T(EP_CLSID), NULL), NULL, FALSE);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -350,11 +350,17 @@
|
|||||||
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||||
;b Show Weather on the taskbar
|
;b Show Weather on the taskbar
|
||||||
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_PeopleBand"=dword:00000000
|
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_PeopleBand"=dword:00000000
|
||||||
;c 3 Layout
|
;c 5 Layout
|
||||||
;x 1 Icon only
|
;x 0 Icon and description (default)
|
||||||
;x 3 Icon and temperature
|
;x 3 Icon and temperature
|
||||||
;x 0 Icon and text (default)
|
;x 1 Icon only
|
||||||
|
;x 4 Temperature only
|
||||||
|
;x 5 Temperature and description
|
||||||
"WeatherViewMode"=dword:00000000
|
"WeatherViewMode"=dword:00000000
|
||||||
|
;c 2 Widget size
|
||||||
|
;x 0 Enlarge/shrink to fit contents (default)
|
||||||
|
;x 1 Fixed
|
||||||
|
"WeatherFixedSize"=dword:00000000
|
||||||
;c 7 Update frequency
|
;c 7 Update frequency
|
||||||
;x 60 Every minute
|
;x 60 Every minute
|
||||||
;x 300 Every 5 minutes
|
;x 300 Every 5 minutes
|
||||||
|
@ -245,6 +245,16 @@ WCHAR* StrReplaceAllW(const WCHAR* s, const WCHAR* oldW, const WCHAR* newW, int*
|
|||||||
|
|
||||||
HRESULT InputBox(BOOL bPassword, HWND hWnd, LPCWSTR wszPrompt, LPCWSTR wszTitle, LPCWSTR wszDefault, LPCWSTR wszAnswer, DWORD cbAnswer);
|
HRESULT InputBox(BOOL bPassword, HWND hWnd, LPCWSTR wszPrompt, LPCWSTR wszTitle, LPCWSTR wszDefault, LPCWSTR wszAnswer, DWORD cbAnswer);
|
||||||
|
|
||||||
|
inline BOOL IsHighContrast()
|
||||||
|
{
|
||||||
|
HIGHCONTRASTW highContrast;
|
||||||
|
ZeroMemory(&highContrast, sizeof(HIGHCONTRASTW));
|
||||||
|
highContrast.cbSize = sizeof(highContrast);
|
||||||
|
if (SystemParametersInfoW(SPI_GETHIGHCONTRAST, sizeof(highContrast), &highContrast, FALSE))
|
||||||
|
return highContrast.dwFlags & HCF_HIGHCONTRASTON;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
// https://codereview.stackexchange.com/questions/29198/random-string-generator-in-c
|
// https://codereview.stackexchange.com/questions/29198/random-string-generator-in-c
|
||||||
static inline WCHAR* rand_string(WCHAR* str, size_t size)
|
static inline WCHAR* rand_string(WCHAR* str, size_t size)
|
||||||
{
|
{
|
||||||
|
@ -43,6 +43,8 @@ DEFINE_GUID(IID_IEPWeather,
|
|||||||
#define EP_WEATHER_VIEW_ICONONLY 1
|
#define EP_WEATHER_VIEW_ICONONLY 1
|
||||||
#define EP_WEATHER_VIEW_ICONTEMP 3
|
#define EP_WEATHER_VIEW_ICONTEMP 3
|
||||||
#define EP_WEATHER_VIEW_ICONTEXT 0
|
#define EP_WEATHER_VIEW_ICONTEXT 0
|
||||||
|
#define EP_WEATHER_VIEW_TEMPONLY 4
|
||||||
|
#define EP_WEATHER_VIEW_TEXTONLY 5
|
||||||
|
|
||||||
#define EP_WEATHER_UPDATE_NORMAL 1200
|
#define EP_WEATHER_UPDATE_NORMAL 1200
|
||||||
#define EP_WEATHER_UPDATE_REDUCED 3600
|
#define EP_WEATHER_UPDATE_REDUCED 3600
|
||||||
|
@ -588,6 +588,7 @@ LRESULT CALLBACK epw_Weather_WindowProc(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPA
|
|||||||
DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
|
DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
|
DWORD bIsThemeActive = IsThemeActive();
|
||||||
|
|
||||||
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
||||||
|
|
||||||
@ -614,7 +615,7 @@ DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
|
|||||||
wc.style = CS_DBLCLKS;
|
wc.style = CS_DBLCLKS;
|
||||||
wc.lpfnWndProc = epw_Weather_WindowProc;
|
wc.lpfnWndProc = epw_Weather_WindowProc;
|
||||||
wc.hInstance = epw_hModule;
|
wc.hInstance = epw_hModule;
|
||||||
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
|
wc.hbrBackground = bIsThemeActive ? (HBRUSH)GetStockObject(BLACK_BRUSH) : (HBRUSH)GetStockObject(WHITE_BRUSH);
|
||||||
wc.lpszClassName = _T(EPW_WEATHER_CLASSNAME);
|
wc.lpszClassName = _T(EPW_WEATHER_CLASSNAME);
|
||||||
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
|
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
|
||||||
if (!RegisterClassW(&wc))
|
if (!RegisterClassW(&wc))
|
||||||
@ -623,7 +624,7 @@ DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
_this->hWnd = CreateWindowExW(0, _T(EPW_WEATHER_CLASSNAME), L"", WS_OVERLAPPED | WS_CAPTION, 100, 100, 825 * _this->dpi, 515 * _this->dpi, NULL, NULL, epw_hModule, _this); // 1030, 630
|
_this->hWnd = CreateWindowExW(0, _T(EPW_WEATHER_CLASSNAME), L"", WS_OVERLAPPED | WS_CAPTION, 100, 100, 690 * _this->dpi, 425 * _this->dpi, NULL, NULL, epw_hModule, _this); // 1030, 630
|
||||||
if (!_this->hWnd)
|
if (!_this->hWnd)
|
||||||
{
|
{
|
||||||
_this->hrLastError = HRESULT_FROM_WIN32(GetLastError());
|
_this->hrLastError = HRESULT_FROM_WIN32(GetLastError());
|
||||||
@ -649,10 +650,13 @@ DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
MARGINS marGlassInset = { -1, -1, -1, -1 }; // -1 means the whole window
|
if (bIsThemeActive)
|
||||||
DwmExtendFrameIntoClientArea(_this->hWnd, &marGlassInset);
|
{
|
||||||
BOOL value = 1;
|
MARGINS marGlassInset = { -1, -1, -1, -1 }; // -1 means the whole window
|
||||||
DwmSetWindowAttribute(_this->hWnd, 1029, &value, sizeof(BOOL));
|
DwmExtendFrameIntoClientArea(_this->hWnd, &marGlassInset);
|
||||||
|
BOOL value = 1;
|
||||||
|
DwmSetWindowAttribute(_this->hWnd, 1029, &value, sizeof(BOOL));
|
||||||
|
}
|
||||||
|
|
||||||
InterlockedExchange64(&_this->bBrowserBusy, TRUE);
|
InterlockedExchange64(&_this->bBrowserBusy, TRUE);
|
||||||
|
|
||||||
@ -942,9 +946,11 @@ HRESULT STDMETHODCALLTYPE epw_Weather_GetTitle(EPWeather* _this, DWORD cbTitle,
|
|||||||
switch (dwType)
|
switch (dwType)
|
||||||
{
|
{
|
||||||
case EP_WEATHER_VIEW_ICONTEXT:
|
case EP_WEATHER_VIEW_ICONTEXT:
|
||||||
|
case EP_WEATHER_VIEW_TEXTONLY:
|
||||||
swprintf_s(wszBuffer, MAX_PATH, L"%s", _this->wszLocation);
|
swprintf_s(wszBuffer, MAX_PATH, L"%s", _this->wszLocation);
|
||||||
break;
|
break;
|
||||||
case EP_WEATHER_VIEW_ICONTEMP:
|
case EP_WEATHER_VIEW_ICONTEMP:
|
||||||
|
case EP_WEATHER_VIEW_TEMPONLY:
|
||||||
swprintf_s(wszBuffer, MAX_PATH, L"%s - %s", _this->wszLocation, _this->wszCondition);
|
swprintf_s(wszBuffer, MAX_PATH, L"%s - %s", _this->wszLocation, _this->wszCondition);
|
||||||
break;
|
break;
|
||||||
case EP_WEATHER_VIEW_ICONONLY:
|
case EP_WEATHER_VIEW_ICONONLY:
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <Iphlpapi.h>
|
#include <Iphlpapi.h>
|
||||||
#pragma comment(lib, "IPHLPAPI.lib")
|
#pragma comment(lib, "IPHLPAPI.lib")
|
||||||
#include "WebView2.h"
|
#include "WebView2.h"
|
||||||
|
#pragma comment(lib, "uxtheme.lib")
|
||||||
|
|
||||||
DEFINE_GUID(IID_ITaskbarList,
|
DEFINE_GUID(IID_ITaskbarList,
|
||||||
0x56FDF342, 0xFD6D, 0x11d0, 0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90);
|
0x56FDF342, 0xFD6D, 0x11d0, 0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#define VER_MAJOR 22000
|
#define VER_MAJOR 22000
|
||||||
#define VER_MINOR 469
|
#define VER_MINOR 469
|
||||||
#define VER_BUILD_HI 42
|
#define VER_BUILD_HI 42
|
||||||
#define VER_BUILD_LO 0
|
#define VER_BUILD_LO 1
|
||||||
#define VER_FLAGS VS_FF_PRERELEASE
|
#define VER_FLAGS VS_FF_PRERELEASE
|
||||||
|
|
||||||
|
|
||||||
@ -12,5 +12,5 @@
|
|||||||
#define VER_STR(arg) #arg
|
#define VER_STR(arg) #arg
|
||||||
|
|
||||||
// The String form of the version numbers
|
// The String form of the version numbers
|
||||||
#define VER_FILE_STRING VALUE "FileVersion", "22000.469.42.0"
|
#define VER_FILE_STRING VALUE "FileVersion", "22000.469.42.1"
|
||||||
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.469.42.0"
|
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.469.42.1"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user