2012-02-19 15 views
2

私は以下のアプリケーションを持っています。XNextEventアプリケーション起動時のブロック

#include <FWWindow.h> 
#include <FWApplication.h> 

int main(int /*argc*/, char */*argv*/[]) 
{ 
    FWApplication::Initialize(); 
    FWWindow *win = new FWWindow(800, 600); 
    win->Show(); 
    FWApplication::Run(); 
    delete win; 
} 

私はそれを実行すると、それはXサーバから次のイベントを取得するまでそれはそれブロックのでXNextEvent()に貼り付けます。私が知りたいのは、以下のコードに基づいています。を呼び出した後、XNextEventがConfigureNotifyイベントまたはExposeイベントを取得しないのはなぜですか?私のアプリケーションが私のIDEのウォッチウィンドウのアドレスに基づいて、右Displayを提供していることを確認しました。ウィンドウを表示するには何が欠けていますか?


Initialize() does the following 

-

FWApplication *FWApplication::Initialize() 
{ 
    if (!_instance) 
    { 
     _xDisplay = XOpenDisplay(NULL); 
     if (_xDisplay == NULL) 
      throw "Failed to get XDisplay"; 
     _initialized = true; 
     _instance = new FWApplication(); // Calls an empty ctor 
    } 
    return _instance; 
} 

FWWindow *win = new FWWindow(800, 600); does the following 

-


win->Show(); does the following 

-

void FWWindow::Show() 
{         
    XMapWindow(xDisplay, xWindow); // xWindow and xDisplay defined in ctor above 
} 

And finaly FWApplication::Run(); does the following 

-

int FWApplication::Run() 
{ 
    if (!_initialized) 
     return -1; 
    static bool run = true; 
    static Display *lDisplay = _xDisplay; 
    XEvent xEvent; 
    while (run) 
    { 
     do 
     { 
      XNextEvent(lDisplay, &xEvent); 
      switch (xEvent.type) 
      { 
      case ConfigureNotify: 
       { 
        unsigned int w = xEvent.xconfigure.width; 
        unsigned int h = xEvent.xconfigure.height; 
        // Do something to main widget 
       } 
      case Expose: 
       break; 
      } 
     } while (XPending(GetMainDisplay())); 
    } 
    return EXIT_SUCCESS; 
} 

答えて

2

あなたは、ウィンドウの属性にイベントマスクを指定していないので、XNextEvent()は、任意のイベントを報告しません。

xAttributes.background_pixel = XWhitePixel(xDisplay, xScreen); 
xAttributes.border_pixel = XBlackPixel(xDisplay, xScreen); 
xAttributes.override_redirect = 0; 
xAttributes.event_mask = StructureNotifyMask // for ConfigureNotify 
         | ExposureMask;  // for Expose 
+0

これは、ハングを修正したようですが、ウィンドウはまだ表示されません。私が持っていた実例を修正しなければなりませんでした。私が紛失しているものは他にありますか?私は、ウィンドウがツールバーに表示されることを追加する必要がありますが、最大化しようとすると表示されません。これはサイズのヒントに関連していますか? –

+0

言うことは難しい...ウィンドウが最大化されていない場合、またはウィンドウがまったく表示されない場合にのみウィンドウが表示されることを意味しますか?ウィンドウマネージャの装飾は見えていますか? 'Expose'ハンドラが実際に何かを描画していることを確認しましたか? –

+0

ウィンドウは開きますが、デスクトップシステムトレイでは最小化されたままです。私の以前のサンプルでは、​​XCreateWindowを呼び出すときに指定されたウィンドウx、yの位置で指定された幅と高さでウィンドウが表示されていました。私はXMapWindowと言っています。私が何かを描かなければ、WindowManagerはウィンドウを一番下に縮小しますか? –

関連する問題