Mercurial > minori
comparison dep/animia/src/win/quartz.cc @ 189:649786bae914
*: etc. code cleanup
I've removed most macros and stuff
dep/animia: [UNTESTED] use raw C++ instead of Objective-C++
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Wed, 06 Dec 2023 19:42:33 -0500 |
| parents | |
| children | 2d5823df870f |
comparison
equal
deleted
inserted
replaced
| 188:168382a89b21 | 189:649786bae914 |
|---|---|
| 1 /* We actually DON'T need Objective-C for most of this file. | |
| 2 * GetWindowTitle() is the only function that really needs it. | |
| 3 * (and even then, we can use the C bindings for it...) | |
| 4 * | |
| 5 * However, being able to use the Foundation classes makes things | |
| 6 * so, so, so much easier, and so I've decided to make this file | |
| 7 * in Objective-C++. | |
| 8 */ | |
| 9 #include "animia/win/quartz.h" | |
| 10 #include "animia.h" | |
| 11 | |
| 12 #include <objc/runtime.h> | |
| 13 #include <objc/message.h> | |
| 14 | |
| 15 #include <CoreFoundation/CoreFoundation.h> | |
| 16 #include <CoreGraphics/CoreGraphics.h> | |
| 17 #include <Carbon/Carbon.h> | |
| 18 | |
| 19 namespace animia::internal::quartz { | |
| 20 | |
| 21 static bool GetWindowTitle(unsigned int wid, std::string& result) { | |
| 22 // id app = [NSApplication sharedApplication]; | |
| 23 id app = cls_msg(cls("NSApplication"), sel("sharedApplication")); | |
| 24 | |
| 25 // id window = [app windowWithWindowNumber: wid]; | |
| 26 id window = msg(app, sel("windowWithWindowNumber:"), wid); | |
| 27 | |
| 28 // return [[window title] UTF8String]; | |
| 29 return StringFromCFString(reinterpret_cast<CFStringRef>(msg(window, "title")), result); | |
| 30 } | |
| 31 | |
| 32 bool QuartzWinTools::EnumerateWindows(window_proc_t window_proc) { | |
| 33 if (!window_proc) | |
| 34 return false; | |
| 35 | |
| 36 CFArrayRef windows = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID); | |
| 37 if (!windows) | |
| 38 return false; | |
| 39 | |
| 40 CFIndex i = 0; count = CFArrayGetCount(windows); | |
| 41 for (; i < count; i++) { | |
| 42 CFDictionaryRef window = CFArrayGetValueAtIndex(windows, i); | |
| 43 if (!window) | |
| 44 continue; | |
| 45 | |
| 46 Process proc; | |
| 47 { | |
| 48 { | |
| 49 CFNumber num; | |
| 50 CFDictionaryGetValueIfPresent(window, "kCGWindowOwnerPID", &num); | |
| 51 osx::util::GetCFNumber(num, proc.pid); | |
| 52 } | |
| 53 { | |
| 54 CFStringRef str; | |
| 55 CFDictionaryGetValueIfPresent(window, "kCGWindowOwnerName", &str); | |
| 56 osx::util::StringFromCFString(str, proc.name); | |
| 57 } | |
| 58 if (proc.name.empty()) | |
| 59 osx::util::GetProcessName(proc.pid, proc.name); | |
| 60 } | |
| 61 | |
| 62 Window win; | |
| 63 { | |
| 64 { | |
| 65 CFNumber num; | |
| 66 CFDictionaryGetValueIfPresent(window, "kCGWindowNumber", &num); | |
| 67 osx::util::GetCFNumber(num, win.id); | |
| 68 } | |
| 69 { | |
| 70 CFStringRef str; | |
| 71 CFDictionaryGetValueIfPresent(window, "kCGWindowName", &str); | |
| 72 osx::util::GetCFNumber(str, win.class_name); | |
| 73 } | |
| 74 GetWindowTitle(win.id, win.text); | |
| 75 } | |
| 76 | |
| 77 if (!window_proc(proc, win)) | |
| 78 return false; | |
| 79 } | |
| 80 | |
| 81 return true; | |
| 82 } | |
| 83 | |
| 84 } // namespace animia::win::detail |
