Gtk 获取根窗口pixbuff的GDK2和GDK3方法失败(带有错误消息)

Gtk 获取根窗口pixbuff的GDK2和GDK3方法失败(带有错误消息),gtk,screenshot,gtk3,gtk2,gdk,Gtk,Screenshot,Gtk3,Gtk2,Gdk,我正在尝试获得一个pixbuf,我使用了gdk3方法和gdk2方法,但都失败了。在这里使用ctypes,但问题不是ctypes,我确信这一点,所以用它标记会让ctypes人感到困惑。所以我只放了gtk标签 GDK3法 没有错误发生。然后运行以下代码: var src_x = 0; var src_y = 0; var pixbuf = ostypes.API('gdk_pixbuf_get_from_window')(cRootWin, src_x, src_y, cWidth, cHeight

我正在尝试获得一个pixbuf,我使用了gdk3方法和gdk2方法,但都失败了。在这里使用ctypes,但问题不是ctypes,我确信这一点,所以用它标记会让ctypes人感到困惑。所以我只放了gtk标签

GDK3法 没有错误发生。然后运行以下代码:

var src_x = 0;
var src_y = 0;
var pixbuf = ostypes.API('gdk_pixbuf_get_from_window')(cRootWin, src_x, src_y, cWidth, cHeight);
然后它抛出这个:

(firefox:2624): GLib-GObject-WARNING **: cannot register existing type 'GdkWindow'

(firefox:2624): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed

(firefox:2624): Gdk-CRITICAL **: gdk_pixbuf_get_from_window: assertion 'GDK_IS_WINDOW (src)' failed
有人知道发生了什么事吗?我很长一段时间都不明白这一点:(

GDK2法 代替gdk 3方法,我尝试了gdk2方法,但它崩溃了:

var cRootWin = ostypes.API('gdk_screen_get_root_window')(cScreen);
var cWidth = ostypes.API('gdk_screen_get_width')(cScreen);
var cHeight = ostypes.API('gdk_screen_get_height')(cScreen);
var dest_x = 0;
var dest_y = 0;
var src_x = 0;
var src_y = 0;
var pixbuf = ostypes.API('gdk_pixbuf_get_from_drawable')(null, cRootWin, null, src_x, src_y, dest_x, dest_y, cWidth, cHeight);
这会使浏览器崩溃,并在终端中显示此消息:

[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
firefox: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
firefox: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.

我有几天没能弄明白这一点,你能告诉我吗。

这是如何运行的?作为Firefox扩展?感谢@andlabs的attn,是的,它使用js ctypes来解释错误;分别是:你不能混合使用GTK+2(Firefox使用)和GTK+3,并且您的扩展运行在不同的线程上。不幸的是,我不熟悉Firefox扩展,抱歉;我只能建议尝试使用空闲回调,但我不确定这是否真的有效…啊,谢谢@andlabs!您就像Sherlock Holmes!!是的,我正在另一个线程中运行此代码!但是GTK怎么会这样呢+2、
gdk_pixbuf_get_from_drawable
的方法会导致不正确混合的崩溃吗?我一定要调用
xinithreads
吗?我不知道。这可能与进程分离有关。Firefox扩展方面的专家现在需要回答。我知道GTK+3的空闲回调可以通过
GLib.idle_\a完成dd()
;除此之外,我不知道如何使用Python或GTK+2进行此操作。抱歉:/
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
firefox: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
firefox: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.