我创建了一个简单的hello world-like插件,它绘制了红色框。
- 嵌入xulrunner应用程序后,插件工作得非常好。 Xulrunner应用程序成功重绘了调整应用程序窗口大小的方框。
但是在任何鼠标事件之后 - 例如 - 左键单击,我的应用程序崩溃了“堆栈溢出”。调试器说原因是2次调用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;
}
答案 0 :(得分:3)
非常感谢Winz!
我刚刚从
下载了最新的mozilla构建和SDKhttp://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/
来自
的BasicPlugin.xcodeprojhttp://mxr.mozilla.org/mozilla-central/source/modules/plugin/sdk/samples/basic/mac/
现在可以访问Cocoa事件模型。
答案 1 :(得分:1)
我不认为Cocoa和旧的EventRecord系统很好地融合在一起。
现在可以在mozilla的最后版本中使用可可事件模型。
使用Mercurial检查通信中心的树并尝试:
hg clone http://hg.mozilla.org/mozilla-central/ src
Xcode项目的路径是:
的src /模块/插件/ SDK /样品/基本/ MAC /
并且插件必须复制到:
/ Library / Internet Plug-Ins /
我自己尝试使用基本的firefox插件和可可事件系统 我只是不知道如何获得指向当前NSView的指针。
我认为必须在Mac上使用64位版本的Firefox。它在Firefox 3.6中不可用,但可能在Firefox 3.7中,而带有Cocoa事件模型的NPAPI SDK的版本是0.23版本。
编辑:
直接尝试它没有mercurial下载最新的mozilla构建为Misha:
http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/
带有Cocoa事件模型的Xcode项目位于:
http://mxr.mozilla.org/mozilla-central/source/modules/plugin/sdk/samples/basic/mac/
Webkit源代码中的NetscapeCocoaPlugin示例也使用了cocoa事件模型。
答案 2 :(得分:0)
我只是不知道如何获得指向当前NSView的指针
您好,Winz!
答案似乎很明显 - 我们可以使用EventRecord遗留事件模型获取NSView,然后通过添加以下行来切换到Cocoa事件模型:
browser-> setvalue(instance,NPPVpluginEventModel,(void *)NPEventModelCocoa);
之后我的申请变得绝对稳定。没有更多的崩溃!!!
我刚刚在激活应用程序的主窗口后收到了一个NPCocoaEventDrawRect。所以可可事件模型似乎有效。