2011-05-08 88 views
0

我用下面的代碼來創建一些集成測試假的窗口:XCreateWindow在CentOS 5.6失敗,錯誤:BADVALUE

class CXWindowsClipboardTests 
{ 
protected: 
    virtual void 
    SetUp() 
    { 
     m_display = XOpenDisplay(NULL); 
     int screen = DefaultScreen(m_display); 
     Window root = XRootWindow(m_display, screen); 

     XSetWindowAttributes attr; 
     attr.do_not_propagate_mask = 0; 
     attr.override_redirect = True; 
     attr.cursor = Cursor(); 

     m_window = XCreateWindow(
      m_display, root, 0, 0, 1, 1, 0, 0, 
      InputOnly, CopyFromParent, 
      CWDontPropagate | CWEventMask | 
      CWOverrideRedirect | CWCursor, 
      &attr); 
    } 

    virtual void 
    TearDown() 
    { 
     XDestroyWindow(m_display, m_window); 
     XCloseDisplay(m_display); 
    } 
}; 

以上是原代碼的修改版本以減少佔用空間(見full source code)。

上面的代碼間歇性地無法在CentOS 5.6,出現以下錯誤:

X Error of failed request: BadValue 
    (integer parameter out of range for operation) 
    Major opcode of failed request: 1 (X_CreateWindow) 
    Value in failed request: 0x844b530 
    Serial number of failed request: 7 
    Current serial number in output stream: 8 

所以,真正的兩個問題:

  • 什麼會導致XCreateWindow對CentOS的間歇性地以這種方式失敗?
  • 而且,我對X開發相當陌生,所以我不知道各種錯誤值的含義(例如失敗請求中的值)或如何使用它們。有人可以簡單地爲我解釋這些嗎?

回答

1

您正在使用CWEventMask但未初始化attr.event_mask。這可能是你的問題。 (因爲結構是在堆棧上創建的,它將包含該字段中的隨機數據。)

+0

謝謝。我試圖在集成測試中複製真實環境,但由於我只是在剪貼板上做東西,也許我可以有一個0值掩碼。 – 2011-05-12 22:25:11

+0

今天的綠色建築,似乎已經成功了!乾杯。 – 2011-05-13 19:37:28