├── screenshots ├── colors.png ├── fonts.png ├── misc.png ├── paths.png ├── defines.png ├── displays.png ├── envvars.png ├── metrics.png └── options.png ├── ReadMe.md └── code ├── wxsysinfoframe.h └── wxsysinfoframe.cpp /screenshots/colors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PBfordev/wxsysinfoframe/HEAD/screenshots/colors.png -------------------------------------------------------------------------------- /screenshots/fonts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PBfordev/wxsysinfoframe/HEAD/screenshots/fonts.png -------------------------------------------------------------------------------- /screenshots/misc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PBfordev/wxsysinfoframe/HEAD/screenshots/misc.png -------------------------------------------------------------------------------- /screenshots/paths.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PBfordev/wxsysinfoframe/HEAD/screenshots/paths.png -------------------------------------------------------------------------------- /screenshots/defines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PBfordev/wxsysinfoframe/HEAD/screenshots/defines.png -------------------------------------------------------------------------------- /screenshots/displays.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PBfordev/wxsysinfoframe/HEAD/screenshots/displays.png -------------------------------------------------------------------------------- /screenshots/envvars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PBfordev/wxsysinfoframe/HEAD/screenshots/envvars.png -------------------------------------------------------------------------------- /screenshots/metrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PBfordev/wxsysinfoframe/HEAD/screenshots/metrics.png -------------------------------------------------------------------------------- /screenshots/options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PBfordev/wxsysinfoframe/HEAD/screenshots/options.png -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | wxSystemInformationFrame 2 | ========= 3 | 4 | Introduction 5 | --------- 6 | 7 | wxSystemInformationFrame is a wxFrame-derived class that can be easily added to a wxWidgets application and provide a quick overview of many different OS, wxWidgets, and application settings. 8 | 9 | While this is certainly not something needed often, perhaps once in a blue moon it can save a programmer from typing a throwaway code for inspecting various variables via logging or inside the debugger. 10 | 11 | 12 | Requirements 13 | --------- 14 | 15 | wxWidgets v3 or newer, a compiler supporting C++11. 16 | 17 | Using 18 | --------- 19 | 20 | Just add *wxsysinfoframe.h* and *wxsysinfoframe.cpp* to your project/makefile and then in your application create a `wxSystemInformationFrame` instance, e.g. 21 | 22 | ```cpp 23 | #include "wxsysinfoframe.h" 24 | 25 | void MainFrame::OnShowSystemInformationFrame(wxCommandEvent&) 26 | { 27 | wxSystemInformationFrame* frame = new wxSystemInformationFrame(this); 28 | frame->Show(); 29 | } 30 | ``` 31 | 32 | Screenshots 33 | --------- 34 | 35 | ![wxSYS Colours](screenshots/colors.png?raw=true) 36 | ![wxSYS Fonts](screenshots/fonts.png?raw=true) 37 | ![wxSYS Metrics](screenshots/metrics.png?raw=true) 38 | ![Displays](screenshots/displays.png?raw=true) 39 | ![Paths](screenshots/paths.png?raw=true) 40 | ![Options](screenshots/options.png?raw=true) 41 | ![Environment Variables](screenshots/envvars.png?raw=true) 42 | ![Miscellaneous](screenshots/misc.png?raw=true) 43 | ![Preprocessor Defines](screenshots/defines.png?raw=true) 44 | 45 | Notes 46 | --------- 47 | 48 | On MSW, many values are affected by settings in the application manifests, such as DPI awareness. 49 | By C++ rules, preprocessor defines can be different in different files, so this needs to be taken into account. 50 | By OS design, once an application starts, its system environment values cannot be affected from outside the application. 51 | 52 | Licence 53 | --------- 54 | 55 | [wxWidgets licence](https://github.com/wxWidgets/wxWidgets/blob/master/docs/licence.txt) 56 | -------------------------------------------------------------------------------- /code/wxsysinfoframe.h: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////// 2 | // Author: PB 3 | // Purpose: wxSystemInformationFrame definition 4 | // Copyright: (c) 2019-2025 PB 5 | // Licence: wxWindows licence 6 | ///////////////////////////////////////////////////////////////////////////// 7 | 8 | #ifndef WX_SYSTEM_INFORMATION_FRAME_H_DEFINED 9 | #define WX_SYSTEM_INFORMATION_FRAME_H_DEFINED 10 | 11 | 12 | #define WX_SYSTEM_INFORMATION_FRAME_MAJOR_VERSION 4 13 | #define WX_SYSTEM_INFORMATION_FRAME_MINOR_VERSION 9 14 | #define WX_SYSTEM_INFORMATION_FRAME_VERSION_STRING "4.9" 15 | 16 | #include 17 | #include 18 | 19 | // avoid unnecessary includes 20 | class WXDLLIMPEXP_FWD_CORE wxNotebook; 21 | class WXDLLIMPEXP_FWD_CORE wxTextCtrl; 22 | 23 | class wxSystemInformationFrame : public wxFrame 24 | { 25 | public: 26 | enum CreateFlags 27 | { 28 | // whether the values automatically refresh in response to 29 | // certain WM_* messages 30 | AutoRefresh = 1, 31 | 32 | // whether to display these pages with values, at least one of these 33 | // must be specified when creating wxSystemInformationFrame 34 | ViewSystemColours = 1 << 1, 35 | ViewSystemFonts = 1 << 2, 36 | ViewSystemMetrics = 1 << 3, 37 | ViewDisplays = 1 << 4, 38 | ViewStandardPaths = 1 << 5, 39 | ViewSystemOptions = 1 << 6, 40 | ViewEnvironmentVariables = 1 << 7, 41 | ViewMiscellaneous = 1 << 8, 42 | ViewPreprocessorDefines = 1 << 9, 43 | }; 44 | 45 | static const long DefaultCreateFlags = AutoRefresh 46 | | ViewSystemColours | ViewSystemFonts | ViewSystemMetrics 47 | | ViewDisplays | ViewStandardPaths | ViewSystemOptions 48 | | ViewEnvironmentVariables | ViewMiscellaneous 49 | | ViewPreprocessorDefines; 50 | 51 | 52 | wxSystemInformationFrame(wxWindow *parent, wxWindowID id, const wxString &title, 53 | const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, 54 | long frameStyle = wxDEFAULT_FRAME_STYLE, 55 | long createFlags = DefaultCreateFlags); 56 | 57 | // this simple constructor creates the frame on a wxDefaultPosition, 58 | // with "wxSystemInformationFrame" as the title 59 | // and wxDEFAULT_FRAME_STYLE frameStyle 60 | wxSystemInformationFrame(wxWindow* parent, const wxSize& size = wxSize(1024, 800), 61 | long createFlags = DefaultCreateFlags); 62 | 63 | bool Create(wxWindow *parent, wxWindowID id, const wxString &title, 64 | const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, 65 | long frameStyle = wxDEFAULT_FRAME_STYLE, 66 | long createFlags = DefaultCreateFlags); 67 | 68 | void RefreshValues() { UpdateValues(); } 69 | 70 | // Returns the values for the visible views as the name and value pair separated 71 | // by the separator except for displays where there can be more than one display and 72 | // therefore value for each parameter. 73 | wxArrayString GetValues(const wxString& separator = "\t") const; 74 | 75 | #ifdef __WXMSW__ // for WM_* messages 76 | WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) override; 77 | #endif // #ifdef __WXMSW__ 78 | 79 | private: 80 | bool m_autoRefresh{true}; 81 | 82 | wxNotebook* m_pages{nullptr}; 83 | wxTextCtrl* m_logCtrl{nullptr}; 84 | 85 | wxTimer m_valuesUpdateTimer; 86 | 87 | wxArrayString m_unloggedInformation; 88 | 89 | void LogInformation(const wxString& information); 90 | 91 | void TriggerValuesUpdate(); 92 | void UpdateValues(); 93 | 94 | void OnRefresh(wxCommandEvent&); 95 | void OnShowDetailedInformation(wxCommandEvent&); 96 | void OnShowwxInfoMessageBox(wxCommandEvent&); 97 | void OnSave(wxCommandEvent&); 98 | void OnClearLog(wxCommandEvent&); 99 | void OnUpdateUI(wxUpdateUIEvent& event); 100 | void OnUpdateValuesTimer(wxTimerEvent&); 101 | void OnSysColourChanged(wxSysColourChangedEvent& event); 102 | void OnDisplayChanged(wxDisplayChangedEvent& event); 103 | #if wxCHECK_VERSION(3, 1, 3) 104 | void OnDPIChanged(wxDPIChangedEvent& event); 105 | #endif 106 | }; 107 | 108 | #endif //ifndef WX_SYSTEM_INFORMATION_FRAME_H_DEFINED 109 | -------------------------------------------------------------------------------- /code/wxsysinfoframe.cpp: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////// 2 | // Author: PB 3 | // Purpose: Implementation of wxSystemInformationFrame and its helpers 4 | // Copyright: (c) 2019-2025 PB 5 | // Licence: wxWindows licence 6 | ///////////////////////////////////////////////////////////////////////////// 7 | 8 | #include 9 | 10 | #ifndef WX_PRECOMP 11 | #include 12 | #endif 13 | 14 | #if !wxCHECK_VERSION(3, 0, 0) 15 | #error wxSystemInformationFrame requires wxWidgets version 3 or higher 16 | #endif 17 | 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #ifdef __WXMSW__ 30 | #include 31 | #endif 32 | #include 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include 38 | #include 39 | #include 40 | #include 41 | #include 42 | #if wxCHECK_VERSION(3, 1, 6) 43 | #include 44 | #endif 45 | #include 46 | #include 47 | 48 | #ifdef __WXMSW__ 49 | #include 50 | 51 | #include 52 | #include 53 | #endif 54 | #ifdef __WXGTK__ 55 | #include 56 | #endif 57 | 58 | #if (__cplusplus >= 202002L) 59 | #include 60 | #else 61 | #include 62 | #endif 63 | 64 | 65 | #include 66 | #include 67 | 68 | #include "wxsysinfoframe.h" 69 | 70 | namespace { // anonymous namespace for helper classes and functions 71 | 72 | wxString wxRectTowxString(const wxRect& r) 73 | { 74 | return wxString::Format(_("%d, %d; %d, %d"), 75 | r.GetLeft(), r.GetTop(), r.GetRight(), r.GetBottom()); 76 | } 77 | 78 | wxString wxSizeTowxString(const wxSize& s) 79 | { 80 | return wxString::Format(_("%d x %d"), s.x, s.y); 81 | } 82 | 83 | 84 | /************************************************* 85 | 86 | SysInfoListView 87 | 88 | *************************************************/ 89 | 90 | class SysInfoListView : public wxListView 91 | { 92 | public: 93 | SysInfoListView(wxWindow* parent); 94 | 95 | void UpdateValues(); 96 | void ShowDetailedInformation() const; 97 | 98 | virtual bool CanShowDetailedInformation() const { return false; } 99 | 100 | virtual wxArrayString GetValues(const wxString& separator = "\t") const = 0; 101 | protected: 102 | std::map m_columnWidths; 103 | 104 | long AppendItemWithData(const wxString& label, long data); 105 | 106 | virtual void DoUpdateValues() = 0; 107 | virtual void DoShowDetailedInformation(long WXUNUSED(listItemIndex)) const {}; 108 | 109 | wxArrayString GetNameAndValueValues(int nameColumnIndex, int valueColumnIndex, const wxString& separator) const; 110 | 111 | void AutoSizeColumns(); 112 | 113 | void OnColumnEndDrag(wxListEvent& event); 114 | void OnItemActivated(wxListEvent& event); 115 | }; 116 | 117 | SysInfoListView::SysInfoListView(wxWindow* parent) 118 | : wxListView(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_SINGLE_SEL) 119 | { 120 | Bind(wxEVT_LIST_COL_END_DRAG, &SysInfoListView::OnColumnEndDrag, this); 121 | Bind(wxEVT_LIST_ITEM_ACTIVATED, &SysInfoListView::OnItemActivated, this); 122 | } 123 | 124 | void SysInfoListView::UpdateValues() 125 | { 126 | wxWindowUpdateLocker updateLocker(this); 127 | 128 | DoUpdateValues(); 129 | AutoSizeColumns(); 130 | 131 | if ( GetFirstSelected() == -1 && GetItemCount() > 0 ) 132 | { 133 | Select(0); 134 | Focus(0); 135 | } 136 | } 137 | 138 | void SysInfoListView::ShowDetailedInformation() const 139 | { 140 | DoShowDetailedInformation(GetFirstSelected()); 141 | } 142 | 143 | long SysInfoListView::AppendItemWithData(const wxString& label, long data) 144 | { 145 | const long itemIndex = InsertItem(GetItemCount(), label); 146 | 147 | if ( itemIndex == -1 ) 148 | wxLogError(_("Could not insert item with label '%s'"), label); 149 | else 150 | SetItemData(itemIndex, data); 151 | 152 | return itemIndex; 153 | } 154 | 155 | wxArrayString SysInfoListView::GetNameAndValueValues(int nameColumnIndex, int valueColumnIndex, const wxString& separator) const 156 | { 157 | const int itemCount = GetItemCount(); 158 | 159 | wxArrayString values; 160 | 161 | values.reserve(itemCount + 1); 162 | 163 | // column headings 164 | values.push_back(wxString::Format(wxS("%s%s%s"), _("Name"), separator, _("Value"))); 165 | 166 | // dump values 167 | for ( int i = 0; i < itemCount; ++i ) 168 | { 169 | values.push_back(wxString::Format(wxS("%s%s%s"), 170 | GetItemText(i, nameColumnIndex), 171 | separator, 172 | GetItemText(i, valueColumnIndex))); 173 | } 174 | 175 | return values; 176 | } 177 | 178 | void SysInfoListView::AutoSizeColumns() 179 | { 180 | const int columnCount = GetColumnCount(); 181 | 182 | for ( int i = 0; i < columnCount; ++i ) 183 | { 184 | const auto it = m_columnWidths.find(i); 185 | 186 | if ( it != m_columnWidths.end() ) 187 | SetColumnWidth(i, it->second); 188 | else 189 | SetColumnWidth(i, wxLIST_AUTOSIZE); 190 | } 191 | } 192 | 193 | void SysInfoListView::OnColumnEndDrag(wxListEvent& event) 194 | { 195 | event.Skip(); 196 | m_columnWidths[event.GetColumn()] = GetColumnWidth(event.GetColumn()); 197 | } 198 | 199 | void SysInfoListView::OnItemActivated(wxListEvent& event) 200 | { 201 | DoShowDetailedInformation(event.GetIndex()); 202 | } 203 | 204 | 205 | /************************************************* 206 | 207 | SystemSettingView 208 | 209 | *************************************************/ 210 | 211 | class SystemSettingView : public SysInfoListView 212 | { 213 | public: 214 | SystemSettingView(wxWindow* parent); 215 | 216 | wxArrayString GetValues(const wxString& separator) const override 217 | { 218 | return GetNameAndValueValues(Column_Name, Column_Value, separator); 219 | } 220 | protected: 221 | enum 222 | { 223 | Column_Name = 0, 224 | Column_Value, 225 | Column_Description 226 | }; 227 | }; 228 | 229 | SystemSettingView::SystemSettingView(wxWindow* parent) 230 | : SysInfoListView(parent) 231 | { 232 | InsertColumn(Column_Name, _("Name")); 233 | InsertColumn(Column_Value, _("Value")); 234 | InsertColumn(Column_Description, _("Description")); 235 | } 236 | 237 | 238 | /************************************************* 239 | 240 | SystemColourView 241 | 242 | *************************************************/ 243 | 244 | class SystemColourView : public SystemSettingView 245 | { 246 | public: 247 | SystemColourView(wxWindow* parent); 248 | ~SystemColourView(); 249 | 250 | bool CanShowDetailedInformation() const override { return GetFirstSelected() != -1; } 251 | 252 | void SetColourBitmapOutlineColour(const wxColour& outlineColour); 253 | wxColour GetColourBitmapOutlineColour() const { return m_outlineColour; } 254 | 255 | static wxColour GetDefaultColourBitmapOutlineColour(); 256 | protected: 257 | void DoUpdateValues() override; 258 | void DoShowDetailedInformation(long listItemIndex) const override; 259 | private: 260 | wxImageList* m_imageList{nullptr}; 261 | wxColour m_outlineColour; 262 | std::set m_deprecatedColourList; 263 | 264 | wxBitmap CreateColourBitmap(const wxColour& colour, const wxSize& size); 265 | 266 | void CreateDeprecatedColourList(); 267 | bool IsDeprecatedSystemColour(wxSystemColour index); 268 | }; 269 | 270 | struct ColourInfo 271 | { 272 | wxSystemColour index; 273 | const char* name; 274 | const char* description; 275 | }; 276 | 277 | ColourInfo const s_colourInfoArray[] = 278 | { 279 | wxSYS_COLOUR_SCROLLBAR, "wxSYS_COLOUR_SCROLLBAR", "The scrollbar grey area.", 280 | wxSYS_COLOUR_DESKTOP, "wxSYS_COLOUR_DESKTOP", "The desktop colour.", 281 | wxSYS_COLOUR_ACTIVECAPTION, "wxSYS_COLOUR_ACTIVECAPTION", "Active window caption colour.", 282 | wxSYS_COLOUR_INACTIVECAPTION, "wxSYS_COLOUR_INACTIVECAPTION", "Inactive window caption colour.", 283 | wxSYS_COLOUR_MENU, "wxSYS_COLOUR_MENU", "Menu background colour.", 284 | wxSYS_COLOUR_WINDOW, "wxSYS_COLOUR_WINDOW", "Window background colour.", 285 | wxSYS_COLOUR_WINDOWFRAME, "wxSYS_COLOUR_WINDOWFRAME", "Window frame colour.", 286 | wxSYS_COLOUR_MENUTEXT, "wxSYS_COLOUR_MENUTEXT", "Colour of the text used in the menus.", 287 | wxSYS_COLOUR_WINDOWTEXT, "wxSYS_COLOUR_WINDOWTEXT", "Colour of the text used in generic windows.", 288 | wxSYS_COLOUR_CAPTIONTEXT, "wxSYS_COLOUR_CAPTIONTEXT", "Colour of the text used in captions, size boxes and scrollbar arrow boxes.", 289 | wxSYS_COLOUR_ACTIVEBORDER, "wxSYS_COLOUR_ACTIVEBORDER", "Active window border colour.", 290 | wxSYS_COLOUR_INACTIVEBORDER, "wxSYS_COLOUR_INACTIVEBORDER", "Inactive window border colour.", 291 | wxSYS_COLOUR_APPWORKSPACE, "wxSYS_COLOUR_APPWORKSPACE", "Background colour for MDI applications.", 292 | wxSYS_COLOUR_HIGHLIGHT, "wxSYS_COLOUR_HIGHLIGHT", "Colour of item(s) selected in a control.", 293 | wxSYS_COLOUR_HIGHLIGHTTEXT, "wxSYS_COLOUR_HIGHLIGHTTEXT", "Colour of the text of item(s) selected in a control.", 294 | wxSYS_COLOUR_BTNFACE, "wxSYS_COLOUR_BTNFACE", "Face shading colour on push buttons.", 295 | wxSYS_COLOUR_BTNSHADOW, "wxSYS_COLOUR_BTNSHADOW", "Edge shading colour on push buttons.", 296 | wxSYS_COLOUR_GRAYTEXT, "wxSYS_COLOUR_GRAYTEXT", "Colour of greyed (disabled) text.", 297 | wxSYS_COLOUR_BTNTEXT, "wxSYS_COLOUR_BTNTEXT", "Colour of the text on push buttons.", 298 | wxSYS_COLOUR_INACTIVECAPTIONTEXT, "wxSYS_COLOUR_INACTIVECAPTIONTEXT", "Colour of the text in active captions.", 299 | wxSYS_COLOUR_BTNHIGHLIGHT, "wxSYS_COLOUR_BTNHIGHLIGHT", "Highlight colour for buttons.", 300 | wxSYS_COLOUR_3DDKSHADOW, "wxSYS_COLOUR_3DDKSHADOW", "Dark shadow colour for three-dimensional display elements.", 301 | wxSYS_COLOUR_3DLIGHT, "wxSYS_COLOUR_3DLIGHT", "Light colour for three-dimensional display elements.", 302 | wxSYS_COLOUR_INFOTEXT, "wxSYS_COLOUR_INFOTEXT", "Text colour for tooltip controls.", 303 | wxSYS_COLOUR_INFOBK, "wxSYS_COLOUR_INFOBK", "Background colour for tooltip controls.", 304 | wxSYS_COLOUR_LISTBOX, "wxSYS_COLOUR_LISTBOX", "Background colour for list-like controls.", 305 | wxSYS_COLOUR_HOTLIGHT, "wxSYS_COLOUR_HOTLIGHT", "Colour for a hyperlink or hot-tracked item.", 306 | wxSYS_COLOUR_GRADIENTACTIVECAPTION, "wxSYS_COLOUR_GRADIENTACTIVECAPTION", "Right side colour in the color gradient of an active window's title bar.", 307 | wxSYS_COLOUR_GRADIENTINACTIVECAPTION, "wxSYS_COLOUR_GRADIENTINACTIVECAPTION", "Right side colour in the color gradient of an inactive window's title bar.", 308 | wxSYS_COLOUR_MENUHILIGHT, "wxSYS_COLOUR_MENUHILIGHT", "The colour used to highlight menu items when the menu appears as a flat menu.", 309 | wxSYS_COLOUR_MENUBAR, "wxSYS_COLOUR_MENUBAR", "The background colour for the menu bar when menus appear as flat menus.", 310 | wxSYS_COLOUR_LISTBOXTEXT, "wxSYS_COLOUR_LISTBOXTEXT", "Text colour for list-like controls.", 311 | wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT, "wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT", "Text colour for the unfocused selection of list-like controls.", 312 | wxSYS_COLOUR_BACKGROUND, "wxSYS_COLOUR_BACKGROUND", "Synonym for wxSYS_COLOUR_DESKTOP.", 313 | wxSYS_COLOUR_3DFACE, "wxSYS_COLOUR_3DFACE", "Synonym for wxSYS_COLOUR_BTNFACE.", 314 | wxSYS_COLOUR_3DSHADOW, "wxSYS_COLOUR_3DSHADOW", "Synonym for wxSYS_COLOUR_BTNSHADOW.", 315 | wxSYS_COLOUR_BTNHILIGHT, "wxSYS_COLOUR_BTNHILIGHT", "Synonym for wxSYS_COLOUR_BTNHIGHLIGHT.", 316 | wxSYS_COLOUR_3DHIGHLIGHT, "wxSYS_COLOUR_3DHIGHLIGHT", "Synonym for wxSYS_COLOUR_BTNHIGHLIGHT.", 317 | wxSYS_COLOUR_3DHILIGHT, "wxSYS_COLOUR_3DHILIGHT", "Synonym for wxSYS_COLOUR_BTNHIGHLIGHT.", 318 | wxSYS_COLOUR_FRAMEBK, "wxSYS_COLOUR_FRAMEBK", "Synonym for wxSYS_COLOUR_BTNFACE.", 319 | }; 320 | 321 | SystemColourView::SystemColourView(wxWindow* parent) 322 | : SystemSettingView(parent) 323 | { 324 | CreateDeprecatedColourList(); 325 | 326 | SetColourBitmapOutlineColour(GetDefaultColourBitmapOutlineColour()); 327 | 328 | for ( size_t i = 0; i < WXSIZEOF(s_colourInfoArray); ++i ) 329 | { 330 | if ( IsDeprecatedSystemColour(s_colourInfoArray[i].index) ) 331 | continue; 332 | 333 | const wxString colourName = s_colourInfoArray[i].name; 334 | const wxString colourDescription = s_colourInfoArray[i].description; 335 | const long itemIndex = InsertItem(i, colourName, -1); 336 | 337 | if ( itemIndex != -1 ) 338 | { 339 | SetItem(itemIndex, Column_Description, colourDescription); 340 | SetItemData(itemIndex, (long)i); 341 | } 342 | } 343 | 344 | UpdateValues(); 345 | } 346 | 347 | SystemColourView::~SystemColourView() 348 | { 349 | if ( m_imageList ) 350 | delete m_imageList; 351 | } 352 | 353 | void SystemColourView::SetColourBitmapOutlineColour(const wxColour& outlineColour) 354 | { 355 | m_outlineColour = outlineColour; 356 | UpdateValues(); 357 | } 358 | 359 | wxColour SystemColourView::GetDefaultColourBitmapOutlineColour() 360 | { 361 | const wxColour defaultOutlineColour(202, 31, 123); // magenta 362 | 363 | return defaultOutlineColour; 364 | } 365 | 366 | void SystemColourView::DoUpdateValues() 367 | { 368 | wxSize size; 369 | 370 | if ( m_imageList ) 371 | { 372 | SetImageList(nullptr, wxIMAGE_LIST_SMALL); 373 | delete m_imageList; 374 | } 375 | 376 | m_imageList = new wxImageList(); 377 | 378 | size.SetWidth(wxSystemSettings::GetMetric(wxSYS_SMALLICON_X, this)); 379 | size.SetHeight(wxSystemSettings::GetMetric(wxSYS_SMALLICON_Y, this)); 380 | 381 | // work around wxSystemSettings::GetMetric(wxSYS_SMALLICON_{X|Y}) value 382 | // being unavailable 383 | if ( !size.IsFullySpecified() ) 384 | { 385 | size.Set(16, 16); 386 | #if wxCHECK_VERSION(3, 1, 0) 387 | size = FromDIP(size); 388 | #endif 389 | } 390 | 391 | m_imageList->Create(size.GetWidth(), size.GetHeight(), false); 392 | SetImageList(m_imageList, wxIMAGE_LIST_SMALL); 393 | 394 | const int itemCount = GetItemCount(); 395 | 396 | for ( int i = 0; i < itemCount; ++i ) 397 | { 398 | const wxColour colour = wxSystemSettings::GetColour(s_colourInfoArray[GetItemData(i)].index); 399 | const int imageIndex = m_imageList->Add(CreateColourBitmap(colour.IsOk() ? colour : GetColourBitmapOutlineColour(), size)); 400 | wxString colourValue = _(""); 401 | 402 | if ( colour.IsOk() ) 403 | { 404 | colourValue = colour.GetAsString(wxC2S_CSS_SYNTAX); 405 | 406 | if ( !colour.IsSolid() ) 407 | colourValue += _(", not solid"); 408 | } 409 | 410 | SetItem(i, Column_Value, colourValue, imageIndex); 411 | } 412 | } 413 | 414 | void SystemColourView::DoShowDetailedInformation(long listItemIndex) const 415 | { 416 | const size_t infoArrayIndex = GetItemData(listItemIndex); 417 | const wxString valueName = s_colourInfoArray[infoArrayIndex].name; 418 | const wxColour colour = wxSystemSettings::GetColour(s_colourInfoArray[infoArrayIndex].index); 419 | 420 | if ( !colour.IsOk() ) 421 | { 422 | wxLogError(_("Invalid colour for \"%s\"."), valueName); 423 | return; 424 | } 425 | 426 | wxColourData colourData; 427 | 428 | colourData.SetCustomColour(0, colour); 429 | 430 | wxGetColourFromUser(GetParent(), colour, wxString::Format(_("Viewing %s"), valueName), &colourData); 431 | } 432 | 433 | wxBitmap SystemColourView::CreateColourBitmap(const wxColour& colour, const wxSize& size) 434 | { 435 | wxBitmap bitmap(size); 436 | wxMemoryDC memoryDC(bitmap); 437 | wxBrush brush(colour); 438 | wxPen pen(m_outlineColour, FromDIP(1)); 439 | wxDCPenChanger penChanger(memoryDC, pen); 440 | wxDCBrushChanger brushChanger(memoryDC, brush); 441 | 442 | memoryDC.DrawRectangle(wxRect(size)); 443 | memoryDC.SelectObject(wxNullBitmap); 444 | 445 | return bitmap; 446 | } 447 | 448 | void SystemColourView::CreateDeprecatedColourList() 449 | { 450 | #ifdef __WXMSW__ 451 | // most system colors are deprecated in Windows 10 and newer 452 | // see https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsyscolor 453 | 454 | int verMajor = 0; 455 | 456 | wxGetOsVersion(&verMajor); 457 | 458 | if ( verMajor < 10 ) 459 | return; 460 | 461 | wxCHECK_RET(m_deprecatedColourList.empty(), "list already created"); 462 | 463 | m_deprecatedColourList.insert(wxSYS_COLOUR_3DDKSHADOW); 464 | m_deprecatedColourList.insert(wxSYS_COLOUR_3DHIGHLIGHT); 465 | m_deprecatedColourList.insert(wxSYS_COLOUR_3DHILIGHT); 466 | m_deprecatedColourList.insert(wxSYS_COLOUR_3DLIGHT); 467 | m_deprecatedColourList.insert(wxSYS_COLOUR_3DSHADOW); 468 | m_deprecatedColourList.insert(wxSYS_COLOUR_ACTIVEBORDER); 469 | m_deprecatedColourList.insert(wxSYS_COLOUR_ACTIVECAPTION); 470 | m_deprecatedColourList.insert(wxSYS_COLOUR_APPWORKSPACE); 471 | m_deprecatedColourList.insert(wxSYS_COLOUR_BACKGROUND); 472 | m_deprecatedColourList.insert(wxSYS_COLOUR_BTNFACE); 473 | m_deprecatedColourList.insert(wxSYS_COLOUR_BTNHIGHLIGHT); 474 | m_deprecatedColourList.insert(wxSYS_COLOUR_BTNHILIGHT); 475 | m_deprecatedColourList.insert(wxSYS_COLOUR_BTNSHADOW); 476 | m_deprecatedColourList.insert(wxSYS_COLOUR_CAPTIONTEXT); 477 | m_deprecatedColourList.insert(wxSYS_COLOUR_DESKTOP); 478 | m_deprecatedColourList.insert(wxSYS_COLOUR_FRAMEBK); 479 | m_deprecatedColourList.insert(wxSYS_COLOUR_GRADIENTACTIVECAPTION); 480 | m_deprecatedColourList.insert(wxSYS_COLOUR_GRADIENTINACTIVECAPTION); 481 | m_deprecatedColourList.insert(wxSYS_COLOUR_INACTIVEBORDER); 482 | m_deprecatedColourList.insert(wxSYS_COLOUR_INACTIVECAPTION); 483 | m_deprecatedColourList.insert(wxSYS_COLOUR_INACTIVECAPTIONTEXT); 484 | m_deprecatedColourList.insert(wxSYS_COLOUR_INFOBK); 485 | m_deprecatedColourList.insert(wxSYS_COLOUR_INFOTEXT); 486 | m_deprecatedColourList.insert(wxSYS_COLOUR_MENU); 487 | m_deprecatedColourList.insert(wxSYS_COLOUR_MENUBAR); 488 | m_deprecatedColourList.insert(wxSYS_COLOUR_MENUHILIGHT); 489 | m_deprecatedColourList.insert(wxSYS_COLOUR_MENUTEXT); 490 | m_deprecatedColourList.insert(wxSYS_COLOUR_SCROLLBAR); 491 | m_deprecatedColourList.insert(wxSYS_COLOUR_WINDOWFRAME); 492 | #endif 493 | } 494 | 495 | bool SystemColourView::IsDeprecatedSystemColour(wxSystemColour index) 496 | { 497 | #ifndef __WXMSW__ 498 | wxUnusedVar(index); 499 | return false; 500 | #else 501 | return m_deprecatedColourList.find(index) != m_deprecatedColourList.end(); 502 | #endif 503 | } 504 | 505 | 506 | /************************************************* 507 | 508 | SystemFontView 509 | 510 | *************************************************/ 511 | 512 | class SystemFontView : public SystemSettingView 513 | { 514 | public: 515 | SystemFontView(wxWindow* parent); 516 | 517 | bool CanShowDetailedInformation() const override { return GetFirstSelected() != -1; } 518 | 519 | protected: 520 | void DoUpdateValues() override; 521 | void DoShowDetailedInformation(long listItemIndex) const override; 522 | }; 523 | 524 | struct FontInfo 525 | { 526 | wxSystemFont index; 527 | const char* name; 528 | const char* description; 529 | }; 530 | 531 | FontInfo const s_fontInfoArray[] = 532 | { 533 | wxSYS_OEM_FIXED_FONT, "wxSYS_OEM_FIXED_FONT", "Original equipment manufacturer dependent fixed-pitch font.", 534 | wxSYS_ANSI_FIXED_FONT, "wxSYS_ANSI_FIXED_FONT", "Windows fixed-pitch (monospaced) font.", 535 | wxSYS_ANSI_VAR_FONT, "wxSYS_ANSI_VAR_FONT", "Windows variable-pitch (proportional) font.", 536 | wxSYS_SYSTEM_FONT, "wxSYS_SYSTEM_FONT", "System font. By default, the system uses the system font to draw menus, dialog box controls, and text.", 537 | wxSYS_DEVICE_DEFAULT_FONT, "wxSYS_DEVICE_DEFAULT_FONT", "Device-dependent font.", 538 | wxSYS_DEFAULT_GUI_FONT, "wxSYS_DEFAULT_GUI_FONT", "Default font for user interface objects such as menus and dialog boxes.", 539 | }; 540 | 541 | SystemFontView::SystemFontView(wxWindow* parent) 542 | : SystemSettingView(parent) 543 | { 544 | for ( size_t i = 0; i < WXSIZEOF(s_fontInfoArray); ++i ) 545 | { 546 | const wxString fontName = s_fontInfoArray[i].name; 547 | const wxString fontDescription = s_fontInfoArray[i].description; 548 | const long itemIndex = AppendItemWithData(fontName, (long)i); 549 | 550 | if ( itemIndex != -1 ) 551 | SetItem(itemIndex, Column_Description, fontDescription); 552 | } 553 | 554 | UpdateValues(); 555 | } 556 | 557 | void SystemFontView::DoUpdateValues() 558 | { 559 | const int itemCount = GetItemCount(); 560 | 561 | wxLogNull logNo; 562 | 563 | for ( int i = 0; i < itemCount; ++i ) 564 | { 565 | const wxFont font = wxSystemSettings::GetFont(s_fontInfoArray[GetItemData(i)].index); 566 | wxString fontValue = _(""); 567 | 568 | if ( font.IsOk() ) 569 | fontValue = font.GetNativeFontInfoUserDesc(); 570 | 571 | SetItem(i, Column_Value, fontValue); 572 | } 573 | } 574 | 575 | void SystemFontView::DoShowDetailedInformation(long listItemIndex) const 576 | { 577 | const size_t infoArrayIndex = GetItemData(listItemIndex); 578 | 579 | const wxString valueName = s_fontInfoArray[infoArrayIndex].name; 580 | const wxFont font = wxSystemSettings::GetFont(s_fontInfoArray[infoArrayIndex].index); 581 | 582 | if ( !font.IsOk() ) 583 | { 584 | wxLogError(_("Invalid font for \"%s\"."), valueName); 585 | return; 586 | } 587 | 588 | wxGetFontFromUser(GetParent(), font, wxString::Format(_("Viewing %s"), valueName)); 589 | } 590 | 591 | 592 | /************************************************* 593 | 594 | SystemMetricView 595 | 596 | *************************************************/ 597 | 598 | class SystemMetricView : public SystemSettingView 599 | { 600 | public: 601 | SystemMetricView(wxWindow* parent); 602 | protected: 603 | void DoUpdateValues() override; 604 | }; 605 | 606 | 607 | struct MetricInfo 608 | { 609 | wxSystemMetric index; 610 | const char* name; 611 | const char* description; 612 | }; 613 | 614 | MetricInfo const s_metricInfoArray[] = 615 | { 616 | wxSYS_MOUSE_BUTTONS, "wxSYS_MOUSE_BUTTONS", "Number of buttons on mouse, or zero if no mouse was installed.", 617 | wxSYS_BORDER_X, "wxSYS_BORDER_X", "Width of single border.", 618 | wxSYS_BORDER_Y, "wxSYS_BORDER_Y", "Height of single border.", 619 | wxSYS_CURSOR_X, "wxSYS_CURSOR_X", "Width of cursor.", 620 | wxSYS_CURSOR_Y, "wxSYS_CURSOR_Y", "Height of cursor.", 621 | wxSYS_DCLICK_X, "wxSYS_DCLICK_X", "Width in pixels of rectangle within which two successive mouse clicks must fall to generate a double-click.", 622 | wxSYS_DCLICK_Y, "wxSYS_DCLICK_Y", "Height in pixels of rectangle within which two successive mouse clicks must fall to generate a double-click.", 623 | wxSYS_DRAG_X, "wxSYS_DRAG_X", "Width in pixels of a rectangle centered on a drag point to allow for limited movement of the mouse pointer before a drag operation begins.", 624 | wxSYS_DRAG_Y, "wxSYS_DRAG_Y", "Height in pixels of a rectangle centered on a drag point to allow for limited movement of the mouse pointer before a drag operation begins.", 625 | wxSYS_EDGE_X, "wxSYS_EDGE_X", "Width of a 3D border, in pixels.", 626 | wxSYS_EDGE_Y, "wxSYS_EDGE_Y", "Height of a 3D border, in pixels.", 627 | wxSYS_HSCROLL_ARROW_X, "wxSYS_HSCROLL_ARROW_X", "Width of arrow bitmap on horizontal scrollbar.", 628 | wxSYS_HSCROLL_ARROW_Y, "wxSYS_HSCROLL_ARROW_Y", "Height of arrow bitmap on horizontal scrollbar.", 629 | wxSYS_HTHUMB_X, "wxSYS_HTHUMB_X", "Width of horizontal scrollbar thumb.", 630 | wxSYS_ICON_X, "wxSYS_ICON_X", "The default width of an icon.", 631 | wxSYS_ICON_Y, "wxSYS_ICON_Y", "The default height of an icon.", 632 | wxSYS_ICONSPACING_X, "wxSYS_ICONSPACING_X", "Width of a grid cell for items in large icon view, in pixels. Each item fits into a rectangle of this size when arranged.", 633 | wxSYS_ICONSPACING_Y, "wxSYS_ICONSPACING_Y", "Height of a grid cell for items in large icon view, in pixels. Each item fits into a rectangle of this size when arranged.", 634 | wxSYS_WINDOWMIN_X, "wxSYS_WINDOWMIN_X", "Minimum width of a window.", 635 | wxSYS_WINDOWMIN_Y, "wxSYS_WINDOWMIN_Y", "Minimum height of a window.", 636 | wxSYS_SCREEN_X, "wxSYS_SCREEN_X", "Width of the screen in pixels.", 637 | wxSYS_SCREEN_Y, "wxSYS_SCREEN_Y", "Height of the screen in pixels.", 638 | wxSYS_FRAMESIZE_X, "wxSYS_FRAMESIZE_X", "Width of the window frame for a wxTHICK_FRAME window.", 639 | wxSYS_FRAMESIZE_Y, "wxSYS_FRAMESIZE_Y", "Height of the window frame for a wxTHICK_FRAME window.", 640 | wxSYS_SMALLICON_X, "wxSYS_SMALLICON_X", "Recommended width of a small icon (in window captions, and small icon view).", 641 | wxSYS_SMALLICON_Y, "wxSYS_SMALLICON_Y", "Recommended height of a small icon (in window captions, and small icon view).", 642 | wxSYS_HSCROLL_Y, "wxSYS_HSCROLL_Y", "Height of horizontal scrollbar in pixels.", 643 | wxSYS_VSCROLL_X, "wxSYS_VSCROLL_X", "Width of vertical scrollbar in pixels.", 644 | wxSYS_VSCROLL_ARROW_X, "wxSYS_VSCROLL_ARROW_X", "Width of arrow bitmap on a vertical scrollbar.", 645 | wxSYS_VSCROLL_ARROW_Y, "wxSYS_VSCROLL_ARROW_Y", "Height of arrow bitmap on a vertical scrollbar.", 646 | wxSYS_VTHUMB_Y, "wxSYS_VTHUMB_Y", "Height of vertical scrollbar thumb.", 647 | wxSYS_CAPTION_Y, "wxSYS_CAPTION_Y", "Height of normal caption area.", 648 | wxSYS_MENU_Y, "wxSYS_MENU_Y", "Height of single-line menu bar.", 649 | wxSYS_NETWORK_PRESENT, "wxSYS_NETWORK_PRESENT", "1 if there is a network present, 0 otherwise.", 650 | wxSYS_PENWINDOWS_PRESENT, "wxSYS_PENWINDOWS_PRESENT", "1 if PenWindows is installed, 0 otherwise.", 651 | wxSYS_SHOW_SOUNDS, "wxSYS_SHOW_SOUNDS", "Non-zero if the user requires an application to present information visually in situations where it would otherwise present the information only in audible form; zero otherwise.", 652 | wxSYS_SWAP_BUTTONS, "wxSYS_SWAP_BUTTONS", "Non-zero if the meanings of the left and right mouse buttons are swapped; zero otherwise.", 653 | wxSYS_DCLICK_MSEC, "wxSYS_DCLICK_MSEC", "Maximal time, in milliseconds, which may pass between subsequent clicks for a double click to be generated.", 654 | 655 | // there was a bug with these three metrics on wxMSW 656 | // until commit e5d850d (commited on Apr 18, 2019) 657 | #if wxCHECK_VERSION(3, 1, 1) && ( !defined(__WXMSW__) || wxCHECK_VERSION(3, 1, 3) ) 658 | wxSYS_CARET_ON_MSEC, "wxSYS_CARET_ON_MSEC", "Time, in milliseconds, for how long a blinking caret should stay visible during a single blink cycle before it disappears.", 659 | wxSYS_CARET_OFF_MSEC, "wxSYS_CARET_OFF_MSEC", "Time, in milliseconds, for how long a blinking caret should stay invisible during a single blink cycle before it reappears. If this value is zero, carets should be visible all the time instead of blinking. If the value is negative, the platform does not support the user setting. Implemented only on GTK+ and MacOS X.", 660 | wxSYS_CARET_TIMEOUT_MSEC, "wxSYS_CARET_TIMEOUT_MSEC", "Time, in milliseconds, for how long a caret should blink after a user interaction. After this timeout has expired, the caret should stay continuously visible until the user interacts with the caret again (for example by entering, deleting or cutting text). If this value is negative, carets should blink forever; if it is zero, carets should not blink at all.", 661 | #endif // #if wxCHECK_VERSION(3, 1, 1) && ( !defined(__WXMSW__) || wxCHECK_VERSION(3, 1, 3) ) 662 | }; 663 | 664 | SystemMetricView::SystemMetricView(wxWindow* parent) 665 | : SystemSettingView(parent) 666 | { 667 | for ( size_t i = 0; i < WXSIZEOF(s_metricInfoArray); ++i ) 668 | { 669 | const wxString metricName = s_metricInfoArray[i].name; 670 | const wxString metricDescription = s_metricInfoArray[i].description; 671 | const long itemIndex = AppendItemWithData(metricName, (long)i); 672 | 673 | if ( itemIndex != -1 ) 674 | SetItem(itemIndex, Column_Description, metricDescription); 675 | } 676 | 677 | m_columnWidths[Column_Value] = wxLIST_AUTOSIZE_USEHEADER; 678 | 679 | UpdateValues(); 680 | } 681 | 682 | void SystemMetricView::DoUpdateValues() 683 | { 684 | const int itemCount = GetItemCount(); 685 | 686 | for ( int i = 0; i < itemCount; ++i ) 687 | { 688 | const int metricValue = wxSystemSettings::GetMetric(s_metricInfoArray[GetItemData(i)].index, wxGetTopLevelParent(this)); 689 | 690 | SetItem(i, Column_Value, wxString::Format("%d", metricValue)); 691 | } 692 | } 693 | 694 | 695 | /************************************************* 696 | 697 | DisplaysView 698 | 699 | *************************************************/ 700 | 701 | #ifdef __WXMSW__ 702 | 703 | // The code for obtaining friendly monitor names is adapted from 704 | // https://gist.github.com/pavel-a/dd3a4320176e69a0f6c4b4871e69e56b 705 | 706 | BOOL CALLBACK MonitorInfoEnumProc(HMONITOR hMonitor, HDC, LPRECT, LPARAM dwData) 707 | { 708 | WinStruct info; 709 | UINT32 pathCount, modeCount; 710 | std::vector paths; 711 | std::vector modes; 712 | 713 | if ( !::GetMonitorInfoW(hMonitor, &info) ) 714 | return FALSE; 715 | 716 | if ( ::GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &pathCount, &modeCount) != ERROR_SUCCESS ) 717 | return FALSE; 718 | 719 | if ( !pathCount || !modeCount ) 720 | return FALSE; 721 | 722 | paths.resize(pathCount); 723 | modes.resize(modeCount); 724 | 725 | if ( ::QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, 726 | &pathCount, paths.data(), &modeCount, modes.data(), nullptr) != ERROR_SUCCESS ) 727 | return FALSE; 728 | 729 | for ( const auto& p : paths ) 730 | { 731 | DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName; 732 | 733 | sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME; 734 | sourceName.header.size = sizeof(sourceName); 735 | sourceName.header.adapterId = p.sourceInfo.adapterId; 736 | sourceName.header.id = p.sourceInfo.id; 737 | if ( ::DisplayConfigGetDeviceInfo(&sourceName.header) != ERROR_SUCCESS ) 738 | return FALSE; 739 | 740 | if ( ::wcscmp(info.szDevice, sourceName.viewGdiDeviceName) != 0 ) 741 | continue; 742 | 743 | DISPLAYCONFIG_TARGET_DEVICE_NAME name; 744 | 745 | name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME; 746 | name.header.size = sizeof(name); 747 | name.header.adapterId = p.sourceInfo.adapterId; 748 | name.header.id = p.targetInfo.id; 749 | if ( ::DisplayConfigGetDeviceInfo(&name.header) != ERROR_SUCCESS ) 750 | return FALSE; 751 | 752 | wxArrayString* friendlyNames = reinterpret_cast(dwData); 753 | 754 | friendlyNames->push_back(wxString(name.monitorFriendlyDeviceName)); 755 | return TRUE; 756 | } 757 | 758 | return FALSE; 759 | } 760 | 761 | #endif // #ifdef __WXMSW__ 762 | 763 | 764 | class DisplaysView : public SysInfoListView 765 | { 766 | public: 767 | DisplaysView(wxWindow* parent); 768 | 769 | wxArrayString GetValues(const wxString& separator) const override; 770 | 771 | protected: 772 | void DoUpdateValues() override; 773 | private: 774 | enum 775 | { 776 | Param_Name = 0, 777 | Param_FriendlyName, 778 | Param_IsPrimary, 779 | Param_Resolution, 780 | Param_BPP, 781 | Param_Frequency, 782 | Param_GeometryCoords, 783 | Param_GeometrySize, 784 | Param_ClientAreaCoords, 785 | Param_ClientAreaSize, 786 | Param_PPI, 787 | Param_HasThisWindow 788 | }; 789 | }; 790 | 791 | DisplaysView::DisplaysView(wxWindow* parent) 792 | : SysInfoListView(parent) 793 | { 794 | AppendColumn(_("Parameter")); 795 | 796 | AppendItemWithData(_("Name"), Param_Name); 797 | #ifdef __WXMSW__ 798 | AppendItemWithData(_("Friendly Name"), Param_FriendlyName); 799 | #endif 800 | AppendItemWithData(_("Is Primary"), Param_IsPrimary); 801 | AppendItemWithData(_("Resolution"), Param_Resolution); 802 | AppendItemWithData(_("Bits Per Pixel"), Param_BPP); 803 | AppendItemWithData(_("Refresh Frequency (Hz)"), Param_Frequency); 804 | AppendItemWithData(_("Geometry Coordinates (left, top; right, bottom)"), Param_GeometryCoords); 805 | AppendItemWithData(_("Geometry Size"), Param_GeometrySize); 806 | AppendItemWithData(_("Client Area Coordinates (left, top; right, bottom)"), Param_ClientAreaCoords); 807 | AppendItemWithData(_("Client Area Size"), Param_ClientAreaSize); 808 | AppendItemWithData(_("Pixels Per Inch"), Param_PPI); 809 | AppendItemWithData(_("Has This Window"), Param_HasThisWindow); 810 | 811 | UpdateValues(); 812 | } 813 | 814 | wxArrayString DisplaysView::GetValues(const wxString& separator) const 815 | { 816 | const int itemCount = GetItemCount(); 817 | const int columnCount = GetColumnCount(); 818 | 819 | wxArrayString values; 820 | wxString s; 821 | 822 | values.reserve(itemCount + 1); 823 | 824 | // column headings 825 | s = _("Parameter"); 826 | 827 | for ( int columnIndex = 1; columnIndex < columnCount; ++columnIndex ) 828 | { 829 | wxListItem listItem; 830 | 831 | listItem.SetMask(wxLIST_MASK_TEXT); 832 | GetColumn(columnIndex, listItem); 833 | s += separator + listItem.GetText(); 834 | } 835 | values.push_back(s); 836 | 837 | // dump values 838 | for ( int itemIndex = 0; itemIndex < itemCount; ++itemIndex ) 839 | { 840 | s = GetItemText(itemIndex, 0); 841 | for ( int columnIndex = 1; columnIndex < columnCount; ++columnIndex ) 842 | { 843 | s += separator + GetItemText(itemIndex, columnIndex); 844 | } 845 | values.push_back(s); 846 | } 847 | 848 | return values; 849 | } 850 | 851 | void DisplaysView::DoUpdateValues() 852 | { 853 | while ( GetColumnCount() > 1 ) 854 | DeleteColumn(1); 855 | 856 | const unsigned int displayCount = wxDisplay::GetCount(); 857 | const int displayForThisWindow = wxDisplay::GetFromWindow(wxGetTopLevelParent(this)); 858 | const int itemCount = GetItemCount(); 859 | 860 | #ifdef __WXMSW__ 861 | wxArrayString friendlyNames; 862 | 863 | if ( !::EnumDisplayMonitors(nullptr, nullptr, MonitorInfoEnumProc, (LPARAM)&friendlyNames) ) 864 | friendlyNames.clear(); 865 | #endif // #ifdef __WXMSW__ 866 | 867 | for ( size_t displayIndex = 0; displayIndex < displayCount; ++displayIndex ) 868 | { 869 | const wxDisplay display(displayIndex); 870 | const wxVideoMode videoMode = display.GetCurrentMode(); 871 | const wxRect geometryCoords = display.GetGeometry(); 872 | const wxRect clientAreaCoords = display.GetClientArea(); 873 | const int columnIndex = displayIndex + 1; 874 | 875 | AppendColumn(wxString::Format("wxDisplay(%zu)", displayIndex)); 876 | 877 | for ( int itemIndex = 0; itemIndex < itemCount; ++itemIndex ) 878 | { 879 | const int param = GetItemData(itemIndex); 880 | wxString value; 881 | 882 | switch ( param ) 883 | { 884 | case Param_Name: 885 | value = display.GetName(); 886 | break; 887 | #ifdef __WXMSW__ 888 | case Param_FriendlyName: 889 | if ( friendlyNames.size() == displayCount ) 890 | value = friendlyNames[displayIndex]; 891 | else 892 | value = _("N/A"); 893 | break; 894 | #endif // #ifdef __WXMSW__ 895 | case Param_IsPrimary: 896 | value = display.IsPrimary() ? _("Yes") : _("No"); 897 | break; 898 | case Param_Resolution: 899 | value = wxSizeTowxString(wxSize(videoMode.GetWidth(), videoMode.GetHeight())); 900 | break; 901 | case Param_BPP: 902 | value.Printf("%d", videoMode.GetDepth()); 903 | break; 904 | case Param_Frequency: 905 | value.Printf("%d", videoMode.refresh); 906 | break; 907 | case Param_GeometryCoords: 908 | value = wxRectTowxString(geometryCoords); 909 | break; 910 | case Param_GeometrySize: 911 | value = wxSizeTowxString(geometryCoords.GetSize()); 912 | break; 913 | case Param_ClientAreaCoords: 914 | value = wxRectTowxString(clientAreaCoords); 915 | break; 916 | case Param_ClientAreaSize: 917 | value = wxSizeTowxString(clientAreaCoords.GetSize()); 918 | break; 919 | case Param_PPI: 920 | value = wxSizeTowxString(display.GetPPI()); 921 | break; 922 | case Param_HasThisWindow: 923 | value = displayForThisWindow == displayIndex ? _("Yes") : _("No"); 924 | break; 925 | default: 926 | wxFAIL; 927 | } 928 | 929 | SetItem(itemIndex, columnIndex, value); 930 | } 931 | } 932 | } 933 | 934 | 935 | /************************************************* 936 | 937 | SystemOptionsView 938 | 939 | *************************************************/ 940 | 941 | class SystemOptionsView : public SysInfoListView 942 | { 943 | public: 944 | SystemOptionsView(wxWindow* parent); 945 | 946 | wxArrayString GetValues(const wxString& separator) const override 947 | { 948 | return GetNameAndValueValues(Column_Name, Column_Value, separator); 949 | } 950 | 951 | protected: 952 | void DoUpdateValues() override; 953 | private: 954 | enum 955 | { 956 | Column_Name = 0, 957 | Column_Value, 958 | }; 959 | 960 | static const char* s_optionNames[]; 961 | }; 962 | 963 | const char* SystemOptionsView::s_optionNames[] = 964 | { 965 | "exit-on-assert", 966 | "catch-unhandled-exceptions", 967 | #if defined(__WXMSW__) 968 | "msw.dark-mode", 969 | "msw.font.no-proof-quality", 970 | "msw.native-dialogs-pmdpi", 971 | "msw.no-manifest-check", 972 | "msw.notebook.themed-background", 973 | "msw.remap", 974 | "msw.staticbox.optimized-paint", 975 | "msw.window.no-clip-children", 976 | "msw.window.no-composited", 977 | "no-maskblt", 978 | #elif defined(__WXGTK__) 979 | "gtk.desktop", 980 | "gtk.tlw.can-set-transparent", 981 | "gtk.window.force-background-colour", 982 | #elif defined(__WXMAC__) 983 | "mac.listctrl.always_use_generic", 984 | "mac.textcontrol-use-spell-checker", 985 | "window-default-variant", 986 | "mac.window-plain-transition", 987 | "osx.openfiledialog.always-show-types", 988 | #endif 989 | }; 990 | 991 | SystemOptionsView::SystemOptionsView(wxWindow* parent) 992 | : SysInfoListView(parent) 993 | { 994 | InsertColumn(Column_Name, _("Name")); 995 | InsertColumn(Column_Value, _("Value")); 996 | 997 | UpdateValues(); 998 | } 999 | 1000 | wxString SysOptToString(const wxString& name) 1001 | { 1002 | if ( wxSystemOptions::HasOption(name) ) 1003 | return wxSystemOptions::GetOption(name); 1004 | 1005 | return _(""); 1006 | } 1007 | 1008 | void SystemOptionsView::DoUpdateValues() 1009 | { 1010 | DeleteAllItems(); 1011 | 1012 | for ( const auto& name : s_optionNames ) 1013 | { 1014 | const long itemIndex = InsertItem(GetItemCount(), name); 1015 | 1016 | if ( itemIndex != -1 ) 1017 | SetItem(itemIndex, Column_Value, SysOptToString(name)); 1018 | } 1019 | } 1020 | 1021 | 1022 | /************************************************* 1023 | 1024 | StandardPathsView 1025 | 1026 | *************************************************/ 1027 | 1028 | class StandardPathsView : public SysInfoListView 1029 | { 1030 | public: 1031 | StandardPathsView(wxWindow* parent); 1032 | 1033 | wxArrayString GetValues(const wxString& separator) const override 1034 | { 1035 | return GetNameAndValueValues(Column_Name, Column_Value, separator); 1036 | } 1037 | protected: 1038 | void DoUpdateValues() override; 1039 | private: 1040 | enum 1041 | { 1042 | Column_Name = 0, 1043 | Column_Value, 1044 | }; 1045 | 1046 | enum 1047 | { 1048 | Param_ExecutablePath = 0, 1049 | Param_AppDocumentsDir, 1050 | Param_ConfigDir, 1051 | Param_DataDir, 1052 | Param_DocumentsDir, 1053 | Param_LocalDataDir, 1054 | Param_PluginsDir, 1055 | Param_ResourcesDir, 1056 | Param_TempDir, 1057 | Param_UserConfigDir, 1058 | Param_UserDataDir, 1059 | Param_UserLocalDataDir, 1060 | 1061 | // the group below is available only for wxWidgets 3.1+ 1062 | Param_UserDir_Cache, 1063 | Param_UserDir_Documents, 1064 | Param_UserDir_Desktop, 1065 | Param_UserDir_Downloads, 1066 | Param_UserDir_Music, 1067 | Param_UserDir_Pictures, 1068 | Param_UserDir_Videos, 1069 | 1070 | // the group below is available only for wxMSW 1071 | Param_CSIDL_DESKTOP, 1072 | Param_CSIDL_INTERNET, 1073 | Param_CSIDL_PROGRAMS, 1074 | Param_CSIDL_CONTROLS, 1075 | Param_CSIDL_PRINTERS, 1076 | Param_CSIDL_FAVORITES, 1077 | Param_CSIDL_STARTUP, 1078 | Param_CSIDL_RECENT, 1079 | Param_CSIDL_SENDTO, 1080 | Param_CSIDL_BITBUCKET, 1081 | Param_CSIDL_STARTMENU, 1082 | Param_CSIDL_MYDOCUMENTS, 1083 | Param_CSIDL_MYMUSIC, 1084 | Param_CSIDL_MYVIDEO, 1085 | Param_CSIDL_DESKTOPDIRECTORY, 1086 | Param_CSIDL_DRIVES, 1087 | Param_CSIDL_NETWORK, 1088 | Param_CSIDL_NETHOOD, 1089 | Param_CSIDL_FONTS, 1090 | Param_CSIDL_TEMPLATES, 1091 | Param_CSIDL_COMMON_STARTMENU, 1092 | Param_CSIDL_COMMON_PROGRAMS, 1093 | Param_CSIDL_COMMON_STARTUP, 1094 | Param_CSIDL_COMMON_DESKTOPDIRECTORY, 1095 | Param_CSIDL_APPDATA, 1096 | Param_CSIDL_PRINTHOOD, 1097 | Param_CSIDL_LOCAL_APPDATA, 1098 | Param_CSIDL_ALTSTARTUP, 1099 | Param_CSIDL_COMMON_ALTSTARTUP, 1100 | Param_CSIDL_COMMON_FAVORITES, 1101 | Param_CSIDL_INTERNET_CACHE, 1102 | Param_CSIDL_COOKIES, 1103 | Param_CSIDL_HISTORY, 1104 | Param_CSIDL_COMMON_APPDATA, 1105 | Param_CSIDL_WINDOWS, 1106 | Param_CSIDL_SYSTEM, 1107 | Param_CSIDL_PROGRAM_FILES, 1108 | Param_CSIDL_MYPICTURES, 1109 | Param_CSIDL_PROFILE, 1110 | Param_CSIDL_SYSTEMX86, 1111 | Param_CSIDL_PROGRAM_FILESX86, 1112 | Param_CSIDL_PROGRAM_FILES_COMMON, 1113 | Param_CSIDL_PROGRAM_FILES_COMMONX86, 1114 | Param_CSIDL_COMMON_TEMPLATES, 1115 | Param_CSIDL_COMMON_DOCUMENTS, 1116 | Param_CSIDL_COMMON_ADMINTOOLS, 1117 | Param_CSIDL_ADMINTOOLS, 1118 | Param_CSIDL_CONNECTIONS, 1119 | Param_CSIDL_COMMON_MUSIC, 1120 | Param_CSIDL_COMMON_PICTURES, 1121 | Param_CSIDL_COMMON_VIDEO, 1122 | Param_CSIDL_RESOURCES, 1123 | Param_CSIDL_RESOURCES_LOCALIZED, 1124 | Param_CSIDL_COMMON_OEM_LINKS, 1125 | Param_CSIDL_COMPUTERSNEARME, 1126 | 1127 | // GTK only 1128 | Param_InstallPrefix, 1129 | }; 1130 | }; 1131 | 1132 | StandardPathsView::StandardPathsView(wxWindow* parent) 1133 | : SysInfoListView(parent) 1134 | { 1135 | InsertColumn(Column_Name, _("Name")); 1136 | InsertColumn(Column_Value, _("Value")); 1137 | 1138 | AppendItemWithData("ExecutablePath", Param_ExecutablePath); 1139 | AppendItemWithData("AppDocumentsDir", Param_AppDocumentsDir); 1140 | 1141 | AppendItemWithData("ConfigDir", Param_ConfigDir); 1142 | AppendItemWithData("DataDir", Param_DataDir); 1143 | AppendItemWithData("DocumentsDir", Param_DocumentsDir); 1144 | AppendItemWithData("LocalDataDir", Param_LocalDataDir); 1145 | AppendItemWithData("PluginsDir", Param_PluginsDir); 1146 | AppendItemWithData("ResourcesDir", Param_ResourcesDir); 1147 | AppendItemWithData("TempDir", Param_TempDir); 1148 | AppendItemWithData("UserConfigDir", Param_UserConfigDir); 1149 | AppendItemWithData("UserDataDir", Param_UserDataDir); 1150 | AppendItemWithData("UserLocalDataDir", Param_UserLocalDataDir); 1151 | 1152 | #if wxCHECK_VERSION(3, 1, 0) 1153 | AppendItemWithData("UserDir_Cache", Param_UserDir_Cache); 1154 | AppendItemWithData("UserDir_Documents", Param_UserDir_Documents); 1155 | AppendItemWithData("UserDir_Desktop", Param_UserDir_Desktop); 1156 | AppendItemWithData("UserDir_Downloads", Param_UserDir_Downloads); 1157 | AppendItemWithData("UserDir_Music", Param_UserDir_Music); 1158 | AppendItemWithData("UserDir_Pictures", Param_UserDir_Pictures); 1159 | AppendItemWithData("UserDir_Videos", Param_UserDir_Videos); 1160 | #endif // #if wxCHECK_VERSION(3, 1, 0) 1161 | 1162 | #ifdef __WXMSW__ 1163 | AppendItemWithData("MSWShellDir CSIDL_DESKTOP", Param_CSIDL_DESKTOP); 1164 | AppendItemWithData("MSWShellDir CSIDL_INTERNET", Param_CSIDL_INTERNET); 1165 | AppendItemWithData("MSWShellDir CSIDL_PROGRAMS", Param_CSIDL_PROGRAMS); 1166 | AppendItemWithData("MSWShellDir CSIDL_CONTROLS", Param_CSIDL_CONTROLS); 1167 | AppendItemWithData("MSWShellDir CSIDL_PRINTERS", Param_CSIDL_PRINTERS); 1168 | AppendItemWithData("MSWShellDir CSIDL_FAVORITES", Param_CSIDL_FAVORITES); 1169 | AppendItemWithData("MSWShellDir CSIDL_STARTUP", Param_CSIDL_STARTUP); 1170 | AppendItemWithData("MSWShellDir CSIDL_RECENT", Param_CSIDL_RECENT); 1171 | AppendItemWithData("MSWShellDir CSIDL_SENDTO", Param_CSIDL_SENDTO); 1172 | AppendItemWithData("MSWShellDir CSIDL_BITBUCKET", Param_CSIDL_BITBUCKET); 1173 | AppendItemWithData("MSWShellDir CSIDL_STARTMENU", Param_CSIDL_STARTMENU); 1174 | AppendItemWithData("MSWShellDir CSIDL_MYDOCUMENTS", Param_CSIDL_MYDOCUMENTS); 1175 | AppendItemWithData("MSWShellDir CSIDL_MYMUSIC", Param_CSIDL_MYMUSIC); 1176 | AppendItemWithData("MSWShellDir CSIDL_MYVIDEO", Param_CSIDL_MYVIDEO); 1177 | AppendItemWithData("MSWShellDir CSIDL_DESKTOPDIRECTORY", Param_CSIDL_DESKTOPDIRECTORY); 1178 | AppendItemWithData("MSWShellDir CSIDL_DRIVES", Param_CSIDL_DRIVES); 1179 | AppendItemWithData("MSWShellDir CSIDL_NETWORK", Param_CSIDL_NETWORK); 1180 | AppendItemWithData("MSWShellDir CSIDL_NETHOOD", Param_CSIDL_NETHOOD); 1181 | AppendItemWithData("MSWShellDir CSIDL_FONTS", Param_CSIDL_FONTS); 1182 | AppendItemWithData("MSWShellDir CSIDL_TEMPLATES", Param_CSIDL_TEMPLATES); 1183 | AppendItemWithData("MSWShellDir CSIDL_COMMON_STARTMENU", Param_CSIDL_COMMON_STARTMENU); 1184 | AppendItemWithData("MSWShellDir CSIDL_COMMON_PROGRAMS", Param_CSIDL_COMMON_PROGRAMS); 1185 | AppendItemWithData("MSWShellDir CSIDL_COMMON_STARTUP", Param_CSIDL_COMMON_STARTUP); 1186 | AppendItemWithData("MSWShellDir CSIDL_COMMON_DESKTOPDIRECTORY", Param_CSIDL_COMMON_DESKTOPDIRECTORY); 1187 | AppendItemWithData("MSWShellDir CSIDL_APPDATA", Param_CSIDL_APPDATA); 1188 | AppendItemWithData("MSWShellDir CSIDL_PRINTHOOD", Param_CSIDL_PRINTHOOD); 1189 | AppendItemWithData("MSWShellDir CSIDL_LOCAL_APPDATA", Param_CSIDL_LOCAL_APPDATA); 1190 | AppendItemWithData("MSWShellDir CSIDL_ALTSTARTUP", Param_CSIDL_ALTSTARTUP); 1191 | AppendItemWithData("MSWShellDir CSIDL_COMMON_ALTSTARTUP", Param_CSIDL_COMMON_ALTSTARTUP); 1192 | AppendItemWithData("MSWShellDir CSIDL_COMMON_FAVORITES", Param_CSIDL_COMMON_FAVORITES); 1193 | AppendItemWithData("MSWShellDir CSIDL_INTERNET_CACHE", Param_CSIDL_INTERNET_CACHE); 1194 | AppendItemWithData("MSWShellDir CSIDL_COOKIES", Param_CSIDL_COOKIES); 1195 | AppendItemWithData("MSWShellDir CSIDL_HISTORY", Param_CSIDL_HISTORY); 1196 | AppendItemWithData("MSWShellDir CSIDL_COMMON_APPDATA", Param_CSIDL_COMMON_APPDATA); 1197 | AppendItemWithData("MSWShellDir CSIDL_WINDOWS", Param_CSIDL_WINDOWS); 1198 | AppendItemWithData("MSWShellDir CSIDL_SYSTEM", Param_CSIDL_SYSTEM); 1199 | AppendItemWithData("MSWShellDir CSIDL_PROGRAM_FILES", Param_CSIDL_PROGRAM_FILES); 1200 | AppendItemWithData("MSWShellDir CSIDL_MYPICTURES", Param_CSIDL_MYPICTURES); 1201 | AppendItemWithData("MSWShellDir CSIDL_PROFILE", Param_CSIDL_PROFILE); 1202 | AppendItemWithData("MSWShellDir CSIDL_SYSTEMX86", Param_CSIDL_SYSTEMX86); 1203 | AppendItemWithData("MSWShellDir CSIDL_PROGRAM_FILESX86", Param_CSIDL_PROGRAM_FILESX86); 1204 | AppendItemWithData("MSWShellDir CSIDL_PROGRAM_FILES_COMMON", Param_CSIDL_PROGRAM_FILES_COMMON); 1205 | AppendItemWithData("MSWShellDir CSIDL_PROGRAM_FILES_COMMONX86", Param_CSIDL_PROGRAM_FILES_COMMONX86); 1206 | AppendItemWithData("MSWShellDir CSIDL_COMMON_TEMPLATES", Param_CSIDL_COMMON_TEMPLATES); 1207 | AppendItemWithData("MSWShellDir CSIDL_COMMON_DOCUMENTS", Param_CSIDL_COMMON_DOCUMENTS); 1208 | AppendItemWithData("MSWShellDir CSIDL_COMMON_ADMINTOOLS", Param_CSIDL_COMMON_ADMINTOOLS); 1209 | AppendItemWithData("MSWShellDir CSIDL_ADMINTOOLS", Param_CSIDL_ADMINTOOLS); 1210 | AppendItemWithData("MSWShellDir CSIDL_CONNECTIONS", Param_CSIDL_CONNECTIONS); 1211 | AppendItemWithData("MSWShellDir CSIDL_COMMON_MUSIC", Param_CSIDL_COMMON_MUSIC); 1212 | AppendItemWithData("MSWShellDir CSIDL_COMMON_PICTURES", Param_CSIDL_COMMON_PICTURES); 1213 | AppendItemWithData("MSWShellDir CSIDL_COMMON_VIDEO", Param_CSIDL_COMMON_VIDEO); 1214 | AppendItemWithData("MSWShellDir CSIDL_RESOURCES", Param_CSIDL_RESOURCES); 1215 | AppendItemWithData("MSWShellDir CSIDL_RESOURCES_LOCALIZED", Param_CSIDL_RESOURCES_LOCALIZED); 1216 | AppendItemWithData("MSWShellDir CSIDL_COMMON_OEM_LINKS", Param_CSIDL_COMMON_OEM_LINKS); 1217 | AppendItemWithData("MSWShellDir CSIDL_COMPUTERSNEARME", Param_CSIDL_COMPUTERSNEARME); 1218 | #endif // #ifdef __WXMSW__ 1219 | 1220 | #ifdef __WXGTK__ 1221 | AppendItemWithData("InstallPrefix", Param_InstallPrefix); 1222 | #endif // #ifdef __WXGTK__ 1223 | 1224 | UpdateValues(); 1225 | } 1226 | 1227 | void StandardPathsView::DoUpdateValues() 1228 | { 1229 | const wxStandardPaths& paths = wxStandardPaths::Get(); 1230 | const int itemCount = GetItemCount(); 1231 | 1232 | #ifdef __WXMSW__ 1233 | // for MSWGetShellDir() 1234 | // CSIDL_FLAG_DONT_VERIFY | CSIDL_FLAG_DONT_UNEXPAND | CSIDL_FLAG_NO_ALIAS 1235 | const UINT flags = 0x4000 | 0x2000 | 0x1000; 1236 | #endif // #ifdef __WXMSW__ 1237 | 1238 | for ( int i = 0; i < itemCount; ++i ) 1239 | { 1240 | const long param = GetItemData(i); 1241 | wxString value; 1242 | 1243 | switch ( param ) 1244 | { 1245 | case Param_ExecutablePath: value = paths.GetExecutablePath(); break; 1246 | case Param_AppDocumentsDir: value = paths.GetAppDocumentsDir(); break; 1247 | case Param_ConfigDir: value = paths.GetConfigDir(); break; 1248 | case Param_DataDir: value = paths.GetDataDir(); break; 1249 | case Param_DocumentsDir: value = paths.GetDocumentsDir(); break; 1250 | case Param_LocalDataDir: value = paths.GetLocalDataDir(); break; 1251 | case Param_PluginsDir: value = paths.GetPluginsDir(); break; 1252 | case Param_ResourcesDir: value = paths.GetResourcesDir(); break; 1253 | case Param_TempDir: value = paths.GetTempDir(); break; 1254 | case Param_UserConfigDir: value = paths.GetUserConfigDir(); break; 1255 | case Param_UserDataDir: value = paths.GetUserDataDir(); break; 1256 | case Param_UserLocalDataDir: value = paths.GetUserLocalDataDir(); break; 1257 | 1258 | #if wxCHECK_VERSION(3, 1, 0) 1259 | case Param_UserDir_Cache: value = paths.GetUserDir(wxStandardPaths::Dir_Cache); break; 1260 | case Param_UserDir_Documents: value = paths.GetUserDir(wxStandardPaths::Dir_Documents); break; 1261 | case Param_UserDir_Desktop: value = paths.GetUserDir(wxStandardPaths::Dir_Desktop); break; 1262 | case Param_UserDir_Downloads: value = paths.GetUserDir(wxStandardPaths::Dir_Downloads); break; 1263 | case Param_UserDir_Music: value = paths.GetUserDir(wxStandardPaths::Dir_Music); break; 1264 | case Param_UserDir_Pictures: value = paths.GetUserDir(wxStandardPaths::Dir_Pictures); break; 1265 | case Param_UserDir_Videos: value = paths.GetUserDir(wxStandardPaths::Dir_Videos); break; 1266 | #endif // #if wxCHECK_VERSION(3, 1, 0) 1267 | 1268 | #ifdef __WXMSW__ 1269 | case Param_CSIDL_DESKTOP: value = paths.MSWGetShellDir(0x0000 | flags); break; 1270 | case Param_CSIDL_INTERNET: value = paths.MSWGetShellDir(0x0001 | flags); break; 1271 | case Param_CSIDL_PROGRAMS: value = paths.MSWGetShellDir(0x0002 | flags); break; 1272 | case Param_CSIDL_CONTROLS: value = paths.MSWGetShellDir(0x0003 | flags); break; 1273 | case Param_CSIDL_PRINTERS: value = paths.MSWGetShellDir(0x0004 | flags); break; 1274 | case Param_CSIDL_FAVORITES: value = paths.MSWGetShellDir(0x0006 | flags); break; 1275 | case Param_CSIDL_STARTUP: value = paths.MSWGetShellDir(0x0007 | flags); break; 1276 | case Param_CSIDL_RECENT: value = paths.MSWGetShellDir(0x0008 | flags); break; 1277 | case Param_CSIDL_SENDTO: value = paths.MSWGetShellDir(0x0009 | flags); break; 1278 | case Param_CSIDL_BITBUCKET: value = paths.MSWGetShellDir(0x000a | flags); break; 1279 | case Param_CSIDL_STARTMENU: value = paths.MSWGetShellDir(0x000b | flags); break; 1280 | case Param_CSIDL_MYDOCUMENTS: value = paths.MSWGetShellDir(0x0005 | flags); break; 1281 | case Param_CSIDL_MYMUSIC: value = paths.MSWGetShellDir(0x000d | flags); break; 1282 | case Param_CSIDL_MYVIDEO: value = paths.MSWGetShellDir(0x000e | flags); break; 1283 | case Param_CSIDL_DESKTOPDIRECTORY: value = paths.MSWGetShellDir(0x0010 | flags); break; 1284 | case Param_CSIDL_DRIVES: value = paths.MSWGetShellDir(0x0011 | flags); break; 1285 | case Param_CSIDL_NETWORK: value = paths.MSWGetShellDir(0x0012 | flags); break; 1286 | case Param_CSIDL_NETHOOD: value = paths.MSWGetShellDir(0x0013 | flags); break; 1287 | case Param_CSIDL_FONTS: value = paths.MSWGetShellDir(0x0014 | flags); break; 1288 | case Param_CSIDL_TEMPLATES: value = paths.MSWGetShellDir(0x0015 | flags); break; 1289 | case Param_CSIDL_COMMON_STARTMENU: value = paths.MSWGetShellDir(0x0016 | flags); break; 1290 | case Param_CSIDL_COMMON_PROGRAMS: value = paths.MSWGetShellDir(0X0017 | flags); break; 1291 | case Param_CSIDL_COMMON_STARTUP: value = paths.MSWGetShellDir(0x0018 | flags); break; 1292 | case Param_CSIDL_COMMON_DESKTOPDIRECTORY: value = paths.MSWGetShellDir(0x0019 | flags); break; 1293 | case Param_CSIDL_APPDATA: value = paths.MSWGetShellDir(0x001a | flags); break; 1294 | case Param_CSIDL_PRINTHOOD: value = paths.MSWGetShellDir(0x001b | flags); break; 1295 | case Param_CSIDL_LOCAL_APPDATA: value = paths.MSWGetShellDir(0x001c | flags); break; 1296 | case Param_CSIDL_ALTSTARTUP: value = paths.MSWGetShellDir(0x001d | flags); break; 1297 | case Param_CSIDL_COMMON_ALTSTARTUP: value = paths.MSWGetShellDir(0x001e | flags); break; 1298 | case Param_CSIDL_COMMON_FAVORITES: value = paths.MSWGetShellDir(0x001f | flags); break; 1299 | case Param_CSIDL_INTERNET_CACHE: value = paths.MSWGetShellDir(0x0020 | flags); break; 1300 | case Param_CSIDL_COOKIES: value = paths.MSWGetShellDir(0x0021 | flags); break; 1301 | case Param_CSIDL_HISTORY: value = paths.MSWGetShellDir(0x0022 | flags); break; 1302 | case Param_CSIDL_COMMON_APPDATA: value = paths.MSWGetShellDir(0x0023 | flags); break; 1303 | case Param_CSIDL_WINDOWS: value = paths.MSWGetShellDir(0x0024 | flags); break; 1304 | case Param_CSIDL_SYSTEM: value = paths.MSWGetShellDir(0x0025 | flags); break; 1305 | case Param_CSIDL_PROGRAM_FILES: value = paths.MSWGetShellDir(0x0026 | flags); break; 1306 | case Param_CSIDL_MYPICTURES: value = paths.MSWGetShellDir(0x0027 | flags); break; 1307 | case Param_CSIDL_PROFILE: value = paths.MSWGetShellDir(0x0028 | flags); break; 1308 | case Param_CSIDL_SYSTEMX86: value = paths.MSWGetShellDir(0x0029 | flags); break; 1309 | case Param_CSIDL_PROGRAM_FILESX86: value = paths.MSWGetShellDir(0x002a | flags); break; 1310 | case Param_CSIDL_PROGRAM_FILES_COMMON: value = paths.MSWGetShellDir(0x002b | flags); break; 1311 | case Param_CSIDL_PROGRAM_FILES_COMMONX86: value = paths.MSWGetShellDir(0x002c | flags); break; 1312 | case Param_CSIDL_COMMON_TEMPLATES: value = paths.MSWGetShellDir(0x002d | flags); break; 1313 | case Param_CSIDL_COMMON_DOCUMENTS: value = paths.MSWGetShellDir(0x002e | flags); break; 1314 | case Param_CSIDL_COMMON_ADMINTOOLS: value = paths.MSWGetShellDir(0x002f | flags); break; 1315 | case Param_CSIDL_ADMINTOOLS: value = paths.MSWGetShellDir(0x0030 | flags); break; 1316 | case Param_CSIDL_CONNECTIONS: value = paths.MSWGetShellDir(0x0031 | flags); break; 1317 | case Param_CSIDL_COMMON_MUSIC: value = paths.MSWGetShellDir(0x0035 | flags); break; 1318 | case Param_CSIDL_COMMON_PICTURES: value = paths.MSWGetShellDir(0x0036 | flags); break; 1319 | case Param_CSIDL_COMMON_VIDEO: value = paths.MSWGetShellDir(0x0037 | flags); break; 1320 | case Param_CSIDL_RESOURCES: value = paths.MSWGetShellDir(0x0038 | flags); break; 1321 | case Param_CSIDL_RESOURCES_LOCALIZED: value = paths.MSWGetShellDir(0x0039 | flags); break; 1322 | case Param_CSIDL_COMMON_OEM_LINKS: value = paths.MSWGetShellDir(0x003a | flags); break; 1323 | case Param_CSIDL_COMPUTERSNEARME: value = paths.MSWGetShellDir(0x003d | flags); break; 1324 | #endif // #ifdef __WXMSW__ 1325 | 1326 | #ifdef __WXGTK__ 1327 | case Param_InstallPrefix: value = paths.GetInstallPrefix(); break; 1328 | #endif // #ifdef __WXGTK__ 1329 | 1330 | default: 1331 | wxFAIL; 1332 | } 1333 | 1334 | SetItem(i, Column_Value, value); 1335 | } 1336 | } 1337 | 1338 | 1339 | /************************************************* 1340 | 1341 | EnvironmentVariablesView 1342 | 1343 | *************************************************/ 1344 | 1345 | class EnvironmentVariablesView : public SysInfoListView 1346 | { 1347 | public: 1348 | EnvironmentVariablesView(wxWindow* parent); 1349 | 1350 | wxArrayString GetValues(const wxString& separator) const override 1351 | { 1352 | return GetNameAndValueValues(Column_Name, Column_Value, separator); 1353 | } 1354 | 1355 | protected: 1356 | void DoUpdateValues() override; 1357 | private: 1358 | enum 1359 | { 1360 | Column_Name = 0, 1361 | Column_Value, 1362 | }; 1363 | }; 1364 | 1365 | EnvironmentVariablesView::EnvironmentVariablesView(wxWindow* parent) 1366 | : SysInfoListView(parent) 1367 | { 1368 | InsertColumn(Column_Name, _("Name")); 1369 | InsertColumn(Column_Value, _("Value")); 1370 | 1371 | UpdateValues(); 1372 | } 1373 | 1374 | void EnvironmentVariablesView::DoUpdateValues() 1375 | { 1376 | DeleteAllItems(); 1377 | 1378 | wxEnvVariableHashMap variables; 1379 | 1380 | if ( !wxGetEnvMap(&variables) ) 1381 | { 1382 | wxLogError(_("Could not retrieve system environment variables.")); 1383 | return; 1384 | } 1385 | 1386 | // sort variables alphabetically by name 1387 | std::map variablesSorted; 1388 | 1389 | for ( auto i = variables.begin(); i != variables.end(); ++i ) 1390 | variablesSorted[i->first] = i->second; 1391 | 1392 | for ( const auto& variable : variablesSorted ) 1393 | { 1394 | const long itemIndex = InsertItem(GetItemCount(), variable.first); 1395 | 1396 | if ( itemIndex != -1 ) 1397 | SetItem(itemIndex, Column_Value, variable.second); 1398 | } 1399 | } 1400 | 1401 | 1402 | /************************************************* 1403 | 1404 | MiscellaneousView 1405 | 1406 | *************************************************/ 1407 | 1408 | class ObtainFullHostNameThread; 1409 | 1410 | class MiscellaneousView : public SysInfoListView 1411 | { 1412 | public: 1413 | MiscellaneousView(wxWindow* parent); 1414 | ~MiscellaneousView(); 1415 | 1416 | wxArrayString GetValues(const wxString& separator) const override 1417 | { 1418 | return GetNameAndValueValues(Column_Name, Column_Value, separator); 1419 | } 1420 | 1421 | protected: 1422 | void DoUpdateValues() override; 1423 | private: 1424 | enum 1425 | { 1426 | Column_Name = 0, 1427 | Column_Value, 1428 | }; 1429 | 1430 | enum 1431 | { 1432 | Param_AppName = 0, 1433 | Param_AppDisplayName, 1434 | Param_AppVendorName, 1435 | Param_AppVendorDisplayName, 1436 | Param_AppClassName, 1437 | Param_AppHasStderr, 1438 | Param_IsProcess64bit, 1439 | Param_wxRCEmbedded, 1440 | Param_UnixDesktopEnvironment, 1441 | Param_ThemeName, 1442 | Param_SystemAppearanceName, 1443 | Param_SystemAppearanceIsDark, 1444 | Param_SystemAppearanceIsSystemDark, 1445 | Param_SystemAppearanceAreAppsDark, 1446 | Param_ComCtl32Version, 1447 | Param_GDIObjectCount, 1448 | Param_UserObjectCount, 1449 | Param_IsProcessDPIAware, 1450 | Param_ProcessDPIAwareness, 1451 | Param_ThreadDPIAwarenessContext, 1452 | Param_ProcessSystemDPI, 1453 | Param_WindowDPI, 1454 | Param_WindowContentScaleFactor, 1455 | Param_PathSeparator, 1456 | Param_UserId, 1457 | Param_UserName, 1458 | Param_SystemEncodingName, 1459 | Param_SystemLanguage, 1460 | #if wxCHECK_VERSION(3, 1, 6) 1461 | Param_UILocaleName, 1462 | #endif 1463 | Param_HostName, 1464 | Param_FullHostName, 1465 | Param_OSDescription, 1466 | Param_OSVersion, 1467 | Param_LinuxDistributionInfo, 1468 | Param_OSDirectory, 1469 | Param_CPUArchitectureName, 1470 | Param_CPUCount, 1471 | Param_IsPlatform64Bit, 1472 | Param_IsPlatformLittleEndian, 1473 | }; 1474 | 1475 | ObtainFullHostNameThread* m_obtainFullHostNameThread{nullptr}; 1476 | 1477 | void OnObtainFullHostNameThread(wxThreadEvent& event); 1478 | void StartObtainFullHostNameThread(); 1479 | void StopObtainFullHostNameThread(); 1480 | }; 1481 | 1482 | #ifdef __WXMSW__ 1483 | 1484 | class MSWDPIAwarenessHelper 1485 | { 1486 | public: 1487 | enum ProcessDPIAwareness 1488 | { 1489 | ProcessDPIUnaware = 0, 1490 | ProcessSystemDPIAware = 1, 1491 | ProcessPerMonitorDPIAware = 2, 1492 | ProcessDPINotApplicable = 33333, // returned on error/unsupported 1493 | }; 1494 | 1495 | enum DPIAwarenessContext 1496 | { 1497 | DPIAwarenessContextUnaware = -1, 1498 | DPIAwarenessContextSystemAware = -2, 1499 | DPIAwarenessContextPerMonitorAware = -3, 1500 | DPIAwarenessContextPerMonitorAwareV2 = -4, 1501 | DPIAwarenessContextUnawareGdiscaled = -5, 1502 | DPIAwarenessContextNotApplicable = -66666, // returned on error/unsupported 1503 | }; 1504 | 1505 | static bool IsThisProcessDPIAware(); 1506 | static ProcessDPIAwareness GetThisProcessDPIAwareness(); 1507 | static wxString GetThisProcessDPIAwarenessStr(); 1508 | static unsigned GetSystemDpiForThisProcess(); 1509 | static unsigned GetDpiForWindow(wxWindow* win); 1510 | 1511 | static DPIAwarenessContext GetThreadDPIAwarenessContext(); 1512 | static wxString GetThreadDPIAwarenessContextStr(); 1513 | }; 1514 | 1515 | bool MSWDPIAwarenessHelper::IsThisProcessDPIAware() 1516 | { 1517 | using IsProcessDPIAware_t = BOOL(WINAPI*)(); 1518 | 1519 | static bool s_initialised = false; 1520 | static IsProcessDPIAware_t s_pfnIsProcessDPIAware = nullptr; 1521 | 1522 | if ( !s_initialised ) 1523 | { 1524 | wxLoadedDLL dllUser32("user32.dll"); 1525 | 1526 | wxDL_INIT_FUNC(s_pfn, IsProcessDPIAware, dllUser32); 1527 | s_initialised = true; 1528 | } 1529 | 1530 | if ( !s_pfnIsProcessDPIAware ) 1531 | return false; 1532 | 1533 | return s_pfnIsProcessDPIAware() == TRUE; 1534 | } 1535 | 1536 | MSWDPIAwarenessHelper::ProcessDPIAwareness MSWDPIAwarenessHelper::GetThisProcessDPIAwareness() 1537 | { 1538 | using GetProcessDpiAwareness_t = HRESULT(WINAPI*)(HANDLE, DWORD*); 1539 | 1540 | static bool s_initialised = false; 1541 | static wxDynamicLibrary s_dllShcore; 1542 | static GetProcessDpiAwareness_t s_pfnGetProcessDpiAwareness = nullptr; 1543 | 1544 | if ( !s_initialised ) 1545 | { 1546 | if ( s_dllShcore.Load("shcore.dll", wxDL_VERBATIM | wxDL_QUIET) ) 1547 | { 1548 | wxDL_INIT_FUNC(s_pfn, GetProcessDpiAwareness, s_dllShcore); 1549 | 1550 | if ( !s_pfnGetProcessDpiAwareness ) 1551 | s_dllShcore.Unload(); 1552 | } 1553 | 1554 | s_initialised = true; 1555 | } 1556 | 1557 | if ( !s_pfnGetProcessDpiAwareness ) 1558 | return ProcessDPINotApplicable; 1559 | 1560 | DWORD value = ProcessDPINotApplicable; 1561 | const HRESULT hr = s_pfnGetProcessDpiAwareness(nullptr, &value); 1562 | 1563 | if ( FAILED(hr) ) 1564 | { 1565 | wxLogApiError("GetProcessDpiAwareness", hr); 1566 | return ProcessDPINotApplicable; 1567 | } 1568 | 1569 | if ( value == ProcessDPIUnaware ) 1570 | return ProcessDPIUnaware; 1571 | if ( value == ProcessSystemDPIAware ) 1572 | return ProcessSystemDPIAware; 1573 | if ( value == ProcessPerMonitorDPIAware ) 1574 | return ProcessPerMonitorDPIAware; 1575 | 1576 | return ProcessDPINotApplicable; 1577 | } 1578 | 1579 | wxString MSWDPIAwarenessHelper::GetThisProcessDPIAwarenessStr() 1580 | { 1581 | const ProcessDPIAwareness awareness = GetThisProcessDPIAwareness(); 1582 | wxString result; 1583 | 1584 | switch ( awareness ) 1585 | { 1586 | case ProcessDPIUnaware: 1587 | result = _("DPI Unaware"); 1588 | break; 1589 | case ProcessSystemDPIAware: 1590 | result = _("System DPI Aware"); 1591 | break; 1592 | case ProcessPerMonitorDPIAware: 1593 | result = _("Per Monitor DPI Aware"); 1594 | break; 1595 | default: 1596 | result = _(""); 1597 | } 1598 | 1599 | return result; 1600 | } 1601 | 1602 | unsigned MSWDPIAwarenessHelper::GetSystemDpiForThisProcess() 1603 | { 1604 | using GetSystemDpiForProcess_t = unsigned(WINAPI*)(HANDLE); 1605 | 1606 | static bool s_initialised = false; 1607 | static GetSystemDpiForProcess_t s_pfnGetSystemDpiForProcess = nullptr; 1608 | 1609 | if ( !s_initialised ) 1610 | { 1611 | wxLoadedDLL dllUser32("user32.dll"); 1612 | 1613 | wxDL_INIT_FUNC(s_pfn, GetSystemDpiForProcess, dllUser32); 1614 | s_initialised = true; 1615 | } 1616 | 1617 | if ( !s_pfnGetSystemDpiForProcess ) 1618 | return 96; 1619 | 1620 | return s_pfnGetSystemDpiForProcess(nullptr); 1621 | } 1622 | 1623 | unsigned MSWDPIAwarenessHelper::GetDpiForWindow(wxWindow* win) 1624 | { 1625 | using GetDpiForWindow_t = unsigned (WINAPI*)(HWND); 1626 | 1627 | static bool s_initialised = false; 1628 | static GetDpiForWindow_t s_pfnGetDpiForWindow = nullptr; 1629 | 1630 | if ( !s_initialised ) 1631 | { 1632 | wxLoadedDLL dllUser32("user32.dll"); 1633 | 1634 | wxDL_INIT_FUNC(s_pfn, GetDpiForWindow, dllUser32); 1635 | s_initialised = true; 1636 | } 1637 | 1638 | if ( !s_pfnGetDpiForWindow ) 1639 | return 96; 1640 | 1641 | return s_pfnGetDpiForWindow(win->GetHWND()); 1642 | } 1643 | 1644 | MSWDPIAwarenessHelper::DPIAwarenessContext MSWDPIAwarenessHelper::GetThreadDPIAwarenessContext() 1645 | { 1646 | using MSW_DPI_AWARENESS_CONTEXT = HANDLE; 1647 | static const MSW_DPI_AWARENESS_CONTEXT MSW_DPI_AWARENESS_CONTEXT_UNAWARE = (MSW_DPI_AWARENESS_CONTEXT)-1; 1648 | static const MSW_DPI_AWARENESS_CONTEXT MSW_DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = (MSW_DPI_AWARENESS_CONTEXT)-2; 1649 | static const MSW_DPI_AWARENESS_CONTEXT MSW_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = (MSW_DPI_AWARENESS_CONTEXT)-3; 1650 | static const MSW_DPI_AWARENESS_CONTEXT MSW_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = (MSW_DPI_AWARENESS_CONTEXT)-4; 1651 | static const MSW_DPI_AWARENESS_CONTEXT MSW_DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED = (MSW_DPI_AWARENESS_CONTEXT)-5; 1652 | 1653 | using GetThreadDpiAwarenessContext_t = MSW_DPI_AWARENESS_CONTEXT(WINAPI*)(); 1654 | using IsValidDpiAwarenessContext_t = BOOL(WINAPI*)(MSW_DPI_AWARENESS_CONTEXT); 1655 | using AreDpiAwarenessContextsEqual_t = BOOL(WINAPI*)(MSW_DPI_AWARENESS_CONTEXT, MSW_DPI_AWARENESS_CONTEXT); 1656 | 1657 | static bool s_initialised = false; 1658 | static GetThreadDpiAwarenessContext_t s_pfnGetThreadDpiAwarenessContext = nullptr; 1659 | static IsValidDpiAwarenessContext_t s_pfnIsValidDpiAwarenessContext = nullptr; 1660 | static AreDpiAwarenessContextsEqual_t s_pfnAreDpiAwarenessContextsEqual = nullptr; 1661 | 1662 | if ( !s_initialised ) 1663 | { 1664 | wxLoadedDLL dllUser32("user32.dll"); 1665 | 1666 | wxDL_INIT_FUNC(s_pfn, GetThreadDpiAwarenessContext, dllUser32); 1667 | wxDL_INIT_FUNC(s_pfn, AreDpiAwarenessContextsEqual, dllUser32); 1668 | wxDL_INIT_FUNC(s_pfn, IsValidDpiAwarenessContext, dllUser32); 1669 | s_initialised = true; 1670 | } 1671 | 1672 | if ( !s_pfnGetThreadDpiAwarenessContext 1673 | || !s_pfnAreDpiAwarenessContextsEqual 1674 | || !s_pfnIsValidDpiAwarenessContext ) 1675 | { 1676 | return DPIAwarenessContextNotApplicable; 1677 | } 1678 | 1679 | const MSW_DPI_AWARENESS_CONTEXT value = s_pfnGetThreadDpiAwarenessContext(); 1680 | 1681 | if ( !s_pfnIsValidDpiAwarenessContext(value) ) 1682 | return DPIAwarenessContextUnaware; 1683 | 1684 | if ( s_pfnAreDpiAwarenessContextsEqual(value, MSW_DPI_AWARENESS_CONTEXT_UNAWARE) ) 1685 | return DPIAwarenessContextUnaware; 1686 | if ( s_pfnAreDpiAwarenessContextsEqual(value, MSW_DPI_AWARENESS_CONTEXT_SYSTEM_AWARE) ) 1687 | return DPIAwarenessContextSystemAware; 1688 | if ( s_pfnAreDpiAwarenessContextsEqual(value, MSW_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE) ) 1689 | return DPIAwarenessContextPerMonitorAware; 1690 | if ( s_pfnAreDpiAwarenessContextsEqual(value, MSW_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) ) 1691 | return DPIAwarenessContextPerMonitorAwareV2; 1692 | if ( s_pfnAreDpiAwarenessContextsEqual(value, MSW_DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED) ) 1693 | return DPIAwarenessContextUnawareGdiscaled; 1694 | 1695 | return DPIAwarenessContextNotApplicable; 1696 | } 1697 | 1698 | wxString MSWDPIAwarenessHelper::GetThreadDPIAwarenessContextStr() 1699 | { 1700 | const DPIAwarenessContext context = GetThreadDPIAwarenessContext(); 1701 | wxString result; 1702 | 1703 | switch ( context ) 1704 | { 1705 | case DPIAwarenessContextUnaware: 1706 | result = _("DPI Unaware"); 1707 | break; 1708 | case DPIAwarenessContextSystemAware: 1709 | result = _("System DPI Aware"); 1710 | break; 1711 | case DPIAwarenessContextPerMonitorAware: 1712 | result = _("Per Monitor DPI Aware"); 1713 | break; 1714 | case DPIAwarenessContextPerMonitorAwareV2: 1715 | result = _("Per Monitor DPI Aware V2"); 1716 | break; 1717 | case DPIAwarenessContextUnawareGdiscaled: 1718 | result = _("DPI Unaware GDI Scaled"); 1719 | break; 1720 | default: 1721 | result = _(""); 1722 | } 1723 | 1724 | return result; 1725 | } 1726 | 1727 | #endif // #ifdef __WXMSW__ 1728 | 1729 | class ObtainFullHostNameThread : public wxThread 1730 | { 1731 | public: 1732 | ObtainFullHostNameThread(wxEvtHandler* sink) 1733 | : wxThread(wxTHREAD_JOINABLE), 1734 | m_sink(sink) 1735 | {} 1736 | 1737 | protected: 1738 | wxEvtHandler* m_sink; 1739 | 1740 | ExitCode Entry() override 1741 | { 1742 | wxThreadEvent evt; 1743 | 1744 | evt.SetString(wxGetFullHostName()); 1745 | wxQueueEvent(m_sink, evt.Clone()); 1746 | return static_cast(nullptr); 1747 | } 1748 | }; 1749 | 1750 | 1751 | wxString GetThemeName() 1752 | { 1753 | wxString name = ""; 1754 | 1755 | #ifdef __WXMSW__ 1756 | static const int buffSize = 1024; 1757 | 1758 | WCHAR fileName[buffSize+1]{0}; 1759 | WCHAR colorName[buffSize+1]{0}; 1760 | WCHAR displayName[buffSize+1]{0}; 1761 | 1762 | if ( SUCCEEDED(::GetCurrentThemeName(fileName, buffSize, colorName, buffSize, nullptr, 0)) ) 1763 | { 1764 | if ( SUCCEEDED(::GetThemeDocumentationProperty(fileName, SZ_THDOCPROP_DISPLAYNAME, displayName, buffSize)) ) 1765 | { 1766 | HIGHCONTRAST hc{0}; 1767 | 1768 | name.Printf("%s / %s", displayName, colorName); 1769 | 1770 | hc.cbSize = sizeof(hc); 1771 | if ( ::SystemParametersInfo(SPI_GETHIGHCONTRAST, sizeof(hc), &hc, 0) ) 1772 | { 1773 | if ( (hc.dwFlags & HCF_HIGHCONTRASTON) == HCF_HIGHCONTRASTON ) 1774 | name += _(" (High Contrast)"); 1775 | } 1776 | } 1777 | } 1778 | #endif 1779 | 1780 | #ifdef __WXGTK__ 1781 | GtkSettings* settings = gtk_settings_get_default(); 1782 | gchar* themeName = nullptr; 1783 | 1784 | g_object_get(settings, "gtk-theme-name", &themeName, nullptr); 1785 | name = wxString::FromUTF8(themeName); 1786 | g_free(themeName); 1787 | #endif 1788 | 1789 | return name; 1790 | } 1791 | 1792 | MiscellaneousView::~MiscellaneousView() 1793 | { 1794 | StopObtainFullHostNameThread(); 1795 | } 1796 | 1797 | MiscellaneousView::MiscellaneousView(wxWindow* parent) 1798 | : SysInfoListView(parent) 1799 | { 1800 | InsertColumn(Column_Name, _("Name")); 1801 | InsertColumn(Column_Value, _("Value")); 1802 | 1803 | AppendItemWithData(_("App Name"), Param_AppName); 1804 | AppendItemWithData(_("App Display Name"), Param_AppDisplayName); 1805 | AppendItemWithData(_("App Vendor Name"), Param_AppVendorName); 1806 | AppendItemWithData(_("App Vendor Display Name"), Param_AppVendorDisplayName); 1807 | AppendItemWithData(_("App Class Name"), Param_AppClassName); 1808 | AppendItemWithData(_("App HasStderr"), Param_AppHasStderr); 1809 | AppendItemWithData(_("64-bit Process"), Param_IsProcess64bit); 1810 | #ifdef __WXMSW__ 1811 | AppendItemWithData(_("Is Embedded"), Param_wxRCEmbedded); 1812 | #endif // #ifdef __WXMSW__ 1813 | #ifdef __UNIX__ 1814 | AppendItemWithData(_("Unix Desktop Environment"), Param_UnixDesktopEnvironment); 1815 | #endif // #ifdef __UNIX__ 1816 | AppendItemWithData(_("Theme Name"), Param_ThemeName); 1817 | #if wxCHECK_VERSION(3, 1, 3) 1818 | AppendItemWithData(_("System Appearance Name"), Param_SystemAppearanceName); 1819 | AppendItemWithData(_("System Appearance IsDark"), Param_SystemAppearanceIsDark); 1820 | #endif 1821 | 1822 | #if defined(__WXMSW__) && wxCHECK_VERSION(3, 3, 0) 1823 | AppendItemWithData(_("System Appearance IsSystemDark"), Param_SystemAppearanceIsSystemDark); 1824 | AppendItemWithData(_("System Appearance AreAppsDark"), Param_SystemAppearanceAreAppsDark); 1825 | #endif //#if defined(__WXMSW__) && wxCHECK_VERSION(3, 3, 0) 1826 | 1827 | #ifdef __WXMSW__ 1828 | AppendItemWithData(_("ComCtl32.dll Version"), Param_ComCtl32Version); 1829 | AppendItemWithData(_("GDI Object Count"), Param_GDIObjectCount); 1830 | AppendItemWithData(_("User Object Count"), Param_UserObjectCount); 1831 | AppendItemWithData(_("Is Process DPI Aware"), Param_IsProcessDPIAware); 1832 | AppendItemWithData(_("Process DPI Awareness"), Param_ProcessDPIAwareness); 1833 | AppendItemWithData(_("Thread DPI Awareness Context"), Param_ThreadDPIAwarenessContext); 1834 | AppendItemWithData(_("System DPI for Process"), Param_ProcessSystemDPI); 1835 | AppendItemWithData(_("DPI for This Window"), Param_WindowDPI); 1836 | #endif // #ifdef __WXMSW__ 1837 | 1838 | AppendItemWithData(_("Window Content Scale Factor"), Param_WindowContentScaleFactor); 1839 | AppendItemWithData(_("Path Separator"), Param_PathSeparator); 1840 | AppendItemWithData(_("User Id"), Param_UserId); 1841 | AppendItemWithData(_("User Name"), Param_UserName); 1842 | AppendItemWithData(_("System Encoding"), Param_SystemEncodingName); 1843 | AppendItemWithData(_("System Language"), Param_SystemLanguage); 1844 | #if wxCHECK_VERSION(3, 1, 6) 1845 | AppendItemWithData(_("UI Locale Name"), Param_UILocaleName); 1846 | #endif 1847 | AppendItemWithData(_("Host Name"), Param_HostName); 1848 | AppendItemWithData(_("Full Host Name"), Param_FullHostName); 1849 | AppendItemWithData(_("OS Description"), Param_OSDescription); 1850 | AppendItemWithData(_("OS Version"), Param_OSVersion); 1851 | #ifdef __LINUX__ 1852 | AppendItemWithData(_("Linux Distribution Info"), Param_LinuxDistributionInfo); 1853 | #endif // #ifdef __LINUX__ 1854 | AppendItemWithData(_("OS Directory"), Param_OSDirectory); 1855 | #if wxCHECK_VERSION(3, 1, 5) 1856 | AppendItemWithData(_("CPU Architecture Name"), Param_CPUArchitectureName); 1857 | #endif 1858 | AppendItemWithData(_("64-bit Platform"), Param_IsPlatform64Bit); 1859 | AppendItemWithData(_("CPU Count"), Param_CPUCount); 1860 | AppendItemWithData(_("Little Endian"), Param_IsPlatformLittleEndian); 1861 | 1862 | Bind(wxEVT_THREAD, &MiscellaneousView::OnObtainFullHostNameThread, this); 1863 | 1864 | UpdateValues(); 1865 | } 1866 | 1867 | void MiscellaneousView::DoUpdateValues() 1868 | { 1869 | int verMajor = 0, verMinor = 0, verMicro = 0; 1870 | wxAppConsole* appInstance = wxAppConsole::GetInstance(); 1871 | wxAppTraits* appTraits = appInstance->GetTraits(); 1872 | const long itemCount = GetItemCount(); 1873 | #ifdef __WXMSW__ 1874 | HANDLE hCurrentProcess = ::GetCurrentProcess(); 1875 | const DWORD GDIObjectCount = ::GetGuiResources(hCurrentProcess, GR_GDIOBJECTS); 1876 | const DWORD UserObjectCount = ::GetGuiResources(hCurrentProcess, GR_USEROBJECTS); 1877 | bool wxRCEmbedded = false; 1878 | #endif 1879 | #ifdef __LINUX__ 1880 | const wxLinuxDistributionInfo linuxDistributionInfo = wxGetLinuxDistributionInfo(); 1881 | #endif // #ifdef __LINUX__ 1882 | 1883 | #if wxCHECK_VERSION(3, 1, 3) 1884 | const wxSystemAppearance systemAppearance = wxSystemSettings::GetAppearance(); 1885 | #endif 1886 | 1887 | #ifdef __WXMSW__ 1888 | { 1889 | wxLogNull logNo; 1890 | 1891 | wxRCEmbedded = wxBitmap("wxBITMAP_STD_COLOURS").IsOk(); 1892 | } 1893 | #endif // #ifdef __WXMSW__ 1894 | 1895 | wxGetOsVersion(&verMajor, &verMinor, &verMicro); 1896 | 1897 | StartObtainFullHostNameThread(); 1898 | 1899 | for ( int i = 0; i < itemCount; ++i ) 1900 | { 1901 | const long param = GetItemData(i); 1902 | wxString value; 1903 | 1904 | switch ( param ) 1905 | { 1906 | case Param_AppName: value = appInstance->GetAppName(); break; 1907 | case Param_AppDisplayName: value = appInstance->GetAppDisplayName(); break; 1908 | case Param_AppVendorName: value = appInstance->GetVendorName(); break; 1909 | case Param_AppVendorDisplayName: value = appInstance->GetVendorDisplayName(); break; 1910 | case Param_AppClassName: value = appInstance->GetClassName(); break; 1911 | case Param_AppHasStderr: value = appTraits->HasStderr() ? _("Yes") : _("No"); break; 1912 | case Param_IsProcess64bit: value = sizeof(void*) == 8 ? _("Yes") : _("No"); break; 1913 | #ifdef __WXMSW__ 1914 | case Param_wxRCEmbedded: value = wxRCEmbedded ? _("Yes") : _("No"); break; 1915 | #endif // #ifdef __WXMSW__ 1916 | #ifdef __UNIX__ 1917 | case Param_UnixDesktopEnvironment: value = appTraits->GetDesktopEnvironment(); break; 1918 | #endif // #ifdef __UNIX__ 1919 | 1920 | case Param_ThemeName: value = GetThemeName(); break; 1921 | #if wxCHECK_VERSION(3, 1, 3) 1922 | case Param_SystemAppearanceName: value = systemAppearance.GetName(); break; 1923 | case Param_SystemAppearanceIsDark: value = systemAppearance.IsDark() ? _("Yes") : _("No"); break; 1924 | #endif 1925 | 1926 | #if defined(__WXMSW__) && wxCHECK_VERSION(3, 3, 0) 1927 | case Param_SystemAppearanceIsSystemDark: value = systemAppearance.IsSystemDark() ? _("Yes") : _("No"); break; 1928 | case Param_SystemAppearanceAreAppsDark: value = systemAppearance.AreAppsDark() ? _("Yes") : _("No"); break; 1929 | #endif //#if defined(__WXMSW__) && wxCHECK_VERSION(3, 3, 0) 1930 | 1931 | #ifdef __WXMSW__ 1932 | case Param_ComCtl32Version: value.Printf("%d", wxApp::GetComCtl32Version()); break; 1933 | case Param_GDIObjectCount: value = GDIObjectCount ? wxString::Format("%lu", GDIObjectCount) : _("N/A"); break; 1934 | case Param_UserObjectCount: value = UserObjectCount ? wxString::Format("%lu", UserObjectCount) : _("N/A"); break; 1935 | case Param_IsProcessDPIAware: value = MSWDPIAwarenessHelper::IsThisProcessDPIAware() ? _("Yes") : _("No"); break; 1936 | case Param_ProcessDPIAwareness: value = MSWDPIAwarenessHelper::GetThisProcessDPIAwarenessStr(); break; 1937 | case Param_ThreadDPIAwarenessContext: value = MSWDPIAwarenessHelper::GetThreadDPIAwarenessContextStr(); break; 1938 | case Param_ProcessSystemDPI: value.Printf("%d", MSWDPIAwarenessHelper::GetSystemDpiForThisProcess()); break; 1939 | case Param_WindowDPI: value.Printf("%d", MSWDPIAwarenessHelper::GetDpiForWindow(this)); break; 1940 | #endif // #ifdef __WXMSW__ 1941 | 1942 | case Param_WindowContentScaleFactor: value.Printf("%.2f", GetContentScaleFactor()); break; 1943 | case Param_PathSeparator: value.Printf("%s", wxString(wxFileName::GetPathSeparator())); break; 1944 | case Param_UserId: value = wxGetUserId(); break; 1945 | case Param_UserName: value = wxGetUserName(); break; 1946 | case Param_SystemEncodingName: value = wxLocale::GetSystemEncodingName(); break; 1947 | case Param_SystemLanguage: value = wxLocale::GetLanguageName(wxLocale::GetSystemLanguage()); break; 1948 | #if wxCHECK_VERSION(3, 1, 6) 1949 | case Param_UILocaleName: value = wxUILocale::GetCurrent().GetName(); break; 1950 | #endif 1951 | case Param_HostName: value = wxGetHostName(); break; 1952 | case Param_FullHostName: value = _(""); break; 1953 | case Param_OSDescription: value = wxGetOsDescription(); break; 1954 | case Param_OSVersion: value.Printf(_("%d.%d.%d"), verMajor, verMinor, verMicro); break; 1955 | #ifdef __LINUX__ 1956 | case Param_LinuxDistributionInfo: value.Printf("%s (%s)", linuxDistributionInfo.Description, linuxDistributionInfo.CodeName); break; 1957 | #endif // #ifdef __LINUX__ 1958 | case Param_OSDirectory: value = wxGetOSDirectory(); break; 1959 | #if wxCHECK_VERSION(3, 1, 5) 1960 | case Param_CPUArchitectureName: value = wxGetCpuArchitectureName(); break; 1961 | #endif 1962 | case Param_IsPlatform64Bit: value = wxIsPlatform64Bit() ? _("Yes") : _("No"); break; 1963 | case Param_CPUCount: value.Printf("%d", wxThread::GetCPUCount()); break; 1964 | case Param_IsPlatformLittleEndian: value = wxIsPlatformLittleEndian() ? _("Yes") : _("No"); break; 1965 | 1966 | default: 1967 | wxFAIL; 1968 | } 1969 | 1970 | SetItem(i, Column_Value, value); 1971 | } 1972 | } 1973 | 1974 | void MiscellaneousView::OnObtainFullHostNameThread(wxThreadEvent& event) 1975 | { 1976 | const long itemIndex = FindItem(-1, Param_FullHostName); 1977 | 1978 | if ( itemIndex != wxNOT_FOUND ) 1979 | SetItem(itemIndex, Column_Value, event.GetString()); 1980 | } 1981 | 1982 | void MiscellaneousView::StartObtainFullHostNameThread() 1983 | { 1984 | StopObtainFullHostNameThread(); 1985 | 1986 | m_obtainFullHostNameThread = new ObtainFullHostNameThread(this); 1987 | if ( m_obtainFullHostNameThread->Run() != wxTHREAD_NO_ERROR ) 1988 | { 1989 | delete m_obtainFullHostNameThread; 1990 | m_obtainFullHostNameThread= nullptr; 1991 | wxLogError(_("Could not create the thread needed to obtain the full host name.")); 1992 | } 1993 | } 1994 | 1995 | void MiscellaneousView::StopObtainFullHostNameThread() 1996 | { 1997 | if ( m_obtainFullHostNameThread ) 1998 | { 1999 | m_obtainFullHostNameThread->Delete(); 2000 | delete m_obtainFullHostNameThread; 2001 | m_obtainFullHostNameThread = nullptr; 2002 | } 2003 | } 2004 | 2005 | /************************************************* 2006 | 2007 | PreprocessorDefinesView 2008 | 2009 | *************************************************/ 2010 | 2011 | class PreprocessorDefinesView : public SysInfoListView 2012 | { 2013 | public: 2014 | PreprocessorDefinesView(wxWindow* parent); 2015 | 2016 | wxArrayString GetValues(const wxString& separator) const override 2017 | { 2018 | return GetNameAndValueValues(Column_Name, Column_Value, separator); 2019 | } 2020 | 2021 | protected: 2022 | void DoUpdateValues() override; 2023 | private: 2024 | enum 2025 | { 2026 | Column_Name = 0, 2027 | Column_Value, 2028 | }; 2029 | }; 2030 | 2031 | PreprocessorDefinesView::PreprocessorDefinesView(wxWindow* parent) 2032 | : SysInfoListView(parent) 2033 | { 2034 | InsertColumn(Column_Name, _("Name")); 2035 | InsertColumn(Column_Value, _("Value")); 2036 | 2037 | UpdateValues(); 2038 | } 2039 | 2040 | wxString DefineValueToText(const wxString& name, const wxString& value) 2041 | { 2042 | if ( name == value ) 2043 | return _(""); 2044 | 2045 | if ( value.empty() ) 2046 | return _(""); 2047 | 2048 | return value; 2049 | } 2050 | 2051 | #define APPEND_DEFINE_ITEM(value) \ 2052 | itemIndex = InsertItem(GetItemCount(), #value); \ 2053 | SetItem(itemIndex, Column_Value, DefineValueToText(#value, wxSTRINGIZE_T(value))); 2054 | 2055 | #define APPEND_HAS_FEATURE_ITEM(name, value) \ 2056 | itemIndex = InsertItem(GetItemCount(), name); \ 2057 | SetItem(itemIndex, Column_Value, hasDefine ? _("Yes") : _("No")); \ 2058 | hasDefine = false; 2059 | 2060 | void PreprocessorDefinesView::DoUpdateValues() 2061 | { 2062 | // preprocessor defines cannot be 2063 | // changed when the application is running 2064 | if ( GetItemCount() > 0 ) 2065 | return; 2066 | 2067 | long itemIndex; 2068 | bool hasDefine{false}; 2069 | 2070 | APPEND_DEFINE_ITEM(__cplusplus) 2071 | 2072 | #ifdef _MSC_VER 2073 | APPEND_DEFINE_ITEM(_MSC_VER) 2074 | APPEND_DEFINE_ITEM(_MSC_FULL_VER) 2075 | APPEND_DEFINE_ITEM(_MSVC_LANG) 2076 | APPEND_DEFINE_ITEM(_DEBUG) 2077 | APPEND_DEFINE_ITEM(_DLL) 2078 | APPEND_DEFINE_ITEM(_MSVC_STL_VERSION) 2079 | #endif // #ifdef _MSC_VER 2080 | 2081 | #ifdef __GNUC__ 2082 | APPEND_DEFINE_ITEM(__GNUC__) 2083 | APPEND_DEFINE_ITEM(__GNUC_MINOR__) 2084 | APPEND_DEFINE_ITEM(__GNUC_PATCHLEVEL__) 2085 | APPEND_DEFINE_ITEM(__GLIBCXX__) 2086 | #endif // #ifdef(__GNUC__) 2087 | 2088 | #ifdef __MINGW32__ 2089 | APPEND_DEFINE_ITEM(__MINGW32__) 2090 | APPEND_DEFINE_ITEM(__MINGW32_MAJOR_VERSION) 2091 | APPEND_DEFINE_ITEM(__MINGW32_MINOR_VERSION) 2092 | #endif 2093 | 2094 | #ifdef __MINGW64__ 2095 | APPEND_DEFINE_ITEM(__MINGW64__) 2096 | APPEND_DEFINE_ITEM(__MINGW64_VERSION_MAJOR) 2097 | APPEND_DEFINE_ITEM(__MINGW64_VERSION_MINOR) 2098 | #endif 2099 | 2100 | #ifdef __MINGW32_TOOLCHAIN__ 2101 | APPEND_DEFINE_ITEM(__MINGW32_TOOLCHAIN__) 2102 | #endif 2103 | 2104 | #ifdef __MINGW64_TOOLCHAIN__ 2105 | APPEND_DEFINE_ITEM(__MINGW64_TOOLCHAIN__) 2106 | #endif 2107 | 2108 | #ifdef __clang__ 2109 | APPEND_DEFINE_ITEM(__clang__) 2110 | APPEND_DEFINE_ITEM(__clang_major__) 2111 | APPEND_DEFINE_ITEM(__clang_minor__) 2112 | APPEND_DEFINE_ITEM(__clang_patchlevel__) 2113 | APPEND_DEFINE_ITEM(_LIBCPP_VERSION) 2114 | #endif 2115 | 2116 | #ifdef __CYGWIN__ 2117 | APPEND_DEFINE_ITEM(__CYGWIN__) 2118 | #endif 2119 | 2120 | APPEND_DEFINE_ITEM(NDEBUG) 2121 | 2122 | #ifdef __WXGTK__ 2123 | APPEND_DEFINE_ITEM(__WXGTK3__) 2124 | #endif 2125 | 2126 | #ifdef __WXMSW__ 2127 | APPEND_DEFINE_ITEM(_UNICODE) 2128 | APPEND_DEFINE_ITEM(WXUSINGDLL) 2129 | #endif 2130 | 2131 | const long ABIVersion = wxABI_VERSION; 2132 | itemIndex = InsertItem(GetItemCount(), "wxABI_VERSION"); 2133 | SetItem(itemIndex, Column_Value, wxString::Format("%ld", ABIVersion)); 2134 | 2135 | #ifdef WXWIN_COMPATIBILITY_2_8 2136 | APPEND_DEFINE_ITEM(WXWIN_COMPATIBILITY_2_8) 2137 | #endif 2138 | #ifdef WXWIN_COMPATIBILITY_3_0 2139 | APPEND_DEFINE_ITEM(WXWIN_COMPATIBILITY_3_0) 2140 | #endif 2141 | #ifdef WXWIN_COMPATIBILITY_3_2 2142 | APPEND_DEFINE_ITEM(WXWIN_COMPATIBILITY_3_2) 2143 | #endif 2144 | 2145 | itemIndex = InsertItem(GetItemCount(), "WX_BUILD_OPTIONS_SIGNATURE"); 2146 | SetItem(itemIndex, Column_Value, WX_BUILD_OPTIONS_SIGNATURE); 2147 | 2148 | APPEND_DEFINE_ITEM(wxUSE_REPRODUCIBLE_BUILD) 2149 | APPEND_DEFINE_ITEM(wxDEBUG_LEVEL) 2150 | APPEND_DEFINE_ITEM(wxUSE_ON_FATAL_EXCEPTION) 2151 | APPEND_DEFINE_ITEM(wxUSE_STACKWALKER) 2152 | APPEND_DEFINE_ITEM(wxUSE_DEBUGREPORT) 2153 | APPEND_DEFINE_ITEM(wxUSE_DEBUG_CONTEXT) 2154 | APPEND_DEFINE_ITEM(wxUSE_MEMORY_TRACING) 2155 | APPEND_DEFINE_ITEM(wxUSE_GLOBAL_MEMORY_OPERATORS) 2156 | APPEND_DEFINE_ITEM(wxUSE_DEBUG_NEW_ALWAYS) 2157 | #ifdef _MSC_VER 2158 | APPEND_DEFINE_ITEM(wxUSE_VC_CRTDBG) 2159 | #endif // #ifdef _MSC_VER 2160 | #ifdef __WXMSW__ 2161 | APPEND_DEFINE_ITEM(wxUSE_NO_MANIFEST) 2162 | #if !defined(wxUSE_NO_MANIFEST) || (wxUSE_NO_MANIFEST == 0) 2163 | APPEND_DEFINE_ITEM(wxUSE_RC_MANIFEST) 2164 | #endif //#if !defined(wxUSE_NO_MANIFEST) || (wxUSE_NO_MANIFEST == 0) 2165 | #if defined(wxUSE_RC_MANIFEST) && wxUSE_RC_MANIFEST 2166 | APPEND_DEFINE_ITEM(wxUSE_DPI_AWARE_MANIFEST) 2167 | #endif // #if defined(wxUSE_RC_MANIFEST) && wxUSE_RC_MANIFEST 2168 | #endif // #ifdef __WXMSW__ 2169 | APPEND_DEFINE_ITEM(wxUSE_UNICODE) 2170 | APPEND_DEFINE_ITEM(wxUSE_UNICODE_WCHAR) 2171 | APPEND_DEFINE_ITEM(wxUSE_UNICODE_UTF8) 2172 | APPEND_DEFINE_ITEM(wxUSE_UTF8_LOCALE_ONLY) 2173 | APPEND_DEFINE_ITEM(wxUSE_UNSAFE_WXSTRING_CONV) 2174 | 2175 | // this may or may be not defined depending on wxUSE_UNSAFE_WXSTRING_CONV definition 2176 | // and whether the user defined it in their project 2177 | #ifdef wxNO_UNSAFE_WXSTRING_CONV 2178 | hasDefine = true; 2179 | #endif 2180 | APPEND_HAS_FEATURE_ITEM("wxNO_UNSAFE_WXSTRING_CONV", hasDefine) 2181 | 2182 | APPEND_DEFINE_ITEM(wxNO_IMPLICIT_WXSTRING_ENCODING) 2183 | APPEND_DEFINE_ITEM(wxUSE_EXCEPTIONS) 2184 | APPEND_DEFINE_ITEM(wxUSE_EXTENDED_RTTI) 2185 | APPEND_DEFINE_ITEM(wxUSE_LOG) 2186 | APPEND_DEFINE_ITEM(wxUSE_LOGWINDOW) 2187 | APPEND_DEFINE_ITEM(wxUSE_LOGGUI) 2188 | APPEND_DEFINE_ITEM(wxUSE_LOG_DIALOG) 2189 | APPEND_DEFINE_ITEM(wxUSE_CMDLINE_PARSER) 2190 | APPEND_DEFINE_ITEM(wxUSE_THREADS) 2191 | APPEND_DEFINE_ITEM(wxUSE_STREAMS) 2192 | APPEND_DEFINE_ITEM(wxUSE_PRINTF_POS_PARAMS) 2193 | APPEND_DEFINE_ITEM(wxUSE_COMPILER_TLS) 2194 | #if (!wxCHECK_VERSION(3,3,0)) 2195 | APPEND_DEFINE_ITEM(wxUSE_STL) 2196 | APPEND_DEFINE_ITEM(wxUSE_STD_DEFAULT) 2197 | APPEND_DEFINE_ITEM(wxUSE_STD_CONTAINERS_COMPATIBLY) 2198 | APPEND_DEFINE_ITEM(wxUSE_STD_STRING) 2199 | #endif // #if (!wxCHECK_VERSION(3,3,0) 2200 | APPEND_DEFINE_ITEM(wxUSE_STD_CONTAINERS) 2201 | APPEND_DEFINE_ITEM(wxUSE_STD_IOSTREAM) 2202 | APPEND_DEFINE_ITEM(wxUSE_STD_STRING_CONV_IN_WXSTRING) 2203 | APPEND_DEFINE_ITEM(wxUSE_LONGLONG) 2204 | APPEND_DEFINE_ITEM(wxUSE_BASE64) 2205 | APPEND_DEFINE_ITEM(wxUSE_CONSOLE_EVENTLOOP) 2206 | APPEND_DEFINE_ITEM(wxUSE_FILE) 2207 | APPEND_DEFINE_ITEM(wxUSE_FFILE) 2208 | APPEND_DEFINE_ITEM(wxUSE_FSVOLUME) 2209 | APPEND_DEFINE_ITEM(wxUSE_SECRETSTORE) 2210 | APPEND_DEFINE_ITEM(wxUSE_STDPATHS) 2211 | APPEND_DEFINE_ITEM(wxUSE_TEXTBUFFER) 2212 | APPEND_DEFINE_ITEM(wxUSE_TEXTFILE) 2213 | APPEND_DEFINE_ITEM(wxUSE_INTL) 2214 | APPEND_DEFINE_ITEM(wxUSE_XLOCALE) 2215 | APPEND_DEFINE_ITEM(wxUSE_DATETIME) 2216 | APPEND_DEFINE_ITEM(wxUSE_TIMER) 2217 | APPEND_DEFINE_ITEM(wxUSE_STOPWATCH) 2218 | APPEND_DEFINE_ITEM(wxUSE_FSWATCHER) 2219 | APPEND_DEFINE_ITEM(wxUSE_CONFIG) 2220 | APPEND_DEFINE_ITEM(wxUSE_CONFIG_NATIVE) 2221 | APPEND_DEFINE_ITEM(wxUSE_DIALUP_MANAGER) 2222 | APPEND_DEFINE_ITEM(wxUSE_DYNLIB_CLASS) 2223 | APPEND_DEFINE_ITEM(wxUSE_DYNAMIC_LOADER) 2224 | APPEND_DEFINE_ITEM(wxUSE_SOCKETS) 2225 | APPEND_DEFINE_ITEM(wxUSE_IPV6) 2226 | APPEND_DEFINE_ITEM(wxUSE_FILESYSTEM) 2227 | APPEND_DEFINE_ITEM(wxUSE_FS_ZIP) 2228 | APPEND_DEFINE_ITEM(wxUSE_FS_ARCHIVE) 2229 | APPEND_DEFINE_ITEM(wxUSE_FS_INET) 2230 | APPEND_DEFINE_ITEM(wxUSE_ARCHIVE_STREAMS) 2231 | APPEND_DEFINE_ITEM(wxUSE_ZIPSTREAM) 2232 | APPEND_DEFINE_ITEM(wxUSE_TARSTREAM) 2233 | APPEND_DEFINE_ITEM(wxUSE_ZLIB) 2234 | APPEND_DEFINE_ITEM(wxUSE_LIBLZMA) 2235 | APPEND_DEFINE_ITEM(wxUSE_APPLE_IEEE) 2236 | APPEND_DEFINE_ITEM(wxUSE_JOYSTICK) 2237 | APPEND_DEFINE_ITEM(wxUSE_FONTENUM) 2238 | APPEND_DEFINE_ITEM(wxUSE_FONTMAP) 2239 | APPEND_DEFINE_ITEM(wxUSE_MIMETYPE) 2240 | APPEND_DEFINE_ITEM(wxUSE_PROTOCOL) 2241 | APPEND_DEFINE_ITEM(wxUSE_PROTOCOL_FILE) 2242 | APPEND_DEFINE_ITEM(wxUSE_PROTOCOL_FTP) 2243 | APPEND_DEFINE_ITEM(wxUSE_PROTOCOL_HTTP) 2244 | APPEND_DEFINE_ITEM(wxUSE_URL) 2245 | APPEND_DEFINE_ITEM(wxUSE_URL_NATIVE) 2246 | APPEND_DEFINE_ITEM(wxUSE_VARIANT) 2247 | APPEND_DEFINE_ITEM(wxUSE_ANY) 2248 | APPEND_DEFINE_ITEM(wxUSE_REGEX) 2249 | APPEND_DEFINE_ITEM(wxUSE_SYSTEM_OPTIONS) 2250 | APPEND_DEFINE_ITEM(wxUSE_SOUND) 2251 | APPEND_DEFINE_ITEM(wxUSE_MEDIACTRL) 2252 | APPEND_DEFINE_ITEM(wxUSE_XRC) 2253 | APPEND_DEFINE_ITEM(wxUSE_XML) 2254 | APPEND_DEFINE_ITEM(wxUSE_AUI) 2255 | APPEND_DEFINE_ITEM(wxUSE_RIBBON) 2256 | APPEND_DEFINE_ITEM(wxUSE_PROPGRID) 2257 | APPEND_DEFINE_ITEM(wxUSE_STC) 2258 | APPEND_DEFINE_ITEM(wxUSE_WEBVIEW) 2259 | #ifdef __WXMSW__ 2260 | APPEND_DEFINE_ITEM(wxUSE_WEBVIEW_IE) 2261 | #ifdef wxUSE_WEBVIEW_EDGE 2262 | APPEND_DEFINE_ITEM(wxUSE_WEBVIEW_EDGE) 2263 | #endif 2264 | #ifdef wxUSE_WEBVIEW_EDGE_STATIC 2265 | APPEND_DEFINE_ITEM(wxUSE_WEBVIEW_EDGE_STATIC) 2266 | #endif 2267 | #else 2268 | APPEND_DEFINE_ITEM(wxUSE_WEBVIEW_WEBKIT) 2269 | #endif // #else 2270 | #ifdef __WXGTK__ 2271 | APPEND_DEFINE_ITEM(wxUSE_WEBVIEW_WEBKIT2) 2272 | #endif // #ifdef __WXGTK__ 2273 | 2274 | APPEND_DEFINE_ITEM(wxUSE_GRAPHICS_CONTEXT) 2275 | APPEND_DEFINE_ITEM(wxUSE_CAIRO) 2276 | APPEND_DEFINE_ITEM(wxUSE_CONTROLS) 2277 | APPEND_DEFINE_ITEM(wxUSE_MARKUP) 2278 | APPEND_DEFINE_ITEM(wxUSE_POPUPWIN) 2279 | APPEND_DEFINE_ITEM(wxUSE_TIPWINDOW) 2280 | APPEND_DEFINE_ITEM(wxUSE_ACTIVITYINDICATOR) 2281 | APPEND_DEFINE_ITEM(wxUSE_ANIMATIONCTRL) 2282 | APPEND_DEFINE_ITEM(wxUSE_BANNERWINDOW) 2283 | APPEND_DEFINE_ITEM(wxUSE_BUTTON) 2284 | APPEND_DEFINE_ITEM(wxUSE_BMPBUTTON) 2285 | APPEND_DEFINE_ITEM(wxUSE_CALENDARCTRL) 2286 | APPEND_DEFINE_ITEM(wxUSE_CHECKBOX) 2287 | APPEND_DEFINE_ITEM(wxUSE_CHOICE) 2288 | APPEND_DEFINE_ITEM(wxUSE_COLLPANE) 2289 | APPEND_DEFINE_ITEM(wxUSE_COLOURPICKERCTRL) 2290 | APPEND_DEFINE_ITEM(wxUSE_COMBOBOX) 2291 | APPEND_DEFINE_ITEM(wxUSE_COMMANDLINKBUTTON) 2292 | APPEND_DEFINE_ITEM(wxUSE_DATAVIEWCTRL) 2293 | APPEND_DEFINE_ITEM(wxUSE_DATEPICKCTRL) 2294 | APPEND_DEFINE_ITEM(wxUSE_DIRPICKERCTRL) 2295 | APPEND_DEFINE_ITEM(wxUSE_EDITABLELISTBOX) 2296 | APPEND_DEFINE_ITEM(wxUSE_FILECTRL) 2297 | APPEND_DEFINE_ITEM(wxUSE_FILEPICKERCTRL) 2298 | APPEND_DEFINE_ITEM(wxUSE_FONTPICKERCTRL) 2299 | APPEND_DEFINE_ITEM(wxUSE_GAUGE) 2300 | APPEND_DEFINE_ITEM(wxUSE_HEADERCTRL) 2301 | APPEND_DEFINE_ITEM(wxUSE_HYPERLINKCTRL) 2302 | APPEND_DEFINE_ITEM(wxUSE_LISTBOX) 2303 | APPEND_DEFINE_ITEM(wxUSE_LISTCTRL) 2304 | APPEND_DEFINE_ITEM(wxUSE_RADIOBOX) 2305 | APPEND_DEFINE_ITEM(wxUSE_RADIOBTN) 2306 | APPEND_DEFINE_ITEM(wxUSE_RICHMSGDLG) 2307 | APPEND_DEFINE_ITEM(wxUSE_SCROLLBAR) 2308 | APPEND_DEFINE_ITEM(wxUSE_SEARCHCTRL) 2309 | APPEND_DEFINE_ITEM(wxUSE_SLIDER) 2310 | APPEND_DEFINE_ITEM(wxUSE_SPINBTN) 2311 | APPEND_DEFINE_ITEM(wxUSE_SPINCTRL) 2312 | APPEND_DEFINE_ITEM(wxUSE_STATBOX) 2313 | APPEND_DEFINE_ITEM(wxUSE_STATLINE) 2314 | APPEND_DEFINE_ITEM(wxUSE_STATTEXT) 2315 | APPEND_DEFINE_ITEM(wxUSE_STATBMP) 2316 | APPEND_DEFINE_ITEM(wxUSE_TEXTCTRL) 2317 | APPEND_DEFINE_ITEM(wxUSE_TIMEPICKCTRL) 2318 | APPEND_DEFINE_ITEM(wxUSE_TOGGLEBTN) 2319 | APPEND_DEFINE_ITEM(wxUSE_TREECTRL) 2320 | APPEND_DEFINE_ITEM(wxUSE_TREELISTCTRL) 2321 | APPEND_DEFINE_ITEM(wxUSE_STATUSBAR) 2322 | APPEND_DEFINE_ITEM(wxUSE_NATIVE_STATUSBAR) 2323 | APPEND_DEFINE_ITEM(wxUSE_TOOLBAR) 2324 | APPEND_DEFINE_ITEM(wxUSE_TOOLBAR_NATIVE) 2325 | APPEND_DEFINE_ITEM(wxUSE_NOTEBOOK) 2326 | APPEND_DEFINE_ITEM(wxUSE_LISTBOOK) 2327 | APPEND_DEFINE_ITEM(wxUSE_CHOICEBOOK) 2328 | APPEND_DEFINE_ITEM(wxUSE_TREEBOOK) 2329 | APPEND_DEFINE_ITEM(wxUSE_TOOLBOOK) 2330 | APPEND_DEFINE_ITEM(wxUSE_TASKBARICON) 2331 | APPEND_DEFINE_ITEM(wxUSE_GRID) 2332 | APPEND_DEFINE_ITEM(wxUSE_MINIFRAME) 2333 | APPEND_DEFINE_ITEM(wxUSE_COMBOCTRL) 2334 | APPEND_DEFINE_ITEM(wxUSE_ODCOMBOBOX) 2335 | APPEND_DEFINE_ITEM(wxUSE_BITMAPCOMBOBOX) 2336 | APPEND_DEFINE_ITEM(wxUSE_REARRANGECTRL) 2337 | APPEND_DEFINE_ITEM(wxUSE_ADDREMOVECTRL) 2338 | APPEND_DEFINE_ITEM(wxUSE_ACCEL) 2339 | APPEND_DEFINE_ITEM(wxUSE_ARTPROVIDER_STD) 2340 | APPEND_DEFINE_ITEM(wxUSE_ARTPROVIDER_TANGO) 2341 | APPEND_DEFINE_ITEM(wxUSE_CARET) 2342 | APPEND_DEFINE_ITEM(wxUSE_DISPLAY) 2343 | APPEND_DEFINE_ITEM(wxUSE_GEOMETRY) 2344 | APPEND_DEFINE_ITEM(wxUSE_IMAGLIST) 2345 | APPEND_DEFINE_ITEM(wxUSE_INFOBAR) 2346 | APPEND_DEFINE_ITEM(wxUSE_MENUS) 2347 | APPEND_DEFINE_ITEM(wxUSE_NOTIFICATION_MESSAGE) 2348 | APPEND_DEFINE_ITEM(wxUSE_PREFERENCES_EDITOR) 2349 | APPEND_DEFINE_ITEM(wxUSE_PRIVATE_FONTS) 2350 | APPEND_DEFINE_ITEM(wxUSE_RICHTOOLTIP) 2351 | APPEND_DEFINE_ITEM(wxUSE_SASH) 2352 | APPEND_DEFINE_ITEM(wxUSE_SPLITTER) 2353 | APPEND_DEFINE_ITEM(wxUSE_TOOLTIPS) 2354 | APPEND_DEFINE_ITEM(wxUSE_VALIDATORS) 2355 | APPEND_DEFINE_ITEM(wxUSE_AUTOID_MANAGEMENT) 2356 | APPEND_DEFINE_ITEM(wxUSE_BUSYINFO) 2357 | APPEND_DEFINE_ITEM(wxUSE_CHOICEDLG) 2358 | APPEND_DEFINE_ITEM(wxUSE_COLOURDLG) 2359 | APPEND_DEFINE_ITEM(wxUSE_DIRDLG) 2360 | APPEND_DEFINE_ITEM(wxUSE_FILEDLG) 2361 | APPEND_DEFINE_ITEM(wxUSE_FINDREPLDLG) 2362 | APPEND_DEFINE_ITEM(wxUSE_FONTDLG) 2363 | APPEND_DEFINE_ITEM(wxUSE_MSGDLG) 2364 | APPEND_DEFINE_ITEM(wxUSE_PROGRESSDLG) 2365 | APPEND_DEFINE_ITEM(wxUSE_NATIVE_PROGRESSDLG) 2366 | APPEND_DEFINE_ITEM(wxUSE_STARTUP_TIPS) 2367 | APPEND_DEFINE_ITEM(wxUSE_TEXTDLG) 2368 | APPEND_DEFINE_ITEM(wxUSE_NUMBERDLG) 2369 | APPEND_DEFINE_ITEM(wxUSE_SPLASH) 2370 | APPEND_DEFINE_ITEM(wxUSE_WIZARDDLG) 2371 | APPEND_DEFINE_ITEM(wxUSE_ABOUTDLG) 2372 | APPEND_DEFINE_ITEM(wxUSE_FILE_HISTORY) 2373 | APPEND_DEFINE_ITEM(wxUSE_METAFILE) 2374 | APPEND_DEFINE_ITEM(wxUSE_WIN_METAFILES_ALWAYS) 2375 | APPEND_DEFINE_ITEM(wxUSE_MDI) 2376 | APPEND_DEFINE_ITEM(wxUSE_DOC_VIEW_ARCHITECTURE) 2377 | APPEND_DEFINE_ITEM(wxUSE_MDI_ARCHITECTURE) 2378 | APPEND_DEFINE_ITEM(wxUSE_PRINTING_ARCHITECTURE) 2379 | APPEND_DEFINE_ITEM(wxUSE_HTML) 2380 | APPEND_DEFINE_ITEM(wxUSE_GLCANVAS) 2381 | APPEND_DEFINE_ITEM(wxUSE_RICHTEXT) 2382 | APPEND_DEFINE_ITEM(wxUSE_CLIPBOARD) 2383 | APPEND_DEFINE_ITEM(wxUSE_DATAOBJ) 2384 | APPEND_DEFINE_ITEM(wxUSE_DRAG_AND_DROP) 2385 | APPEND_DEFINE_ITEM(wxUSE_SNGLINST_CHECKER) 2386 | APPEND_DEFINE_ITEM(wxUSE_DRAGIMAGE) 2387 | APPEND_DEFINE_ITEM(wxUSE_IPC) 2388 | APPEND_DEFINE_ITEM(wxUSE_HELP) 2389 | APPEND_DEFINE_ITEM(wxUSE_WXHTML_HELP) 2390 | APPEND_DEFINE_ITEM(wxUSE_CONSTRAINTS) 2391 | APPEND_DEFINE_ITEM(wxUSE_SPLINES) 2392 | APPEND_DEFINE_ITEM(wxUSE_MOUSEWHEEL) 2393 | APPEND_DEFINE_ITEM(wxUSE_UIACTIONSIMULATOR) 2394 | APPEND_DEFINE_ITEM(wxUSE_POSTSCRIPT) 2395 | APPEND_DEFINE_ITEM(wxUSE_AFM_FOR_POSTSCRIPT) 2396 | APPEND_DEFINE_ITEM(wxUSE_SVG) 2397 | APPEND_DEFINE_ITEM(wxUSE_DC_TRANSFORM_MATRIX) 2398 | APPEND_DEFINE_ITEM(wxUSE_IMAGE) 2399 | APPEND_DEFINE_ITEM(wxUSE_LIBPNG) 2400 | APPEND_DEFINE_ITEM(wxUSE_LIBJPEG) 2401 | APPEND_DEFINE_ITEM(wxUSE_LIBTIFF) 2402 | APPEND_DEFINE_ITEM(wxUSE_TGA) 2403 | APPEND_DEFINE_ITEM(wxUSE_GIF) 2404 | APPEND_DEFINE_ITEM(wxUSE_PNM) 2405 | APPEND_DEFINE_ITEM(wxUSE_PCX) 2406 | APPEND_DEFINE_ITEM(wxUSE_IFF) 2407 | APPEND_DEFINE_ITEM(wxUSE_XPM) 2408 | APPEND_DEFINE_ITEM(wxUSE_ICO_CUR) 2409 | APPEND_DEFINE_ITEM(wxUSE_PALETTE) 2410 | APPEND_DEFINE_ITEM(wxUSE_WXDIB) 2411 | APPEND_DEFINE_ITEM(wxUSE_OWNER_DRAWN) 2412 | APPEND_DEFINE_ITEM(wxUSE_TASKBARICON_BALLOONS) 2413 | APPEND_DEFINE_ITEM(wxUSE_TASKBARBUTTON) 2414 | APPEND_DEFINE_ITEM(wxUSE_INICONF) 2415 | APPEND_DEFINE_ITEM(wxUSE_DATEPICKCTRL_GENERIC) 2416 | APPEND_DEFINE_ITEM(wxUSE_TIMEPICKCTRL_GENERIC) 2417 | #ifdef __WXMSW__ 2418 | APPEND_DEFINE_ITEM(wxUSE_ACCESSIBILITY) 2419 | APPEND_DEFINE_ITEM(wxUSE_ACTIVEX) 2420 | APPEND_DEFINE_ITEM(wxUSE_COMBOCTRL_POPUP_ANIMATION) 2421 | APPEND_DEFINE_ITEM(wxUSE_COMMON_DIALOGS) 2422 | APPEND_DEFINE_ITEM(wxUSE_CRASHREPORT) 2423 | APPEND_DEFINE_ITEM(wxUSE_DBGHELP) 2424 | APPEND_DEFINE_ITEM(wxUSE_DC_CACHEING) 2425 | APPEND_DEFINE_ITEM(wxUSE_DDE_FOR_IPC) 2426 | APPEND_DEFINE_ITEM(wxDIALOG_UNIT_COMPATIBILITY) 2427 | APPEND_DEFINE_ITEM(wxUSE_ENH_METAFILE) 2428 | APPEND_DEFINE_ITEM(wxUSE_GRAPHICS_GDIPLUS) 2429 | APPEND_DEFINE_ITEM(wxUSE_GRAPHICS_DIRECT2D) 2430 | #endif // #ifdef __WXMSW__ 2431 | APPEND_DEFINE_ITEM(wxUSE_HOTKEY) 2432 | 2433 | #ifdef __WXMSW__ 2434 | APPEND_DEFINE_ITEM(wxUSE_INKEDIT) 2435 | APPEND_DEFINE_ITEM(wxUSE_MS_HTML_HELP) 2436 | APPEND_DEFINE_ITEM(wxUSE_OLE) 2437 | APPEND_DEFINE_ITEM(wxUSE_OLE_AUTOMATION) 2438 | APPEND_DEFINE_ITEM(wxUSE_REGKEY) 2439 | APPEND_DEFINE_ITEM(wxUSE_RICHEDIT) 2440 | APPEND_DEFINE_ITEM(wxUSE_RICHEDIT2) 2441 | APPEND_DEFINE_ITEM(wxUSE_UXTHEME) 2442 | APPEND_DEFINE_ITEM(wxUSE_WINRT) 2443 | APPEND_DEFINE_ITEM(wxUSE_WINSOCK2) 2444 | #endif // #ifdef __WXMSW__ 2445 | 2446 | #ifdef __WXGTK__ 2447 | APPEND_DEFINE_ITEM(wxUSE_DETECT_SM) 2448 | APPEND_DEFINE_ITEM(wxUSE_GTKPRINT) 2449 | #endif // #ifdef __WXGTK__ 2450 | 2451 | #ifdef __UNIX__ 2452 | APPEND_DEFINE_ITEM(wxUSE_EPOLL_DISPATCHER) 2453 | APPEND_DEFINE_ITEM(wxUSE_SELECT_DISPATCHER) 2454 | APPEND_DEFINE_ITEM(wxUSE_GSTREAMER) 2455 | APPEND_DEFINE_ITEM(wxUSE_LIBMSPACK) 2456 | APPEND_DEFINE_ITEM(wxUSE_LIBSDL) 2457 | APPEND_DEFINE_ITEM(wxUSE_PLUGINS) 2458 | APPEND_DEFINE_ITEM(wxUSE_XTEST) 2459 | #endif // #ifdef __UNIX__ 2460 | 2461 | #ifdef __WXMAC__ 2462 | APPEND_DEFINE_ITEM(wxUSE_WEBKIT) 2463 | #endif// #ifdef __WXMAC__ 2464 | 2465 | #ifdef __WXUNIVERSAL__ 2466 | APPEND_DEFINE_ITEM(wxUSE_ALL_THEMES) 2467 | APPEND_DEFINE_ITEM(wxUSE_THEME_GTK) 2468 | APPEND_DEFINE_ITEM(wxUSE_THEME_METAL) 2469 | APPEND_DEFINE_ITEM(wxUSE_THEME_MONO) 2470 | APPEND_DEFINE_ITEM(wxUSE_THEME_WIN32) 2471 | #endif // #ifdef __WXUNIVERSAL__ 2472 | 2473 | 2474 | #ifdef wxHAS_3STATE_CHECKBOX 2475 | hasDefine = true; 2476 | #endif 2477 | APPEND_HAS_FEATURE_ITEM("wxHAS_3STATE_CHECKBOX", hasDefine) 2478 | 2479 | #ifdef wxHAS_ATOMIC_OPS 2480 | hasDefine = true; 2481 | #endif 2482 | APPEND_HAS_FEATURE_ITEM("wxHAS_ATOMIC_OPS", hasDefine) 2483 | 2484 | #ifdef wxHAS_BITMAPTOGGLEBUTTON 2485 | hasDefine = true; 2486 | #endif 2487 | APPEND_HAS_FEATURE_ITEM("wxHAS_BITMAPTOGGLEBUTTON", hasDefine) 2488 | 2489 | #ifdef wxHAS_MEMBER_DEFAULT 2490 | hasDefine = true; 2491 | #endif 2492 | APPEND_HAS_FEATURE_ITEM("wxHAS_MEMBER_DEFAULT", hasDefine) 2493 | 2494 | #ifdef wxHAS_LARGE_FILES 2495 | hasDefine = true; 2496 | #endif 2497 | APPEND_HAS_FEATURE_ITEM("wxHAS_LARGE_FILES", hasDefine) 2498 | 2499 | #ifdef wxHAS_LARGE_FFILES 2500 | hasDefine = true; 2501 | #endif 2502 | APPEND_HAS_FEATURE_ITEM("wxHAS_LARGE_FFILES", hasDefine) 2503 | 2504 | #ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG 2505 | hasDefine = true; 2506 | #endif 2507 | APPEND_HAS_FEATURE_ITEM("wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG", hasDefine) 2508 | 2509 | #ifdef wxHAS_MULTIPLE_FILEDLG_FILTERS 2510 | hasDefine = true; 2511 | #endif 2512 | APPEND_HAS_FEATURE_ITEM("wxHAS_MULTIPLE_FILEDLG_FILTERS", hasDefine) 2513 | 2514 | #ifdef wxHAS_NATIVE_ANIMATIONCTRL 2515 | hasDefine = true; 2516 | #endif 2517 | APPEND_HAS_FEATURE_ITEM("wxHAS_NATIVE_ANIMATIONCTRL", hasDefine) 2518 | 2519 | #ifdef wxHAS_NATIVE_DATAVIEWCTRL 2520 | hasDefine = true; 2521 | #endif 2522 | APPEND_HAS_FEATURE_ITEM("wxHAS_NATIVE_DATAVIEWCTRL", hasDefine) 2523 | 2524 | #ifdef wxHAS_NATIVE_WINDOW 2525 | hasDefine = true; 2526 | #endif 2527 | APPEND_HAS_FEATURE_ITEM("wxHAS_NATIVE_WINDOW", hasDefine) 2528 | 2529 | #ifdef wxHAS_NOEXCEPT 2530 | hasDefine = true; 2531 | #endif 2532 | APPEND_HAS_FEATURE_ITEM("wxHAS_NOEXCEPT", hasDefine) 2533 | 2534 | #ifdef wxHAS_NULLPTR_T 2535 | hasDefine = true; 2536 | #endif 2537 | APPEND_HAS_FEATURE_ITEM("wxHAS_NULLPTR_T", hasDefine) 2538 | 2539 | #ifdef wxHAS_IMAGES_IN_RESOURCES 2540 | hasDefine = true; 2541 | #endif 2542 | APPEND_HAS_FEATURE_ITEM("wxHAS_IMAGES_IN_RESOURCES", hasDefine) 2543 | 2544 | #ifdef wxHAS_POWER_EVENTS 2545 | hasDefine = true; 2546 | #endif 2547 | APPEND_HAS_FEATURE_ITEM("wxHAS_POWER_EVENTS", hasDefine) 2548 | 2549 | #ifdef wxHAS_RADIO_MENU_ITEMS 2550 | hasDefine = true; 2551 | #endif 2552 | APPEND_HAS_FEATURE_ITEM("wxHAS_RADIO_MENU_ITEMS", hasDefine) 2553 | 2554 | #ifdef wxHAS_RAW_BITMAP 2555 | hasDefine = true; 2556 | #endif 2557 | APPEND_HAS_FEATURE_ITEM("wxHAS_RAW_BITMAP", hasDefine) 2558 | 2559 | #ifdef wxHAS_RAW_KEY_CODES 2560 | hasDefine = true; 2561 | #endif 2562 | APPEND_HAS_FEATURE_ITEM("wxHAS_RAW_KEY_CODES", hasDefine) 2563 | 2564 | #ifdef wxHAS_REGEX_ADVANCED 2565 | hasDefine = true; 2566 | #endif 2567 | APPEND_HAS_FEATURE_ITEM("wxHAS_REGEX_ADVANCED", hasDefine) 2568 | 2569 | #ifdef wxHAS_TASK_BAR_ICON 2570 | hasDefine = true; 2571 | #endif 2572 | APPEND_HAS_FEATURE_ITEM("wxHAS_TASK_BAR_ICON", hasDefine) 2573 | 2574 | #ifdef wxHAS_WINDOW_LABEL_IN_STATIC_BOX 2575 | hasDefine = true; 2576 | #endif 2577 | APPEND_HAS_FEATURE_ITEM("wxHAS_WINDOW_LABEL_IN_STATIC_BOX", hasDefine) 2578 | 2579 | #ifdef wxHAS_MODE_T 2580 | hasDefine = true; 2581 | #endif 2582 | APPEND_HAS_FEATURE_ITEM("wxHAS_MODE_T", hasDefine) 2583 | } 2584 | 2585 | } // anonymous namespace for helper classes 2586 | 2587 | 2588 | /************************************************* 2589 | 2590 | wxSystemInformationFrame 2591 | 2592 | *************************************************/ 2593 | 2594 | wxSystemInformationFrame::wxSystemInformationFrame(wxWindow *parent, wxWindowID id, const wxString &title, 2595 | const wxPoint& pos, const wxSize& size, 2596 | long frameStyle, long createFlags) 2597 | { 2598 | Create(parent, id, title, pos, size, frameStyle, createFlags); 2599 | } 2600 | 2601 | wxSystemInformationFrame::wxSystemInformationFrame(wxWindow* parent, const wxSize& size, long createFlags) 2602 | { 2603 | Create(parent, wxID_ANY, "wxSystemInformationFrame", wxDefaultPosition, size, wxDEFAULT_FRAME_STYLE, createFlags); 2604 | } 2605 | 2606 | 2607 | bool wxSystemInformationFrame::Create(wxWindow *parent, wxWindowID id, const wxString &title, 2608 | const wxPoint& pos, const wxSize& size, 2609 | long frameStyle, long createFlags) 2610 | { 2611 | if ( !wxFrame::Create(parent, id, title, pos, size, frameStyle) ) 2612 | return false; 2613 | 2614 | m_autoRefresh = createFlags & AutoRefresh; 2615 | 2616 | wxPanel* mainPanel = new wxPanel(this); 2617 | wxBoxSizer* mainPanelSizer = new wxBoxSizer(wxVERTICAL); 2618 | 2619 | // add buttons 2620 | 2621 | wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); 2622 | 2623 | wxButton* refreshButton = new wxButton(mainPanel, wxID_ANY, _("Refresh")); 2624 | refreshButton->Bind(wxEVT_BUTTON, &wxSystemInformationFrame::OnRefresh, this); 2625 | buttonSizer->Add(refreshButton, wxSizerFlags().Border(wxRIGHT)); 2626 | 2627 | wxButton* detailsButton = nullptr; 2628 | if ( createFlags & (ViewSystemColours | ViewSystemFonts) ) 2629 | { 2630 | detailsButton = new wxButton(mainPanel, wxID_ANY, _("wxSYS Colour or Font Details...")); 2631 | detailsButton->Bind(wxEVT_BUTTON, &wxSystemInformationFrame::OnShowDetailedInformation, this); 2632 | buttonSizer->Add(detailsButton, wxSizerFlags().Border(wxRIGHT)); 2633 | } 2634 | 2635 | wxButton* wxInfoButton = new wxButton(mainPanel, wxID_ANY, _("wxInfoMessageBox...")); 2636 | wxInfoButton->Bind(wxEVT_BUTTON, &wxSystemInformationFrame::OnShowwxInfoMessageBox, this); 2637 | buttonSizer->Add(wxInfoButton, wxSizerFlags().Border(wxRIGHT)); 2638 | 2639 | wxButton* saveButton = new wxButton(mainPanel, wxID_ANY, _("Save...")); 2640 | saveButton ->Bind(wxEVT_BUTTON, &wxSystemInformationFrame::OnSave, this); 2641 | buttonSizer->Add(saveButton , wxSizerFlags().Border(wxRIGHT)); 2642 | 2643 | // to move the button after it to the very right 2644 | buttonSizer->AddStretchSpacer(1); 2645 | 2646 | wxButton* clearLogButton = new wxButton(mainPanel, wxID_ANY, _("Clear log")); 2647 | clearLogButton->Bind(wxEVT_BUTTON, &wxSystemInformationFrame::OnClearLog, this); 2648 | buttonSizer->Add(clearLogButton, wxSizerFlags().Border(wxRIGHT)); 2649 | 2650 | mainPanelSizer->Add(buttonSizer, wxSizerFlags().Proportion(0).Expand().Border()); 2651 | 2652 | // add a notebook with pages for groups of system information 2653 | 2654 | m_pages = new wxNotebook(mainPanel, wxID_ANY); 2655 | 2656 | if ( createFlags & ViewSystemColours ) 2657 | m_pages->AddPage(new SystemColourView(m_pages), _("wxSYS Colours"), true); 2658 | 2659 | if ( createFlags & ViewSystemFonts ) 2660 | m_pages->AddPage(new SystemFontView(m_pages), _("wxSYS Fonts")); 2661 | 2662 | if ( createFlags & ViewSystemMetrics ) 2663 | m_pages->AddPage(new SystemMetricView(m_pages), _("wxSYS Metrics")); 2664 | 2665 | if ( createFlags & ViewDisplays ) 2666 | m_pages->AddPage(new DisplaysView(m_pages), _("Displays")); 2667 | 2668 | if ( createFlags & ViewStandardPaths ) 2669 | m_pages->AddPage(new StandardPathsView(m_pages), _("Standard Paths")); 2670 | 2671 | if ( createFlags & ViewSystemOptions ) 2672 | m_pages->AddPage(new SystemOptionsView(m_pages), _("System Options")); 2673 | 2674 | if ( createFlags & ViewEnvironmentVariables ) 2675 | m_pages->AddPage(new EnvironmentVariablesView(m_pages), _("Environment Variables")); 2676 | 2677 | if ( createFlags & ViewMiscellaneous ) 2678 | m_pages->AddPage(new MiscellaneousView(m_pages), _("Miscellaneous")); 2679 | 2680 | if ( createFlags & ViewPreprocessorDefines ) 2681 | m_pages->AddPage(new PreprocessorDefinesView(m_pages), _("Preprocessor Defines")); 2682 | 2683 | wxASSERT_MSG(m_pages->GetPageCount() > 0, "Invalid createFlags: no View value specified"); 2684 | 2685 | mainPanelSizer->Add(m_pages, wxSizerFlags().Proportion(5).Expand().Border()); 2686 | 2687 | // Add a log control 2688 | 2689 | m_logCtrl = new wxTextCtrl(mainPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 2690 | wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH2); 2691 | mainPanelSizer->Add(m_logCtrl, wxSizerFlags().Proportion(1).Expand().Border()); 2692 | 2693 | if ( !m_unloggedInformation.empty() ) 2694 | { 2695 | for ( size_t i = 0; i < m_unloggedInformation.size(); ++i ) 2696 | m_logCtrl->AppendText(m_unloggedInformation[i]); 2697 | } 2698 | 2699 | mainPanel->SetSizer(mainPanelSizer); 2700 | 2701 | if ( detailsButton ) 2702 | detailsButton->Bind(wxEVT_UPDATE_UI, &wxSystemInformationFrame::OnUpdateUI, this); 2703 | 2704 | m_valuesUpdateTimer.SetOwner(this); 2705 | Bind(wxEVT_TIMER, &wxSystemInformationFrame::OnUpdateValuesTimer, this); 2706 | 2707 | Bind(wxEVT_SYS_COLOUR_CHANGED, &wxSystemInformationFrame::OnSysColourChanged, this); 2708 | Bind(wxEVT_DISPLAY_CHANGED, &wxSystemInformationFrame::OnDisplayChanged, this); 2709 | 2710 | #if wxCHECK_VERSION(3, 1, 3) 2711 | Bind(wxEVT_DPI_CHANGED, &wxSystemInformationFrame::OnDPIChanged, this); 2712 | #endif 2713 | 2714 | return true; 2715 | } 2716 | 2717 | wxArrayString wxSystemInformationFrame::GetValues(const wxString& separator) const 2718 | { 2719 | const size_t pageCount = m_pages->GetPageCount(); 2720 | 2721 | wxArrayString values; 2722 | 2723 | for ( size_t i = 0; i < pageCount; ++i ) 2724 | { 2725 | const SysInfoListView* view = dynamic_cast(m_pages->GetPage(i)); 2726 | const wxArrayString viewValues = view->GetValues(separator); 2727 | 2728 | if ( i > 0 ) 2729 | values.push_back(wxEmptyString); // separate groups of values by an empty line 2730 | 2731 | values.push_back(m_pages->GetPageText(i)); 2732 | values.push_back("----------------------------"); 2733 | values.insert(values.end(), viewValues.begin(), viewValues.end()); 2734 | } 2735 | 2736 | return values; 2737 | } 2738 | 2739 | #ifdef __WXMSW__ 2740 | WXLRESULT wxSystemInformationFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) 2741 | { 2742 | if ( nMsg == WM_SETTINGCHANGE ) 2743 | { 2744 | LogInformation(wxString::Format("WM_SETTINGCHANGE received: wParam = %u, lParam =\"%s\"", 2745 | (unsigned)wParam, lParam ? (LPCTSTR)lParam : wxS(""))); 2746 | TriggerValuesUpdate(); 2747 | } 2748 | if ( nMsg == WM_THEMECHANGED ) 2749 | { 2750 | LogInformation(wxString::Format("WM_THEMECHANGED received: wParam = %#x, lParam = %#lx", (unsigned)wParam, (long)lParam)); 2751 | TriggerValuesUpdate(); 2752 | } 2753 | #if !wxCHECK_VERSION(3, 1, 3) // 3.1.3+ has wxEVT_DPI_CHANGED 2754 | else 2755 | if ( nMsg == 0x02E0 ) // 0x02E0 = WM_DPICHANGED 2756 | { 2757 | LogInformation(wxString::Format("WM_DPICHANGED received: new DPI = %u x %u", 2758 | (unsigned)LOWORD(wParam), (unsigned)HIWORD(wParam))); 2759 | TriggerValuesUpdate(); 2760 | } 2761 | #endif // #if !wxCHECK_VERSION(3, 1, 3) 2762 | return wxFrame::MSWWindowProc(nMsg, wParam, lParam); 2763 | } 2764 | #endif // #ifdef __WXMSW__ 2765 | 2766 | void wxSystemInformationFrame::LogInformation(const wxString& information) 2767 | { 2768 | wxString timeStampFormat = wxLog::GetTimestamp(); 2769 | wxString message; 2770 | 2771 | if ( timeStampFormat.empty() ) 2772 | timeStampFormat = "%c"; 2773 | 2774 | message.Printf("%s: %s\n", wxDateTime::Now().Format(timeStampFormat), information); 2775 | 2776 | // LogInformation() can be called before m_logCtrl is created, 2777 | // from overriden MSWWindowProc() 2778 | if ( m_logCtrl ) 2779 | m_logCtrl->AppendText(message); 2780 | else 2781 | m_unloggedInformation.push_back(message); 2782 | } 2783 | 2784 | void wxSystemInformationFrame::TriggerValuesUpdate() 2785 | { 2786 | if ( !m_autoRefresh ) 2787 | return; 2788 | 2789 | // prevent multiple updates for a batch of setting change messages/events 2790 | const int updateTimerDuration = 750; // milliseconds 2791 | 2792 | m_valuesUpdateTimer.StartOnce(updateTimerDuration); 2793 | } 2794 | 2795 | void wxSystemInformationFrame::UpdateValues() 2796 | { 2797 | const size_t pageCount = m_pages->GetPageCount(); 2798 | 2799 | { 2800 | wxBusyCursor busyCursor; 2801 | 2802 | for ( size_t i = 0; i < pageCount; ++i ) 2803 | { 2804 | SysInfoListView* view = dynamic_cast(m_pages->GetPage(i)); 2805 | view->UpdateValues(); 2806 | } 2807 | } 2808 | 2809 | LogInformation(_("System values were refreshed.")); 2810 | } 2811 | 2812 | void wxSystemInformationFrame::OnRefresh(wxCommandEvent&) 2813 | { 2814 | UpdateValues(); 2815 | } 2816 | 2817 | void wxSystemInformationFrame::OnShowDetailedInformation(wxCommandEvent&) 2818 | { 2819 | const SysInfoListView* view = dynamic_cast(m_pages->GetCurrentPage()); 2820 | 2821 | if ( view ) 2822 | view->ShowDetailedInformation(); 2823 | } 2824 | 2825 | void wxSystemInformationFrame::OnShowwxInfoMessageBox(wxCommandEvent&) 2826 | { 2827 | wxInfoMessageBox(this); 2828 | } 2829 | 2830 | void wxSystemInformationFrame::OnSave(wxCommandEvent&) 2831 | { 2832 | const wxString fileName = wxFileSelector(_("Choose File Name"), "", "", "", 2833 | _("Text Files (*.txt)|*.txt"), 2834 | wxFD_SAVE | wxFD_OVERWRITE_PROMPT, this); 2835 | 2836 | if ( fileName.empty() ) 2837 | return; 2838 | 2839 | wxTextFile textFile(fileName); 2840 | 2841 | if ( textFile.Exists() ) 2842 | { 2843 | if ( !textFile.Open() ) 2844 | return; 2845 | textFile.Clear(); 2846 | } 2847 | else 2848 | if ( !textFile.Create() ) 2849 | return; 2850 | 2851 | const wxArrayString values = GetValues(); 2852 | 2853 | for ( const auto& value : values ) 2854 | textFile.AddLine(value); 2855 | 2856 | textFile.Write(); 2857 | } 2858 | 2859 | void wxSystemInformationFrame::OnClearLog(wxCommandEvent&) 2860 | { 2861 | m_logCtrl->Clear(); 2862 | } 2863 | 2864 | void wxSystemInformationFrame::OnUpdateUI(wxUpdateUIEvent& event) 2865 | { 2866 | const SysInfoListView* view = dynamic_cast(m_pages->GetCurrentPage()); 2867 | 2868 | event.Enable(view && view->CanShowDetailedInformation()); 2869 | } 2870 | 2871 | void wxSystemInformationFrame::OnUpdateValuesTimer(wxTimerEvent&) 2872 | { 2873 | UpdateValues(); 2874 | } 2875 | 2876 | void wxSystemInformationFrame::OnSysColourChanged(wxSysColourChangedEvent& event) 2877 | { 2878 | event.Skip(); 2879 | LogInformation(_("wxSysColourChangedEvent received.")); 2880 | TriggerValuesUpdate(); 2881 | } 2882 | 2883 | void wxSystemInformationFrame::OnDisplayChanged(wxDisplayChangedEvent& event) 2884 | { 2885 | event.Skip(); 2886 | LogInformation(_("wxDisplayChangedEvent received.")); 2887 | TriggerValuesUpdate(); 2888 | } 2889 | 2890 | #if wxCHECK_VERSION(3, 1, 3) 2891 | void wxSystemInformationFrame::OnDPIChanged(wxDPIChangedEvent& event) 2892 | { 2893 | event.Skip(); 2894 | LogInformation(wxString::Format(_("wxDPIChangedEvent received: old DPI = %s, new DPI = %s."), 2895 | wxSizeTowxString(event.GetOldDPI()), wxSizeTowxString(event.GetNewDPI()))); 2896 | TriggerValuesUpdate(); 2897 | } 2898 | #endif 2899 | --------------------------------------------------------------------------------