зарегистрироваться для WindowServer CGScreenRefreshCallback CGScreenUpdateMoveCallback в C ++ - PullRequest
0 голосов
/ 08 июля 2010

Я пытаюсь зарегистрироваться для CGScreenRefreshCallback и CGScreenUpdateMoveCallback (вот что говорит яблоко о http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/Quartz_Services_Ref/Reference/reference.html#//apple_ref/doc/uid/TP30001070-CH1g-F16970) используя только C ++.

Я написал этот простой тестер для обратного вызова обновления, чтобы получить изменяющиеся прямоугольники:

#include "ApplicationServices/ApplicationServices.h"
#include <iostream>

using namespace std;

/////////////HEADER
static void DHRefreshCallback (CGRectCount count,const CGRect * rectArray,void * userParameter);
///////////////////

int main (int argc, char * const argv[]) {

CGRegisterScreenRefreshCallback(DHRefreshCallback, NULL);

while (true) {
    // just hanging
}
return 0;
}


static void DHRefreshCallback (CGRectCount count,const CGRect * rectArray,void * userParameter){
cout << "something changed" << endl;
return;
}

... но не сработало.

Я знаю, что мне нужно соединение с WindowServer (Quartz Compositor \ Quartz Extreme \ Quartz Extreme 2D ... все еще не могу понять разницу) и работающий поток, чтобы получить эти обратные вызовы, но я действительно не знать, как это сделать только в C ++ (вообще не существует Objective-C).

любое направление?

спасибо заранее, pigiuz

1 Ответ

2 голосов
/ 09 июля 2010

Речь идет не об использовании / не использовании Objective-C.Речь идет о цикле событий в приложениях OS X в целом, который выполняется CFRunloop, который является C API.См. Управление запуском цикла и Ссылка CFRunLoop .Вам также необходимо соединение с оконным сервером, которое можно установить, позвонив по номеру

вместо

while (true) {
    // just hanging
}

, просто сделайте

extern "C" void NSApplicationLoad(void);
NSApplicationLoad();  // establish a connection to the window server. In <Cocoa/Cocoa.h>
CFRunLoopRun();       // run the event loop

Не забудьте связатьпротив Cocoa.framework;просто добавьте -framework Cocoa в командную строку компилятора.Вы можете #import <Cocoa/Cocoa.h>, но тогда вам нужно использовать Objective-C ++ из-за объявленных в нем классов Objective-C.

Вы можете использовать

 RunApplicationEventLoop(); //establish a connection to the window server 
                            //and runs the event loop. In <Carbon/Carbon.h>

в 32-разрядном приложенииNSApplicationLoad + CFRunLoopRun, но недоступно в 64-битном приложении.

...