X Window 下的 Hook

 

以前在Windows的時候,要攔截全域的滑鼠 or 鍵盤,都有一堆函式可以使用,還有分低階、高階、攔截、紀錄、撥放,沒想到 X Window 好像都沒類似的東西,這次我的程式想要做全域的 MouseGesture,也就是不管我的程式有沒有取得焦點都可以取得滑鼠的事件,查了一下資料,應該只能使用 librecord.so,但這個元件已經很久沒更新了,而且 Xorg 中間 1.5x 的版本還因為安全性的問題曾將其移除,所以我就只好使用 OpenEmbedded重新編譯。

重點是那時候一直以為使用 librecord會比較省資源,因為他是註冊 event 的Callback,可是比較奇怪的是,註冊完Callback之後,Main Thread還需要一個while loop去呼叫他提供的函式來處理Buffer (XRecordProcessRepies),然後他內部再呼叫我剛註冊的函式。結果在Gumstix上面測試的時候CPU一直居高不下,不管我 Sleep 多久。

後來也沒甚麼辦法了,只好試試那時候為了防止沒有 librecord 可用的時候,另外用 XQueryPointer 的一個版本,沒想到CPU竟然只耗 1x% 而已,想說自己 Polling Mouse 應該比使用librecord Callbak 還耗資源說~應該是X Window的架構所導致的吧~

後記:ㄜ,我錯怪 record module了,後來在source裡面找到有Synchronous的版本,也就是會Block住,這樣幾乎就沒占甚麼CPU了,但主管又接著問我,那設計者怎麼可能會設計出一個很耗CPU的Asynchronous Mode呢?ㄜ,有空再看~

留言

這個網誌中的熱門文章

好貴的東元冷氣維修--馬達啟動電容

台大醫院 婁培人 耳鼻喉科 就診

機車無法充電之整流器壞掉--$650