我知道如何编写一个简单的npapi插件。但现在我在插件中绘制一些按钮时遇到了麻烦。
我下载了一个名为webp-npapi的简单示例(链接:code.google.com/p/webp-npapi-linux/)并对其进行了修改,它现在可以在我的Firefox中运行良好。它是一个可以显示webp格式图像的无窗口插件。
我还下载了一个名为npapi-vlc的复杂样本(链接:git.videolan.org/?p=npapi-vlc.git;a=summary)并已阅读。编译后,它也适用于我的Firefox。这个插件绘制了一些gtk按钮,而它是一个窗口类型的插件。
我想在我自己的插件中绘制一些按钮,所以我模仿npapi-vlc的代码来修改webp-npapi。我通过在CPlugin类的构造函数中注释以下代码,将webp-npapi的类型从无窗口更改为窗口: (http://code.google.com/p/webp-npapi-linux/source/browse/trunk/CPlugin.cpp)
/*
// Make sure we can render this plugin
NPBool browserSupportsWindowless = false;
s_pBrowserFunctions->getvalue(instance, NPNVSupportsWindowless, &browserSupportsWindowless);
if( !browserSupportsWindowless )
throw std::runtime_error("Windowless mode not supported by the browser");
s_pBrowserFunctions->setvalue(instance, NPPVpluginWindowBool, (void*) false);
*/
然后我开始在CPlugin :: setWindow()函数中绘制一个按钮:
NPError CPlugin::setWindow(const NPWindow * const window)
{
#ifdef WEBPNPAPI_DEBUG
printf("CPlugin::setWindow() - Window set\n");
#endif
m_window = *window;
//I add these codes to draw a button
printf("test start\n");
GdkColor color_bg;
gdk_color_parse("#AAAAAA", &color_bg);
Window socket = (Window)m_window.window;
GtkWidget *parent = gtk_plug_new(socket);
gtk_widget_modify_bg(parent, GTK_STATE_NORMAL, &color_bg);
GtkWidget *button = gtk_button_new_with_label("hello");
gtk_container_add(GTK_CONTAINER(parent), button);
gtk_widget_show_all(parent);
printf("test end\n");
GtkRequisition req;
req.width = m_window.width;
req.height = m_window.height;
gtk_widget_size_request(parent, &req);
return NPERR_NO_ERROR;
}
但是,它并没有在网页上显示任何内容......
所以我真的想知道它为什么不起作用,当你想在你的插件中绘制一些gtk小部件时,你必须注意哪些最重要的事情?
THX!
答案 0 :(得分:2)
关键点是你必须在NPP_GetValue()函数中编写以下代码:
case NPPVpluginNeedsXEmbed:
*((bool *)value) = true;
return NPERR_NO_ERROR;
注意:这些代码不能在NP_GetValue()函数中写入,它没用。 这是我以前做过的错误。
这是我在互联网上找到的唯一文件:
https://developer.mozilla.org/zh-CN/docs/XEmbed_Extension_for_Mozilla_Plugins
关于XEmbed的简单示例:
http://multimedia.cx/diamondx/