簡體   English   中英

XCB:檢測窗口名稱/標題的更改

[英]XCB: detect change of a window's name / title

XCB 允許我們...

  • 通過WM_NAME.NET_WM_NAME屬性讀取窗口的名稱(標題)
  • 通過XCB_EVENT_MASK_PROPERTY_CHANGE監控 window 屬性的變化

我成功地做到了這兩點。 具體來說,這是我如何監視所有 windows 的.NET_WM_NAME屬性的變化(通過訂閱根窗口上的事件):

/* ... */

const uint32_t list[] = { XCB_EVENT_MASK_PROPERTY_CHANGE };
xcb_change_window_attributes(conn, root_window, XCB_CW_EVENT_MASK, &list);
xcb_flush(conn);

xcb_generic_event_t *evt;
while ((evt = xcb_wait_for_event(conn)))
{
    if (evt->response_type == XCB_PROPERTY_NOTIFY)
    {
        xcb_property_notify_event_t *e = (void *) evt;
        /* ... print the window name ... */
    }
    free(evt);
}

/* ... */

這在大多數情況下似乎工作正常,但我注意到當我在瀏覽器中更改選項卡時我沒有收到事件,即使這確實更改了瀏覽器窗口的標題。

我是做錯了還是 XCB 做不到?


上述代碼的功勞主要歸功於對相關問題的回答

具體來說,這是我如何監視所有 windows 的 .NET_WM_NAME 屬性的變化(通過訂閱根窗口上的事件):

您顯示的代碼不監視所有 windows 的屬性更改。它僅監視根 window 上的屬性更改。

如果你想監聽所有 windows 的屬性變化……好吧,這很復雜。 您可以撥打SubstructureNotify獲取 SubstructureNotify。 每當創建新的子窗口時,這應該為您提供CreateNotify事件。 對於 window,您將再次使用SubstructureNotify SubstructureNotify 等遞歸地獲取所有 windows。

對於您找到此遺囑的每個 windows,您還想發送一個QueryTree請求以獲取其子項。 您還必須 select 孩子 windows 的事件在您的程序開始之前已經存在。

當然,在請求 SubstructureNotify 時,您還應該為PropertyNotifyMask SubstructureNotify 這樣,只要任何 window 更改任何屬性 (*),您都應該得到通知。

(*):嗯,當然有可能創建 window 並立即更改屬性。 最有可能的是,此屬性將在您有機會請求PropertyNotify之前設置。 因此,如果您真的想查看所有屬性,您還需要在請求屬性更改后對 windows 發出ListProperties請求...

暫無
暫無

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

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