2016-07-15 10 views
1

後で別のスレッドから描画する、2つのウィンドウをLinuxで作成したいとします。私は現在、私が作成する2番目のウィンドウが作成されない(エラーは発生しない)非決定論的なバグを持っています。シンプルC 2つのX11ウィンドウを作成するプログラム

ここにコードがあります。

static void create_x_window(Display *display, Window *win, int width, int height) 
{ 
    int screen_num = DefaultScreen(display); 
    unsigned long background = WhitePixel(display, screen_num); 
    unsigned long border = BlackPixel(display, screen_num); 
    *win = XCreateSimpleWindow(display, DefaultRootWindow(display), /* display, parent */ 
     0,0, /* x, y */ 
     width, height, /* width, height */ 
     2, border, /* border width & colour */ 
     background); /* background colour */ 
    XSelectInput(display, *win, ButtonPressMask|StructureNotifyMask); 
    XMapWindow(display, *win); 

} 

int main(void) { 
    XInitThreads(); // prevent threaded XIO errors 
    local_display = XOpenDisplay(":0.0"); 

    Window self_win, remote_win; 
    XEvent self_event, remote_event; 

    create_x_window(local_display, &remote_win, 640,480); 
    // this line flushes buffer and blocks so that the window doesn't crash for a reason i dont know yet 
    XNextEvent(local_display, &remote_event); 


    create_x_window(local_display, &self_win, 320, 240); 
    // this line flushes buffer and blocks so that the window doesn't crash for a reason i dont know yet 
    XNextEvent(local_display, &self_event); 

    while (1) { 

    } 
    return 0; 
} 

は、私は本当に窓に入力をキャプチャするために気にしないが、私は(イベントループで)てXSelectInputとXNextEventを持っていたチュートリアルを発見し、私はどちらかなしでこの作品を作る問題を抱えました。

答えて

1

これはバグではなく、機能です。 You left out the event loop

XNextEventを賢明に2回呼びますが、Xプロトコルは非同期ですので、XNextEventを呼び出すときにサーバーが実際のウィンドウを設定している可能性があります。

Tutorial here.

+0

感謝メイト。 XNextEventを私のイベントループから守ったのは、私がブロックしたくないからだった。私がする必要があったのは 'while(XPending(local_display)){XNextEvent(local_display、&event)}; – James

関連する問題