2016-04-07 8 views
3

私はX11ディスプレイ間で移動できるアプリケーションを持っていますが、私が始めた場所以外のディスプレイにいるときにポップアップメニューを開くとクラッシュします。メニューバーのメニューは正常に動作しますが、ポップアップは表示されません。 代替X11ディスプレイでポップアップメニューを開いたときにGtk3がクラッシュする

(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; 

バージョン:

  • OS:CentOSの7.1(Linuxの3.10.0-229.el7.x86_64)
  • たPerl:5.16.3
  • Gtk3:3.8.8
  • X11:1.15.0
+0

誰かがこれを別の言語で試したことがある場合は、それが機能しているかどうかを知りたいと思います。 – TheAmigo

答えて

1

XorgがGtkのバージョンのバグに表示されます。

私はGtk 3.18でシステム上でテストすることができ、正常に動作します。少なくとも私はそれがPerlコードのバグではないことを知っています。