diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/Off-NotInUse Dark.png b/src/modules/videoconference/VideoConferenceModule/Icons/Off-NotInUse Dark.png index c22c77705b..08446a2078 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/Off-NotInUse Dark.png and b/src/modules/videoconference/VideoConferenceModule/Icons/Off-NotInUse Dark.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/Off-NotInUse Light.png b/src/modules/videoconference/VideoConferenceModule/Icons/Off-NotInUse Light.png index aab6946637..285ea495b8 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/Off-NotInUse Light.png and b/src/modules/videoconference/VideoConferenceModule/Icons/Off-NotInUse Light.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/Off-Off Dark.png b/src/modules/videoconference/VideoConferenceModule/Icons/Off-Off Dark.png index eb0895c6db..32d7559e73 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/Off-Off Dark.png and b/src/modules/videoconference/VideoConferenceModule/Icons/Off-Off Dark.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/Off-Off Light.png b/src/modules/videoconference/VideoConferenceModule/Icons/Off-Off Light.png index 160023f4c4..7f0477ff89 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/Off-Off Light.png and b/src/modules/videoconference/VideoConferenceModule/Icons/Off-Off Light.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/Off-On Dark.png b/src/modules/videoconference/VideoConferenceModule/Icons/Off-On Dark.png index 0055fee566..ac33d985c8 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/Off-On Dark.png and b/src/modules/videoconference/VideoConferenceModule/Icons/Off-On Dark.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/Off-On Light.png b/src/modules/videoconference/VideoConferenceModule/Icons/Off-On Light.png index db03c24ffe..a43b3cf364 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/Off-On Light.png and b/src/modules/videoconference/VideoConferenceModule/Icons/Off-On Light.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/On-NotInUse Dark.png b/src/modules/videoconference/VideoConferenceModule/Icons/On-NotInUse Dark.png index 67eabf8f1a..ff34ff3eb5 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/On-NotInUse Dark.png and b/src/modules/videoconference/VideoConferenceModule/Icons/On-NotInUse Dark.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/On-NotInUse Light.png b/src/modules/videoconference/VideoConferenceModule/Icons/On-NotInUse Light.png index cac03b85cd..b4e5edaea5 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/On-NotInUse Light.png and b/src/modules/videoconference/VideoConferenceModule/Icons/On-NotInUse Light.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/On-Off Dark.png b/src/modules/videoconference/VideoConferenceModule/Icons/On-Off Dark.png index 3c072fc2cf..8492439759 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/On-Off Dark.png and b/src/modules/videoconference/VideoConferenceModule/Icons/On-Off Dark.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/On-Off Light.png b/src/modules/videoconference/VideoConferenceModule/Icons/On-Off Light.png index e54271890d..b011e944bb 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/On-Off Light.png and b/src/modules/videoconference/VideoConferenceModule/Icons/On-Off Light.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/On-On Dark.png b/src/modules/videoconference/VideoConferenceModule/Icons/On-On Dark.png index 325e5cffd2..6f1955d2d2 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/On-On Dark.png and b/src/modules/videoconference/VideoConferenceModule/Icons/On-On Dark.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Icons/On-On Light.png b/src/modules/videoconference/VideoConferenceModule/Icons/On-On Light.png index fce4e9baa3..b9fb04c6a6 100644 Binary files a/src/modules/videoconference/VideoConferenceModule/Icons/On-On Light.png and b/src/modules/videoconference/VideoConferenceModule/Icons/On-On Light.png differ diff --git a/src/modules/videoconference/VideoConferenceModule/Toolbar.cpp b/src/modules/videoconference/VideoConferenceModule/Toolbar.cpp index 0477718793..58eaaa4b65 100644 --- a/src/modules/videoconference/VideoConferenceModule/Toolbar.cpp +++ b/src/modules/videoconference/VideoConferenceModule/Toolbar.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "Logging.h" #include "VideoConferenceModule.h" @@ -14,6 +15,7 @@ const int REFRESH_RATE = 100; const int OVERLAY_SHOW_TIME = 500; const int BORDER_OFFSET = 12; const int TOP_RIGHT_BORDER_OFFSET = 40; +std::wstring cached_position = L""; Toolbar::Toolbar() { @@ -43,6 +45,44 @@ void Toolbar::scheduleGeneralSettingsUpdate() generalSettingsUpdateScheduled = true; } +inline POINT calculateToolbarPositioning(Box const& screenSize, std::wstring& position, const int desiredWidth, const int desiredHeight) +{ + POINT p; + p.x = p.y = 0; + + if (position == L"Top left corner") + { + p.x = screenSize.left() + BORDER_OFFSET; + p.y = screenSize.top() + BORDER_OFFSET; + } + else if (position == L"Top center") + { + p.x = screenSize.middle().x - desiredWidth / 2; + p.y = screenSize.top() + BORDER_OFFSET; + } + else if (position == L"Bottom left corner") + { + p.x = screenSize.left() + BORDER_OFFSET; + p.y = screenSize.bottom() - desiredHeight - BORDER_OFFSET; + } + else if (position == L"Bottom center") + { + p.x = screenSize.middle().x - desiredWidth / 2; + p.y = screenSize.bottom() - desiredHeight - BORDER_OFFSET; + } + else if (position == L"Bottom right corner") + { + p.x = screenSize.right() - desiredWidth - BORDER_OFFSET; + p.y = screenSize.bottom() - desiredHeight - BORDER_OFFSET; + } + else //"Top right corner" or non-present + { + p.x = screenSize.right() - desiredWidth - BORDER_OFFSET; + p.y = screenSize.top() + TOP_RIGHT_BORDER_OFFSET; + } + return p; +} + LRESULT Toolbar::WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) @@ -53,8 +93,10 @@ LRESULT Toolbar::WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARA { int x = GET_X_LPARAM(lparam); int y = GET_Y_LPARAM(lparam); + UINT dpi = DPIAware::DEFAULT_DPI; + DPIAware::GetScreenDPIForWindow(hwnd, dpi); - if (x < 322 / 2) + if (x < 322 * static_cast(dpi) / static_cast(DPIAware::DEFAULT_DPI) / 2) { VideoConferenceModule::reverseMicrophoneMute(); } @@ -65,11 +107,41 @@ LRESULT Toolbar::WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARA return DefWindowProcW(hwnd, msg, wparam, lparam); } + case WM_DPICHANGED: + { + UINT dpi = LOWORD(dpi); + RECT* prcNewWindow = reinterpret_cast(lparam); + + POINT suggestedPosition; + suggestedPosition.x = prcNewWindow->left; + suggestedPosition.y = prcNewWindow->top; + + int desiredWidth = prcNewWindow->right - prcNewWindow->left; + int desiredHeight = prcNewWindow->bottom - prcNewWindow->top; + + HMONITOR hMonitor = MonitorFromPoint(suggestedPosition, MONITOR_DEFAULTTONEAREST); + + MonitorInfo info{ hMonitor }; + + suggestedPosition = calculateToolbarPositioning(info.GetScreenSize(false), cached_position, desiredWidth, desiredHeight); + + SetWindowPos(hwnd, + NULL, + suggestedPosition.x, + suggestedPosition.y, + desiredWidth, + desiredHeight, + SWP_NOZORDER | SWP_NOACTIVATE); + return DefWindowProcW(hwnd, msg, wparam, lparam); + } case WM_CREATE: case WM_PAINT: { PAINTSTRUCT ps; HDC hdc; + UINT dpi = DPIAware::DEFAULT_DPI; + + DPIAware::GetScreenDPIForWindow(hwnd, dpi); hdc = BeginPaint(hwnd, &ps); @@ -119,7 +191,8 @@ LRESULT Toolbar::WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARA toolbarImage = themeImages->camOnMicOn; } } - graphic.DrawImage(toolbarImage, 0, 0, toolbarImage->GetWidth(), toolbarImage->GetHeight()); + // Images are scaled by 4 to support higher dpi values. + graphic.DrawImage(toolbarImage, 0, 0, toolbarImage->GetWidth() / 4 * dpi / DPIAware::DEFAULT_DPI, toolbarImage->GetHeight() / 4 * dpi / DPIAware::DEFAULT_DPI); EndPaint(hwnd, &ps); break; @@ -194,14 +267,16 @@ LRESULT Toolbar::WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARA void Toolbar::show(std::wstring position, std::wstring monitorString) { + cached_position = position; for (auto& hwnd : hwnds) { PostMessageW(hwnd, WM_CLOSE, 0, 0); } hwnds.clear(); - int overlayWidth = darkImages.camOffMicOff->GetWidth(); - int overlayHeight = darkImages.camOffMicOff->GetHeight(); + // Images are scaled by 4 to support higher dpi values. + int overlayWidth = darkImages.camOffMicOff->GetWidth() / 4; + int overlayHeight = darkImages.camOffMicOff->GetHeight() / 4; // Register the window class LPCWSTR CLASS_NAME = L"MuteNotificationWindowClass"; @@ -231,39 +306,13 @@ void Toolbar::show(std::wstring position, std::wstring monitorString) for (auto& monitorInfo : monitorInfos) { const auto screenSize = monitorInfo.GetScreenSize(false); - int positionX = 0; - int positionY = 0; + UINT dpi = DPIAware::DEFAULT_DPI; + DPIAware::GetScreenDPIForMonitor(monitorInfo.GetHandle(), dpi); - if (position == L"Top left corner") - { - positionX = screenSize.left() + BORDER_OFFSET; - positionY = screenSize.top() + BORDER_OFFSET; - } - else if (position == L"Top center") - { - positionX = screenSize.middle().x - overlayWidth / 2; - positionY = screenSize.top() + BORDER_OFFSET; - } - else if (position == L"Bottom left corner") - { - positionX = screenSize.left() + BORDER_OFFSET; - positionY = screenSize.bottom() - overlayHeight - BORDER_OFFSET; - } - else if (position == L"Bottom center") - { - positionX = screenSize.middle().x - overlayWidth / 2; - positionY = screenSize.bottom() - overlayHeight - BORDER_OFFSET; - } - else if (position == L"Bottom right corner") - { - positionX = screenSize.right() - overlayWidth - BORDER_OFFSET; - positionY = screenSize.bottom() - overlayHeight - BORDER_OFFSET; - } - else //"Top right corner" or non-present - { - positionX = screenSize.right() - overlayWidth - BORDER_OFFSET; - positionY = screenSize.top() + TOP_RIGHT_BORDER_OFFSET; - } + int scaledOverlayWidth = overlayWidth * dpi / DPIAware::DEFAULT_DPI; + int scaledOverlayHeight = overlayHeight * dpi / DPIAware::DEFAULT_DPI; + + POINT p = calculateToolbarPositioning(screenSize, position, scaledOverlayWidth, scaledOverlayHeight); HWND hwnd; hwnd = CreateWindowExW( @@ -271,10 +320,10 @@ void Toolbar::show(std::wstring position, std::wstring monitorString) CLASS_NAME, CLASS_NAME, WS_POPUP, - positionX, - positionY, - overlayWidth, - overlayHeight, + static_cast(p.x), + static_cast(p.y), + scaledOverlayWidth, + scaledOverlayHeight, nullptr, nullptr, GetModuleHandleW(nullptr),