#pragma once #include namespace brightray { struct NotificationData { DesktopNotificationController* controller = nullptr; std::wstring caption; std::wstring body_text; HBITMAP image = NULL; NotificationData() = default; ~NotificationData() { if (image) DeleteObject(image); } NotificationData(const NotificationData& other) = delete; NotificationData& operator=(const NotificationData& other) = delete; }; template constexpr T ScaleForDpi(T value, unsigned dpi, unsigned source_dpi = 96) { return value * dpi / source_dpi; } struct ScreenMetrics { UINT dpi_x, dpi_y; ScreenMetrics() { typedef HRESULT WINAPI GetDpiForMonitor_t(HMONITOR, int, UINT*, UINT*); auto GetDpiForMonitor = reinterpret_cast( GetProcAddress(GetModuleHandle(TEXT("shcore")), "GetDpiForMonitor")); if (GetDpiForMonitor) { auto* monitor = MonitorFromPoint({}, MONITOR_DEFAULTTOPRIMARY); if (GetDpiForMonitor(monitor, 0, &dpi_x, &dpi_y) == S_OK) return; } HDC hdc = GetDC(NULL); dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); ReleaseDC(NULL, hdc); } template T X(T value) const { return ScaleForDpi(value, dpi_x); } template T Y(T value) const { return ScaleForDpi(value, dpi_y); } }; } // namespace brightray