【发布时间】:2013-11-16 08:29:07
【问题描述】:
我知道如何编写一个简单的 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 小部件时你必须注意的最重要的事情是什么?
谢谢!
【问题讨论】: