在备用X11显示器上打开弹出菜单时Gtk3崩溃

时间:2016-04-07 20:34:45

标签: perl x11 gtk3

我有一个可以在X11显示器之间移动的应用程序,但是当我在显示器之外的其他位置时,尝试打开弹出菜单会导致崩溃。菜单栏中的菜单工作正常,只是弹出窗口没有。

(popuptest.pl:17147): Gdk-ERROR **: The program 'popuptest.pl' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadWindow (invalid Window parameter)'.
  (Details: serial 355 error_code 3 request_code 131 minor_code 51)
  (Note to programmers: normally, X errors are reported asynchronously;
   that is, you will receive the error a while after causing it.
   To debug your program, run it with the GDK_SYNCHRONIZE environment
   variable to change this behavior. You can then get a meaningful
   backtrace from your debugger if you break on the gdk_x_error() function.)
Trace/breakpoint trap (core dumped)

我创建了一个简单的测试用例来重现问题:

  1. 启动辅助显示(即另一台机器,Xvnc :1等)
  2. 启动第二个显示的查看器(例如vncviewer :1
  3. 运行以下代码
  4. 右键单击按钮,弹出菜单正常工作
  5. 左键单击按钮,使窗口移动到另一个显示
  6. 在另一个显示屏上,右键单击按钮并观看崩溃
  7. 示例代码:

    #!/usr/bin/perl -w
    use strict;
    use Glib qw/TRUE FALSE/;
    use Gtk3 -init;
    my $win = Gtk3::Window->new;
    $win->signal_connect(destroy => sub {Gtk3::main_quit});
    my $btn = Gtk3::Button->new_with_label("move to :1");
    $btn->signal_connect(clicked => sub {
            $win->set_screen(Gtk3::Gdk::Display::open(":1")->get_screen(0));
    });
    my $menu;
    $btn->signal_connect('button-press-event' => sub {
            my ($widget, $event) = @_;
            return FALSE unless $event->button == 3;
            $menu = Gtk3::Menu->new;
            $menu->attach(Gtk3::MenuItem->new_with_label(''.localtime), 0, 1, 0, 1);
            $menu->show_all;
            $menu->popup(undef, undef, undef, undef, $event->button, $event->time);
            return TRUE;
    });
    $win->add($btn);
    $win->show_all;
    Gtk3->main;
    

    版本:

    • 操作系统:CentOS 7.1(Linux 3.10.0-229.el7.x86_64)
    • Perl:5.16.3
    • Gtk3:3.8.8
    • X11:xorg 1.15.0

1 个答案:

答案 0 :(得分:1)

这个版本的Gtk似乎是一个错误。

我能够在使用Gtk 3.18的系统上测试它并且工作正常。至少我知道它不是Perl代码中的错误。