2012-08-16 32 views
1

我正在使用X11窗口管理器,將它寫入python。我遇到了一個問題,我得到它,並處理ConfigureWindowEvents。但是,即便如此,當窗口被映射時,它顯示爲兩個像素高,一個像素寬的窗口。我將以下示例代碼放在一起,以便其他人可以對其進行測試,並告訴我我是否做錯了。我根據我的ConfigureEvent處理的代碼qtile的如何在Python中使用xcb ConfigureWindow正確配置windows

import xcb 
import xcb.xproto as xproto 
from xcb.xproto import ConfigWindow as cw 

conn = xcb.connect() 
root = conn.get_setup().roots[0].root 
eventmask = [xproto.EventMask.SubstructureRedirect] 
err =conn.core.ChangeWindowAttributesChecked(root, xproto.CW.EventMask, eventmask) 
check = err.check() 
if check: 
    print check 

while True: 
    e = conn.wait_for_event() 

    if isinstance(e, xproto.MapRequestEvent): 
     conn.core.MapWindow(e.window) 

    if isinstance(e, xproto.ConfigureRequestEvent): 
     y = x = w = h = bw = 0 
     if e.value_mask & cw.X: 
      x = e.x 
      print "x:", x 
     if e.value_mask & cw.Y: 
      y = e.y 
      print "y:", y 
     if e.value_mask & cw.Height: 
      h = e.height 
      print "h:", h 
     if e.value_mask & cw.Width: 
      w = e.width 
      print 'w:', w 
     if e.value_mask & cw.BorderWidth: 
      bw = e.border_width 
      print 'bw:', bw 
     mask = cw.X | cw.Y | cw.Width | cw.Height | cw.BorderWidth 
     values = {cw.X: x, cw.Y: y, cw.Width: w, cw.Height: h, cw.BorderWidth: bw} 
     err = conn.core.ConfigureWindowChecked(e.window, mask, values) 
     err.check() 
    conn.flush() 
    print e 

我使用捕捉錯誤

+0

它適用於我 - 我試圖推出Xnest +這個腳本+ xeyes和xeyes窗口映射 – 2012-08-17 00:05:54

+0

@AndreySidorov無論是在Xephyr中還是在全面的X會話中啓動,我仍然可以看到這個小窗口。在窗口映射之前,我得到了ConfigureRequestEvents,那是應該發生什麼? – 2012-08-17 01:36:57

+0

這可能反映了客戶端的順序:創建窗口,配置,映射。由於您正在攔截地圖並使用SubstructureRedirect進行配置,因此您正在接收這些* RequestEvent事件。 – 2012-08-17 01:53:47

回答

1

在希望的託運功能我從XCB郵件列表我的答案,這是相當快:

values = {cw.X: x, cw.Y: y, cw.Width: w, cw.Height: h, cw.BorderWidth: bw} 

應該

values = [x, y, w, h, bw] 

然後萬事大吉了世界一次。