Регистрация для обратных вызовов реконфигурации дисплея - PullRequest
4 голосов
/ 25 июня 2011

Я собираю приложение для Mac OS X и пытаюсь зарегистрироваться, чтобы получать уведомления о реконфигурации дисплея, но сейчас я очень растерялся.Я читал документацию Apple и некоторые сообщения на форумах и т. Д., Но все, кажется, предполагает лучшее знание вещей, чем я, очевидно, обладаю.Я понимаю, что я должен запросить обратный вызов внутри цикла выполнения для его правильной работы.Я не знаю, как настроить базовый цикл запуска для этого, хотя.Я также чувствую, что пример, который Apple имеет в своей документации, пропускает то, что, как они ожидают, я уже знаю.Чтобы показать свое невежество, я чувствую, что все должно выглядеть следующим образом.

NSRunLoop *rLoop = [NSRunLoop currentRunLoop];
codeToStartRunLoop

 void MyDisplayReconfigurationCallBack (
                                       CGDirectDisplayID display,
                                       CGDisplayChangeSummaryFlags flags,
                                       void *userInfo);
{
    if (flags & kCGDisplayAddFlag) {
        NSLog (@"Display Added");
    }
    else if (kCGDisplayRemoveFlag) {
        NSLog (@"Display Removed");
    }
 }

CGDisplayRegisterReconfigurationCallback(MyDisplayReconfigurationCallBack, NULL);

Фактический код, который я получил, был взят из примера Apple, но он говорит мне, что flags - это необъявленный идентификатор на данном этапе, ине скомпилируется.Не то чтобы это работало правильно, так как у меня его нет в цикле выполнения.Я надеялся найти где-нибудь учебник, который объясняет регистрацию для системного обратного вызова в цикле выполнения, но не увенчался успехом.Если бы кто-нибудь мог указать мне правильное направление, я бы это очень оценил.

(Я уверен, что по моему вопросу вы сможете сказать, что я очень зеленый. Я научил себяC из книги как моего первого языка программирования. Я пропускал C, так что время от времени я сталкивался с чем-то, что я не могу понять.)

1 Ответ

5 голосов
/ 25 июня 2011

Если вы пишете приложение для Mac OS X, AppKit уже настроил для вас цикл запуска , поэтому вам не нужно беспокоиться об этой части. Вам действительно нужно создавать собственный цикл выполнения в Какао, когда вы также создаете свой собственный поток.

Для части "необъявленный идентификатор", похоже, что это из-за опечатки / синтаксической ошибки:

void MyDisplayReconfigurationCallBack (CGDirectDisplayID display, 
                                       CGDisplayChangeSummaryFlags flags,
                                       void *userInfo);
// Semicolon makes this an invalid function definition^^
{
    // This is an anonymous block,* and flags wasn't declared in it
    if (flags & kCGDisplayAddFlag) {
    // etc.
}

Кроме того, в отличие от некоторых других языков, вы не можете объявлять или определять функции внутри других функций, методов или блоков * - они должны находиться на верхнем уровне файла. Вы не можете положить это в то же место, где вы звоните CGDisplayRegisterReconfigurationCallback.

Так же, как пример (я понятия не имею, как на самом деле выглядит остальная часть вашего кода):

// MyClassThatIsInterestedInDisplayConfiguration.m
#import "MyClassThatIsInterestedInDisplayConfiguration.h"

// Define callback function at top level of file
void MyDisplayReconfigurationCallBack (
                                   CGDirectDisplayID display,
                                   CGDisplayChangeSummaryFlags flags,
                                   void *userInfo)
{
    if (flags & kCGDisplayAddFlag) {
        NSLog (@"Display Added");
    }
    else if (kCGDisplayRemoveFlag) {
        NSLog (@"Display Removed");
    }
}

@implementation MyClassThatIsInterestedInDisplayConfiguration

- (void) comeOnBabyAndDoTheRegistrationWithMe {
    // Register callback function inside a method
    CGDisplayRegisterReconfigurationCallback(MyDisplayReconfigurationCallBack, 
                                     NULL);
}

@end

* Базовая C-образная фигурная скобка, а не новая классная Obj-C специальная функция .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...