デザイン要件ごとに、メイン(親)ウィンドウ、子ウィンドウ、子ウィンドウの子ウィンドウである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_display
とFl_Window::make_current
の様々な組み合わせを試してみました。ここ
(一つのファイルにあるすべてのコードは、./fltk-config --compile myprog.cpp
を実行してコンパイル)
パターンは、Xウィンドウは最初FLTKウィンドウの罰金初期化しますが、その後に作成されたウィンドウのないことが表示されます。私の推測では、FLTKがXLibとどのようにインターフェース/初期化するかとは関係がありますが、ドキュメントで詳細を見つけることができませんでした。
最初に作成されたFLTKウィンドウを親として使用すると、X Windowの初期化のみが機能する理由と説明がありますか?
いくつかの[FLTK](http://www.fltk.org/newsgroups.php?gfltk.general+T)グループ –
@Basile Starynkevitchにお聞きしてみてください。提案していただきありがとうございます。 – bcdan
FLTKを低レベルのX11 APIと混合しています。これは意味がありません。なぜあなたは 'XOpenDisplay'' XCreateSimpleWindow'とこれを必要としますか? –