| 
									
										
										
										
											2018-10-17 20:01:11 +02:00
										 |  |  | // Copyright (c) 2015 GitHub, Inc.
 | 
					
						
							|  |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef ATOM_BROWSER_NOTIFICATIONS_WIN_WIN32_DESKTOP_NOTIFICATIONS_COMMON_H_
 | 
					
						
							|  |  |  | #define ATOM_BROWSER_NOTIFICATIONS_WIN_WIN32_DESKTOP_NOTIFICATIONS_COMMON_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | #include <Windows.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-17 20:01:11 +02:00
										 |  |  | namespace atom { | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 12:11:39 +02:00
										 |  |  | struct NotificationData { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |   DesktopNotificationController* controller = nullptr; | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |   std::wstring caption; | 
					
						
							|  |  |  |   std::wstring body_text; | 
					
						
							|  |  |  |   HBITMAP image = NULL; | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |   NotificationData() = default; | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |   ~NotificationData() { | 
					
						
							|  |  |  |     if (image) | 
					
						
							|  |  |  |       DeleteObject(image); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |   NotificationData(const NotificationData& other) = delete; | 
					
						
							|  |  |  |   NotificationData& operator=(const NotificationData& other) = delete; | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  | template <typename T> | 
					
						
							| 
									
										
										
										
											2017-10-06 22:25:44 +02:00
										 |  |  | constexpr T ScaleForDpi(T value, unsigned dpi, unsigned source_dpi = 96) { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |   return value * dpi / source_dpi; | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 12:11:39 +02:00
										 |  |  | struct ScreenMetrics { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |   UINT dpi_x, dpi_y; | 
					
						
							| 
									
										
										
										
											2017-04-05 11:53:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |   ScreenMetrics() { | 
					
						
							|  |  |  |     typedef HRESULT WINAPI GetDpiForMonitor_t(HMONITOR, int, UINT*, UINT*); | 
					
						
							| 
									
										
										
										
											2017-04-05 11:53:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |     auto GetDpiForMonitor = reinterpret_cast<GetDpiForMonitor_t*>( | 
					
						
							|  |  |  |         GetProcAddress(GetModuleHandle(TEXT("shcore")), "GetDpiForMonitor")); | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |     if (GetDpiForMonitor) { | 
					
						
							| 
									
										
										
										
											2018-06-21 16:45:45 -07:00
										 |  |  |       auto* monitor = MonitorFromPoint({}, MONITOR_DEFAULTTOPRIMARY); | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |       if (GetDpiForMonitor(monitor, 0, &dpi_x, &dpi_y) == S_OK) | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:46:27 -04:00
										 |  |  |     HDC hdc = GetDC(NULL); | 
					
						
							|  |  |  |     dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); | 
					
						
							|  |  |  |     dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); | 
					
						
							|  |  |  |     ReleaseDC(NULL, hdc); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <class T> | 
					
						
							|  |  |  |   T X(T value) const { | 
					
						
							|  |  |  |     return ScaleForDpi(value, dpi_x); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   template <class T> | 
					
						
							|  |  |  |   T Y(T value) const { | 
					
						
							|  |  |  |     return ScaleForDpi(value, dpi_y); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-03-15 13:56:06 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-17 20:01:11 +02:00
										 |  |  | }  // namespace atom
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif  // ATOM_BROWSER_NOTIFICATIONS_WIN_WIN32_DESKTOP_NOTIFICATIONS_COMMON_H_
 |