簡體   English   中英

xcb:在 EnterNotify 后立即收到 LeaveNotify

[英]xcb: LeaveNotify received immediately after EnterNotify

我正在使用xcb庫在 Rust 中編寫一個用於學習目的的窗口管理器。 我的代碼和幾個測試窗口( xterm實例)都在 Xephyr 會話中運行。 我將根窗口上的事件掩碼設置為

xproto::EVENT_MASK_SUBSTRUCTURE_REDIRECT
| xproto::EVENT_MASK_SUBSTRUCTURE_NOTIFY
| xproto::EVENT_MASK_POINTER_MOTION
| xproto::EVENT_MASK_LEAVE_WINDOW
| xproto::EVENT_MASK_ENTER_WINDOW
| xproto::EVENT_MASK_BUTTON_PRESS
| xproto::EVENT_MASK_PROPERTY_CHANGE
| xproto::EVENT_MASK_FOCUS_CHANGE

並且所有子窗口都有一個事件掩碼

xproto::EVENT_MASK_ENTER_WINDOW
| xproto::EVENT_MASK_LEAVE_WINDOW
| xproto::EVENT_MASK_BUTTON_PRESS
| xproto::EVENT_MASK_PROPERTY_CHANGE
| xproto::EVENT_MASK_POINTER_MOTION
| xproto::EVENT_MASK_FOCUS_CHANGE
| xproto::EVENT_MASK_STRUCTURE_NOTIFY
| xproto::EVENT_MASK_EXPOSURE

當我將鼠標移到非根窗口上時,我使用EnterNotify事件在該窗口上抓取鼠標按鈕,用於點擊聚焦目的,並在LeaveNotify取消LeaveNotify 事件的順序是:

  • 根窗口上的鼠標
  • 將鼠標移到非根窗口上
  • 接收非 root 窗口的EnterNotify
  • 在非根窗口上抓取按鈕
  • 立即收到LeaveNotify而鼠標仍在非根窗口上
  • 由於LeaveNotify抓取按鈕
  • 嘗試點擊非根窗口
  • 為非根窗口接收第二個LeaveNotify
  • 接收根窗口的EnterNotify ,並在根窗口上抓取鼠標按鈕
  • 盡管光標位於非根窗口上,但ButtonPress根窗口發送ButtonPress

我真的不確定這可能是什么原因; 使用谷歌之類的東西沒有任何用處。


對於稍后可能會遇到此問題的任何人,部分解決方案是:

  • 只監聽窗口輸入事件來抓取窗口上的按鈕
  • 掩碼根為SUBSTRUCTURE_REDIRECT | SUBSTRUCTURE_NOTIFY | BUTTON_PRESS SUBSTRUCTURE_REDIRECT | SUBSTRUCTURE_NOTIFY | BUTTON_PRESS SUBSTRUCTURE_REDIRECT | SUBSTRUCTURE_NOTIFY | BUTTON_PRESS
  • 不要將LEAVE_WINDOW屏蔽到非根窗口上,並且不要處理這些事件

我不想將其添加為答案,因為:

  1. 我不確定這是正確的做法。
  2. 我沒有徹底測試過。
  3. 它沒有回答我的主要問題“為什么會收到這樣的事件?”

查看協議參考手冊。 它描述了(除其他外)生成進入和離開事件的確切算法: https : //www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html#events : pointer_window

在您的特定情況下,我希望LeaveNotify事件具有mode: Grab ,這意味着窗口不再具有“正常”指針焦點,因為某些東西(您的程序)抓取了輸入。

如果這不是答案,我可以建議在xtrace / x11trace (在基於 Debian 的發行版中作為包xtrace )下運行您的 WM。 該程序打印“通過”的所有 X11 流量。 這可能有助於弄清楚發生了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM