2017-07-18 12 views
0

デザイン要件ごとに、メイン(親)ウィンドウ、子ウィンドウ、子ウィンドウの子ウィンドウであるXウィンドウが必要なFLTKでGUIを開発しています窓。これはUbuntu 16.04にあります。FLTK:複数のFl_WindowsでのXウィンドウの初期化でのXLibエラー

このセットアップで元のプロジェクトを実行すると、XLibエラーBadWindow (invalid Window parameter) (Details: serial 7 error_code 3 request_code 1 minor_code 0)が生成されます。

私は、同様のエラーを再現エラーに関連する機能だけでは、次のテストプログラムがあります。

int main(){ 
    ParentWindow parent; 
    Fl::run(); 
} 

実行すると、上記のコードがすべきの主な機能と

#include <FL/Fl.H> 
#include <FL/Fl_Window.H> 
#include <FL/Fl_Button.H> 
#include <FL/x.H> 

#include <iostream> 

class ChildWindow : public Fl_Window { 
public: 
    ChildWindow() : Fl_Window(100, 100, 300, 200, "Child"){ 
     this->end(); 
     this->show(); 

     Display * dis = XOpenDisplay(NULL); 

     std::cout << "Child XID: " << (void *)fl_xid(this) << '\n'; 
     std::cout << "XWindow XID: " << dis << '\n'; 

     Window win = XCreateSimpleWindow(dis, fl_xid(this), 
      5, 5, 100, 100, 0, 0, 0); 
     XMapRaised(dis, win); 
     XSync(dis, false); 
    } 
}; 

class ParentWindow : public Fl_Window { 
public: 
    static ChildWindow * child; 

    ParentWindow() : Fl_Window(100, 100, 400, 300, "Parent"){ 
     Fl_Button * b = new Fl_Button(10, 10, 70, 20, "Make Child"); 
     b->callback(CallbackMakeChild, NULL); 
     this->add(b); 
     this->end(); 
     this->show(); 

     std::cout << "Parent XID: " << (void *)fl_xid(this) << '\n'; 
    } 

    static void CallbackMakeChild(Fl_Widget * w, void * o){ 
     child = new ChildWindow(); 
     child->show(); 
    } 
}; 

ChildWindow * ParentWindow::child = NULL; 

をボタン付きウィンドウを作成します。ボタンを押すと、子ウィンドウが作成され、Xウィンドウが作成されます。それだけで

Parent XID: 0x4400002 
Child XID: 0x4400005 
XWindow XID: 0xe03140 
X_CreateWindow: BadWindow (invalid Window parameter) 0x4400005 
X_ConfigureWindow: BadWindow (invalid Window parameter) 0x4600001 
X_MapWindow: BadWindow (invalid Window parameter) 0x4600001 

子ウィンドウとXウィンドウ細かい動作します:

int main(){ 
    ChildWindow child; 
    Fl::run(); 
} 

このコード(2非階層ウィンドウを作成する)も失敗します。

int main(){ 
    ChildWindow child1; // This window works 
    ChildWindow child2; // This causes similar errors as above 
    Fl::run(); 
} 
ここでコンソール出力があります

私はまた、fl_open_displayFl_Window::make_currentの様々な組み合わせを試してみました。ここ

(一つのファイルにあるすべてのコードは、./fltk-config --compile myprog.cppを実行してコンパイル)

パターンは、Xウィンドウは最初FLTKウィンドウの罰金初期化しますが、その後に作成されたウィンドウのないことが表示されます。私の推測では、FLTKがXLibとどのようにインターフェース/初期化するかとは関係がありますが、ドキュメントで詳細を見つけることができませんでした。

最初に作成されたFLTKウィンドウを親として使用すると、X Windowの初期化のみが機能する理由と説明がありますか?

+0

いくつかの[FLTK](http://www.fltk.org/newsgroups.php?gfltk.general+T)グループ –

+0

@Basile Starynkevitchにお聞きしてみてください。提案していただきありがとうございます。 – bcdan

+0

FLTKを低レベルのX11 APIと混合しています。これは意味がありません。なぜあなたは 'XOpenDisplay'' XCreateSimpleWindow'とこれを必要としますか? –

答えて

0

問題はXOpenDisplayが2回呼び出されていたことでした。 FLTKは、初期化プロセスの一環としてディスプレイを開き、システムを台無しにしたXウィンドウを初期化して再び呼び出す。

これは、dis = XOpenDisplay(NULL)の行を削除し、disの参照をFLTKディスプレイfl_displayに置き換えて解決しました。

関連する問題