2012-02-21 17 views
0

私はX11に問題があります。私は通常のウィンドウを作成しました。ボタンをクリックすると、サブウィンドウを開き、カイロを使ってサブウィンドウを描画します。以前に開いたウィンドウを閉じたい場合は無効なX11-Window-IDです。 (C/C++)

これは、私は、ウィンドウを作成する方法である:

printf("createCairoSurface called\n"); 
printf("Window created: %i\n", (int)appWindow); 
cairo_surface_t* new_surface = cairo_xlib_surface_create(display, appWindow, DefaultVisual(display, 0), width, height);

コードのこれらのいくつかの行は、私がのXCreateWindowと通常のウィンドウを作成し、私の窓がパネルのように配置されているように、いくつかのプロパティを変更する前に。

しかし、次のコードでウィンドウを閉じる/破棄しようとすると、アプリケーションがクラッシュし、BadWindowエラーが発生します。

Window created: 37748751 
Tried to destroy window: 37748751

感謝の:でも私は、ウィンドウIDが有効でなければならないことを教えて追加のprintfの呼び出しので

Window window = (Window)static_cast(cairo_xlib_surface_get_drawable(surface)); 
printf("Tried to destroy window: %i\n", (int)window); 
XDestroyWindow(display, window);
X Error of failed request: BadWindow (invalid Window parameter) 
    Major opcode of failed request: 20 (X_GetProperty) 
    Resource id in failed request: 0x240000f 
    Serial number of failed request: 344 
    Current serial number in output stream: 344

答えて

0

エラーはリクエストX_GetPropertyなどに関連しています。 XGetProperty。

あなたのエラーは、XDestroyWindow()呼び出しから来るのではなく、アプリケーションによって後でWindowを使用するためです。

+0

ありがとうございました!これは問題を解決しました! – MichaelE1000

+1

ちなみに、XSynchronize(display、True)を使用すると、一時的にすべてのコールを同期させることができますが、パフォーマンスは低下しますが、実際に問題を引き起こしているコールでクラッシュが発生するため、デバッグには効果的です。 –

関連する問題