Mercurial > minori
annotate dep/animia/src/win/win32.cc @ 166:54c5d80a737e
dep/animia: add libutil method
I changed the "linux" method to be "proc", because it isn't exactly Linux specific
this commit also has some changes to the x11 stuff:
instead of enumerating over only top-level windows, we iterate over ALL of them
this is because many X11 apps actually use multiple windows
for some reason, I still can't get it to work with VLC, but it picks up Firefox...
| author | paper@DavesDouble.local | 
|---|---|
| date | Sun, 19 Nov 2023 04:21:56 -0500 | 
| parents | cdf79282d647 | 
| children | 0fc126d52de4 | 
| rev | line source | 
|---|---|
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 1 #include "animia/win/win32.h" | 
| 156 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 2 #include "animia.h" | 
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 3 #include "animia/util/win32.h" | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 4 #include "animia/win.h" | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 5 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 6 #include <set> | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 7 #include <string> | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 8 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 9 #include <windows.h> | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 10 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 11 namespace animia::internal::win32 { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 12 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 13 static std::wstring GetWindowClassName(HWND hwnd) { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 14 // The maximum size for lpszClassName, according to the documentation of | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 15 // WNDCLASSEX structure | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 16 constexpr int kMaxSize = 256; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 17 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 18 std::wstring buffer(kMaxSize, L'\0'); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 19 const auto size = ::GetClassNameW(hwnd, &buffer.front(), buffer.length()); | 
| 153 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 20 /* for some reason GetClassName returns the actual size of the buffer *with* the | 
| 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 21 terminating NULL byte */ | 
| 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 22 buffer.resize(size); | 
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 23 return buffer; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 24 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 25 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 26 static std::wstring GetWindowText(HWND hwnd) { | 
| 153 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 27 const int estimated_size = ::GetWindowTextLengthW(hwnd); | 
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 28 | 
| 153 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 29 std::wstring buffer(estimated_size + 1, L'\0'); | 
| 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 30 const auto size = ::GetWindowTextW(hwnd, &buffer.front(), buffer.length()); | 
| 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 31 /* GetWindowTextLength docs: | 
| 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 32 "Under certain conditions, the GetWindowTextLength function may return a value | 
| 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 33 that is larger than the actual length of the text." */ | 
| 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 34 buffer.resize(size); | 
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 35 return buffer; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 36 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 37 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 38 static DWORD GetWindowProcessId(HWND hwnd) { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 39 DWORD process_id = 0; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 40 ::GetWindowThreadProcessId(hwnd, &process_id); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 41 return process_id; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 42 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 43 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 44 static std::wstring GetProcessPath(DWORD process_id) { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 45 // If we try to open a SYSTEM process, this function fails and the last error | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 46 // code is ERROR_ACCESS_DENIED. | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 47 // | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 48 // Note that if we requested PROCESS_QUERY_INFORMATION access right instead | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 49 // of PROCESS_QUERY_LIMITED_INFORMATION, this function would fail when used | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 50 // to open an elevated process. | 
| 156 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 51 Handle process_handle(::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, process_id)); | 
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 52 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 53 if (!process_handle) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 54 return std::wstring(); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 55 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 56 std::wstring buffer(MAX_PATH, L'\0'); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 57 DWORD buf_size = buffer.length(); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 58 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 59 // Note that this function requires Windows Vista or above. You may use | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 60 // GetProcessImageFileName or GetModuleFileNameEx on earlier versions. | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 61 if (!::QueryFullProcessImageNameW(process_handle.get(), 0, &buffer.front(), &buf_size)) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 62 return std::wstring(); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 63 | 
| 153 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 64 buffer.resize(buf_size); | 
| 
bd439dd6ffc5
*: make win stuff actually work, rename bsd.cc to xnu.cc
 Paper <mrpapersonic@gmail.com> parents: 
152diff
changeset | 65 return buffer; | 
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 66 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 67 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 68 //////////////////////////////////////////////////////////////////////////////// | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 69 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 70 static bool VerifyWindowStyle(HWND hwnd) { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 71 const auto window_style = ::GetWindowLong(hwnd, GWL_STYLE); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 72 const auto window_ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 73 | 
| 156 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 74 auto has_style = [&window_style](DWORD style) { return (window_style & style) != 0; }; | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 75 auto has_ex_style = [&window_ex_style](DWORD ex_style) { return (window_ex_style & ex_style) != 0; }; | 
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 76 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 77 // Toolbars, tooltips and similar topmost windows | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 78 if (has_style(WS_POPUP) && has_ex_style(WS_EX_TOOLWINDOW)) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 79 return false; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 80 if (has_ex_style(WS_EX_TOPMOST) && has_ex_style(WS_EX_TOOLWINDOW)) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 81 return false; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 82 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 83 return true; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 84 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 85 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 86 static bool VerifyClassName(const std::wstring& name) { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 87 static const std::set<std::wstring> invalid_names = { | 
| 156 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 88 // System classes | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 89 L"#32770", // Dialog box | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 90 L"CabinetWClass", // Windows Explorer | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 91 L"ComboLBox", | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 92 L"DDEMLEvent", | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 93 L"DDEMLMom", | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 94 L"DirectUIHWND", | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 95 L"GDI+ Hook Window Class", | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 96 L"IME", | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 97 L"Internet Explorer_Hidden", | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 98 L"MSCTFIME UI", | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 99 L"tooltips_class32", | 
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 100 }; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 101 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 102 return !name.empty() && !invalid_names.count(name); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 103 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 104 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 105 static bool VerifyProcessPath(const std::wstring& path) { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 106 return !path.empty() && !IsSystemDirectory(path); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 107 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 108 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 109 static bool VerifyProcessFileName(const std::wstring& name) { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 110 static const std::set<std::wstring> invalid_names = { | 
| 156 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 111 // System files | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 112 L"explorer", // Windows Explorer | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 113 L"taskeng", // Task Scheduler Engine | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 114 L"taskhost", // Host Process for Windows Tasks | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 115 L"taskhostex", // Host Process for Windows Tasks | 
| 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 116 L"Taskmgr", // Task Manager | 
| 152 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 117 }; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 118 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 119 return !name.empty() && !invalid_names.count(name); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 120 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 121 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 122 //////////////////////////////////////////////////////////////////////////////// | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 123 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 124 static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param) { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 125 if (!::IsWindowVisible(hwnd)) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 126 return TRUE; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 127 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 128 if (!VerifyWindowStyle(hwnd)) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 129 return TRUE; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 130 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 131 Window window; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 132 window.id = static_cast<unsigned int>(reinterpret_cast<ULONG_PTR>(hwnd)); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 133 window.text = ToUtf8String(GetWindowText(hwnd)); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 134 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 135 { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 136 std::wstring class_name = GetWindowClassName(hwnd); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 137 window.class_name = ToUtf8String(class_name); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 138 if (!VerifyClassName(class_name)) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 139 return TRUE; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 140 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 141 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 142 Process process; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 143 process.pid = GetWindowProcessId(hwnd); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 144 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 145 const auto path = GetProcessPath(process.pid); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 146 if (!VerifyProcessPath(path)) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 147 return TRUE; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 148 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 149 { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 150 std::wstring name = GetFileNameWithoutExtension(GetFileNameFromPath(path)); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 151 process.name = ToUtf8String(name); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 152 if (!VerifyProcessFileName(name)) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 153 return TRUE; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 154 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 155 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 156 auto& window_proc = *reinterpret_cast<window_proc_t*>(param); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 157 if (!window_proc(process, window)) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 158 return FALSE; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 159 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 160 return TRUE; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 161 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 162 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 163 bool Win32WinTools::EnumerateWindows(window_proc_t window_proc) { | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 164 if (!window_proc) | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 165 return false; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 166 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 167 const auto param = reinterpret_cast<LPARAM>(&window_proc); | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 168 | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 169 // Note that EnumWindows enumerates only top-level windows of desktop apps | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 170 // (as opposed to UWP apps) on Windows 8 and above. | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 171 return ::EnumWindows(EnumWindowsProc, param) != FALSE; | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 172 } | 
| 
8700806c2cc2
dep/animia: awesome new breaking changes!
 Paper <mrpapersonic@gmail.com> parents: diff
changeset | 173 | 
| 156 
cdf79282d647
dep/animia: add VERY early x11 window stuff
 Paper <mrpapersonic@gmail.com> parents: 
153diff
changeset | 174 } // namespace animia::internal::win32 | 
