如何在linux下的firefox npapi插件中绘制gtk小部件(如按钮)?

时间:2013-11-16 08:29:08

标签: widget gtk npapi

我知道如何编写一个简单的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!

1 个答案:

答案 0 :(得分:2)

经过几天的研究,我几乎绝望了,但今天我终于成功地重新开始了。我现在可以在插件中绘制一个gtk按钮。

关键点是你必须在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/