【问题标题】:how to draw gtk widget (like buttons) in the firefox npapi plugin under linux?如何在linux下的firefox npapi插件中绘制gtk小部件(如按钮)?
【发布时间】: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 小部件时你必须注意的最重要的事情是什么?

谢谢!

【问题讨论】:

    标签: widget gtk npapi


    【解决方案1】:

    经过几天的研究,我几乎绝望了,但今天我终于成功解决了它。我现在可以在插件中绘制一个 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-28
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多