|
7 | 7 |
|
8 | 8 | #include <iostream> |
9 | 9 |
|
| 10 | +namespace { |
| 11 | + constexpr wchar_t kWindowSizeRegistryKey[] = L"Software\\ClassiPod"; |
| 12 | + constexpr wchar_t kWindowWidthValueName[] = L"WindowWidth"; |
| 13 | + constexpr wchar_t kWindowHeightValueName[] = L"WindowHeight"; |
| 14 | + constexpr wchar_t kWindowSizeIsLogicalValueName[] = L"WindowSizeIsLogical"; |
| 15 | +} |
| 16 | + |
10 | 17 | void CreateAndAttachConsole() { |
11 | 18 | if (::AllocConsole()) { |
12 | 19 | FILE *unused; |
@@ -41,6 +48,80 @@ std::vector<std::string> GetCommandLineArguments() { |
41 | 48 | return command_line_arguments; |
42 | 49 | } |
43 | 50 |
|
| 51 | +std::optional<StoredWindowSize> LoadStoredWindowSize() { |
| 52 | + HKEY key_handle; |
| 53 | + if (RegOpenKeyEx(HKEY_CURRENT_USER, kWindowSizeRegistryKey, 0, KEY_READ, |
| 54 | + &key_handle) != ERROR_SUCCESS) { |
| 55 | + return std::nullopt; |
| 56 | + } |
| 57 | + |
| 58 | + DWORD width_value = 0; |
| 59 | + DWORD width_size = sizeof(width_value); |
| 60 | + if (RegQueryValueEx(key_handle, kWindowWidthValueName, nullptr, nullptr, |
| 61 | + reinterpret_cast<LPBYTE>(&width_value), |
| 62 | + &width_size) != ERROR_SUCCESS) { |
| 63 | + RegCloseKey(key_handle); |
| 64 | + return std::nullopt; |
| 65 | + } |
| 66 | + |
| 67 | + DWORD height_value = 0; |
| 68 | + DWORD height_size = sizeof(height_value); |
| 69 | + if (RegQueryValueEx(key_handle, kWindowHeightValueName, nullptr, nullptr, |
| 70 | + reinterpret_cast<LPBYTE>(&height_value), |
| 71 | + &height_size) != ERROR_SUCCESS) { |
| 72 | + RegCloseKey(key_handle); |
| 73 | + return std::nullopt; |
| 74 | + } |
| 75 | + |
| 76 | + DWORD logical_flag = 0; |
| 77 | + DWORD logical_flag_size = sizeof(logical_flag); |
| 78 | + bool is_physical = true; |
| 79 | + if (RegQueryValueEx(key_handle, kWindowSizeIsLogicalValueName, nullptr, |
| 80 | + nullptr, reinterpret_cast<LPBYTE>(&logical_flag), |
| 81 | + &logical_flag_size) == ERROR_SUCCESS) { |
| 82 | + is_physical = logical_flag != 1; |
| 83 | + } |
| 84 | + |
| 85 | + RegCloseKey(key_handle); |
| 86 | + |
| 87 | + if (width_value == 0 || height_value == 0) { |
| 88 | + return std::nullopt; |
| 89 | + } |
| 90 | + |
| 91 | + return StoredWindowSize{static_cast<int>(width_value), |
| 92 | + static_cast<int>(height_value), is_physical}; |
| 93 | +} |
| 94 | + |
| 95 | +void SaveWindowSize(const StoredWindowSize& size) { |
| 96 | + if (size.width <= 0 || size.height <= 0) { |
| 97 | + return; |
| 98 | + } |
| 99 | + |
| 100 | + HKEY key_handle; |
| 101 | + if (RegCreateKeyEx(HKEY_CURRENT_USER, kWindowSizeRegistryKey, 0, nullptr, |
| 102 | + REG_OPTION_NON_VOLATILE, KEY_WRITE, nullptr, &key_handle, |
| 103 | + nullptr) != ERROR_SUCCESS) { |
| 104 | + return; |
| 105 | + } |
| 106 | + |
| 107 | + DWORD width_value = static_cast<DWORD>(size.width); |
| 108 | + RegSetValueEx(key_handle, kWindowWidthValueName, 0, REG_DWORD, |
| 109 | + reinterpret_cast<const BYTE*>(&width_value), |
| 110 | + sizeof(width_value)); |
| 111 | + |
| 112 | + DWORD height_value = static_cast<DWORD>(size.height); |
| 113 | + RegSetValueEx(key_handle, kWindowHeightValueName, 0, REG_DWORD, |
| 114 | + reinterpret_cast<const BYTE*>(&height_value), |
| 115 | + sizeof(height_value)); |
| 116 | + |
| 117 | + DWORD logical_flag = size.is_physical ? 0 : 1; |
| 118 | + RegSetValueEx(key_handle, kWindowSizeIsLogicalValueName, 0, REG_DWORD, |
| 119 | + reinterpret_cast<const BYTE*>(&logical_flag), |
| 120 | + sizeof(logical_flag)); |
| 121 | + |
| 122 | + RegCloseKey(key_handle); |
| 123 | +} |
| 124 | + |
44 | 125 | std::string Utf8FromUtf16(const wchar_t* utf16_string) { |
45 | 126 | if (utf16_string == nullptr) { |
46 | 127 | return std::string(); |
|
0 commit comments