Посвящается всем, кто любит низкоуровневый оконный сервер (CoreGraphicsPrivate.h и т. Д.), X11 на Mac, SIMBL и другие безумные вещи :)
На Mac есть простое приложение с эмуляцией X11 (например, xterm, xeyes и т. Д.) С одним окном. Во время работы X11 каким-то образом создает собственное окно Quartz для представления этого эмулированного приложения, и это окно доступно через Quartz Window Services, так что я могу получить его CSWindowID, заголовок, положение, размер и PID владельца (PID X11.app). Но он не поддерживает Accessibility API, поэтому нет возможности управлять им (за исключением, возможно, частных функций Core Graphichs из того же процесса).
Теперь вот задача:
Мне нужно разместить дополнительный NSView (или просто нарисовать что-нибудь) в таком окне. Я имею в виду родное окно Quartz, которое появилось в результате эмуляции X11 какого-то приложения. Я знаю, что для управления окнами на Mac я должен быть в том же процессе, то есть X11.app.
Я написал плагин SIMBL, который вторгается в процесс X11.app.
Там я могу вызвать [NSApp windows], но все время получаю ровно 2 NSWindows, которые не имеют ничего общего с окнами реальных приложений. Их даже не видно на экране.
Тем не менее, когда я вызываю NSWindowList (), я получаю все, что мне нужно (идентификаторы окон для окон X11) и даже больше (идентификаторы окон из других приложений).
Когда у меня есть CSWindowID для окон, эмулируемых X11, я вызываю [NSApp windowWithWindowNumber:] (Cocoa) и HIWindowFromCGWindowID () (Carbon), но оба они возвращают ноль! Из того же процесса!
Кстати, все эти действия отлично работают, когда я вторгаюсь в процесс Safari и другие ...
Итак, вопросы:
Как X11 создал такие окна, которые недоступны из одного и того же процесса?
Как я могу получить указатели на окна X11 (NSWindow *, CGContextRef или, по крайней мере, что-нибудь ...) и разместить на них мою графику (я даже не говорю о NSViews)?
Заранее большое спасибо!