我正在编写一个包含内容的插件, 从我在互联网上找到的所有示例中收集代码,我在Firefox上运行PluginWindowX11 并且一切都按预期工作,除了插件在1-5分钟的工作后停止重绘,
我所做的是:
设置40ms计时器,我等待刷新显示
m_timer = FB :: Timer :: getTimer(40,true,boost :: bind(& PluginWindowX11 :: update,this)); m_timer->启动()
我要求浏览器公开事件
void PluginWindowX11 :: update(){ InvalidateWindow(); 返回; }
in gboolean PluginWindowX11 :: EventCallback(GtkWidget * widget,GdkEvent * event) 对于GDK_EXPOSE事件,我重绘窗口
开关(事件 - >类型)
{
案例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上测试它
提前致谢
答案 0 :(得分:0)
https://groups.google.com/forum/#!topic/firebreath-dev/qlxpThEUHH0
当我添加了所有gdk_thread_init / enter / leave calls 时,问题已修复