Я создал простой плагин, похожий на hello world, который рисует красную рамку.
После встраивания в приложение xulrunner плагин работает почти нормально. Приложение Xulrunner успешно перерисовывает поле при изменении размера окна приложения.
Но после любого события мыши, например - щелчка левой кнопкой мыши, мое приложение вылетает с "Переполнением стека". Отладчик говорит, что причина в бесконечном цикле из двух вызовов forwardMethod, за которыми следует один вызов JSD_GetValueForObject.
После сбоя содержимое стека выглядит следующим образом:
-[NSApplication _indexOfWindow:]
-[NSEvent window]
JSD_GetValueForObject
JSD_GetValueForObject
JSD_GetValueForObject
forwardMethod
forwardMethod
JSD_GetValueForObject
forwardMethod
forwardMethod
JSD_GetValueForObject
forwardMethod
forwardMethod
JSD_GetValueForObject
forwardMethod
forwardMethod
JSD_GetValueForObject
forwardMethod
forwardMethod
JSD_GetValueForObject
forwardMethod
forwardMethod
- .....и т.д
Мой код:
int16_t NPP_HandleEvent(NPP instance, void* event)
{
EventRecord* carbonEvent = (EventRecord*)event;
if (carbonEvent && (carbonEvent->what == updateEvt))
{
PluginInstance* currentInstance = (PluginInstance*)(instance->pdata);
CGContextRef cgContext = ((NP_CGContext*)(currentInstance->window.window))->context;
float windowWidth = currentInstance->window.width;
float windowHeight = currentInstance->window.height;
static int x = 0;
if (x++)
return;
NPRect clipRect = currentInstance->window.clipRect;
NP_CGContext* npContext = currentInstance->window.window;
NSWindow* browserWindow = [[[NSWindow alloc] initWithWindowRef:npContext->window] autorelease];
int y = [browserWindow frame].size.height - (clipRect.bottom - clipRect.top) - currentInstance->window.y;
//[plugin attachToWindow:browserWindow at:NSMakePoint(window->x, y)];
NSPoint point = NSMakePoint(currentInstance->window.x, y);
// find the NSView at the point
NSView* hitView = [[browserWindow contentView] hitTest:NSMakePoint(point.x+1, point.y+1)];
if (hitView == nil || ![[hitView className] isEqualToString:@"ChildView"])
{
x = 0;
return;
}
NSView* parentView = hitView;
NSBox *box = [[NSBox alloc] initWithFrame:NSMakeRect(0.0, 0.0, 100, 100)];
[box setBoxType:NSBoxCustom];
[box setBorderType:NSLineBorder];
[box setTitlePosition:NSNoTitle];
[box setFillColor:[NSColor redColor]];
[parentView addSubview:box];
//DrawPlugin(cgContext, windowWidth, windowHeight);
}
return 0;
}
EventRecord
не является записью о событии Carbon — это запись о событии *pre-*Carbon. То есть это тип из диспетчера событий Toolbox. Хотя этот Event Manager все еще существует в Carbon (в 32-разрядной версии), настоящий «Carbon Event Manager» — это отдельный API со своим собственным непрозрачным типомEventRef
. - person Peter Hosey   schedule 20.11.2009