簡體   English   中英

FLTK:具有多個Fl_Windows的X窗口初始化的XLib錯誤

[英]FLTK: XLib error with X window initialization with multiple Fl_Windows

根據設計要求,我正在FLTK中開發GUI,該GUI必須具有主(父)窗口,子窗口以及作為子窗口的子窗口的X窗口。 這是在Ubuntu 16.04中。

使用此設置運行我的原始項目會產生XLib錯誤BadWindow (invalid Window parameter) (Details: serial 7 error_code 3 request_code 1 minor_code 0)

我有以下測試程序,該程序僅具有與該錯誤相關的功能,該功能會重現類似的錯誤:

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

主要功能

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

運行時,以上代碼應創建一個帶有按鈕的窗口。 當按下按鈕時,將創建一個子窗口,並嘗試創建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();
}

此代碼(創建兩個非分層窗口)也將失敗:

int main(){
    ChildWindow child1; // This window works
    ChildWindow child2; // This causes similar errors as above
    Fl::run();
}

我還嘗試了fl_open_displayFl_Window::make_current各種組合, fl_open_display Fl_Window::make_current成功。

(所有代碼在一個文件中,通過運行./fltk-config --compile myprog.cpp編譯)

這里的模式似乎是X窗口初始化為第一個FLTK窗口很好,但不適用於此后創建的窗口。 我的猜測是,它與FLTK如何與XLib接口/初始化有關,但是我無法在文檔中找到具體信息。

是否有人解釋/解決方案為什么X窗口初始化僅在使用第一個創建的FLTK窗口作為父窗口時才起作用?

問題是XOpenDisplay被調用了兩次。 FLTK作為初始化過程的一部分打開顯示,並在初始化X窗口時再次調用它,使系統混亂。

通過刪除位於dis = XOpenDisplay(NULL)並替換對dis引用dis = XOpenDisplay(NULL)位於fl_display處的FLTK顯示dis = XOpenDisplay(NULL)來解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM