Invalidate Window()停止工作

时间:2014-05-22 15:06:20

标签: plugins firebreath

我正在编写一个包含内容的插件, 从我在互联网上找到的所有示例中收集代码,我在Firefox上运行PluginWindowX11 并且一切都按预期工作,除了插件在1-5分钟的工作后停止重绘,

我所做的是:

  1. 设置40ms计时器,我等待刷新显示

    m_timer = FB :: Timer :: getTimer(40,true,boost :: bind(& PluginWindowX11 :: update,this)); m_timer->启动()

  2. 回复中的
  3. 我要求浏览器公开事件

    void PluginWindowX11 :: update(){     InvalidateWindow();     返回; }

  4. in gboolean PluginWindowX11 :: EventCallback(GtkWidget * widget,GdkEvent * event) 对于GDK_EXPOSE事件,我重绘窗口

  5. 开关(事件 - >类型)
    {
    案例GDK_EXPOSE:
            {
                GdkEventExpose * exposeEvent = reinterpret_cast(event);
                FB :: Rect rect;
                rect.left = exposeEvent-> area.x;
                rect.top = exposeEvent-> area.y;
                rect.right = exposeEvent-> area.x + exposeEvent-> area.width;
                rect.bottom = exposeEvent-> area.y + exposeEvent-> area.height;
                FBLOG_INFO(“EXPOSE”,string_format(“暴露m_canvas =%X rect:”,m_canvas)<< rect_format(rect));
                redrawdraw();
                RefreshEvent evt(rect);
                return SendEvent(& evt)? 1:0;
            }
        }

    我重绘了整个窗口,无论它暴露在哪个部分,我只是打印它以供参考

    我已经看到它工作了10分钟,通常一分钟后插件停止重绘自己。 我已经验证了计时器正在运行,我调用InvalidateWindow()但是没有更多的GDK_EXPOSE事件,而不是单个事件,其他一切正在进行打印调试并响应鼠标事件,它只是不会得到新的暴露事件, 我无法100%确定,但我没有得到WindowDetached事件

    其他任何遇到此事的人?

    系统是64位Ubuntu 12.04 Xfce,在firefox 29.0上测试它

    提前致谢

1 个答案:

答案 0 :(得分:0)

感谢Kalo指出我的这个

https://groups.google.com/forum/#!topic/firebreath-dev/qlxpThEUHH0

当我添加了所有gdk_thread_init / enter / leave calls

时,

问题已修复