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呢?ㄜ,有空再看~

This entry was posted in 電腦和網際網路. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s