2013-10-03 91 views
1

我使用的是linux/ubuntu,我想用我的觸摸板玩一點。我試圖使用Python-了evdev讀從/ dev /輸入/事件的事件,現在只是將它們打印:unix上的重複設備輸入事件(/ dev/input/event)

import evdev 
dev = evdev.InputDevice('/dev/input/event6') 

import time 
while True: 
    try: 
    for event in dev.read(): 
     print event 
    except: 
    print " ~ " 
    time.sleep(.5) 

如果我做的運行提供了在虛擬控制檯根目錄的權限是腳本(X外,按下ctrl + alt + F1),當我觸摸觸摸板時,腳本會打印事件。然而,如果X在屏幕上,並且我在gnome-terminal控制檯中運行它,則不會打印任何內容;我以某種方式猜測這是正常的,輸入被X攔截。但是我仍然想要得到它們。有沒有辦法複製來自/ dev/input/event6的任何內容,以便X和我的腳本都可以讀取所有事件?

回答

1

對不起,這裏的答案有點晚了。

直到版本1.8,xorg synaptics驅動程序使用EVIOCGRAB ioctl來防止事件傳遞給其他客戶端。現在默認情況下它是禁用的,您仍然可以使用GrabEventDevice選項在您的計算機上爲舊版本禁用它(請參閱man synaptics)。

總之,沒有錯你的腳本,這是synaptics驅動程序,這就是問題在這裏。您會發現您的腳本可以在其他設備上正常工作(儘管xorg wacom驅動程序也在最近才使用該設備)。

synaptics上游承諾: http://cgit.freedesktop.org/xorg/driver/xf86-input-synaptics/commit/?id=f1948e08ee9894864254a18098e4f4fceb6e322f

-1

所以,你的想法是,X從你的觸摸板獲取數據,以便你的python代碼阻止接收觸摸板信號,對不對?或者,我可以重複您的話:至少對於某種特定類型的設備,當另一個設備讀取該設備時,應用程序無法獲取/ dev/input/event *?

理論上,由於linux使所有設備都成爲文件,因此您正在以只讀方式訪問文件,而X也是隻讀訪問文件。

我剛剛做了另一個實驗:我在我的archlinux上有一個紅外線接收器,並在兩個ssh控制檯上連接到系統。我用兩種方式訪問​​IR,也就是兩個應用程序讀取/ dev/input/event0文件(event0是我的arch上的SF):

1,一段python代碼,帶evdev;

2,shell命令爲:sudo cat/dev/input/event0 | hexdump

你可以在第二天看作是你的X.如果你的推理是正確的,當我從IR遙控器發送信號時,它們都不應該從IR(event0)同時接收數據,對?但是,我真的在兩個ssh控制檯上有日期(我希望我可以發佈圖像,但我是新來的,聲譽太低)。

所以,我認爲這不應該是原因。我想這可能是因爲你的觸摸板本身。你知道,一些設備只能在一個應用程序上工作。例如,鍵盤只能在活動應用程序中輸入字符,而某些輸入方法只會使其本身在其他應用程序上處於活動狀態,並在處理後重定向。也就是說,如果您的系統上運行了虛擬機,並且只使用一個鼠標,那麼如果您在主機桌面上移動指針,會發生什麼情況?虛擬機中的指針會移動嗎?或相反亦然?

所以我需要更多關於你的觸摸板的信息。如果您的TP僅適用於單個活動應用程序,恐怕您需要一些像鉤子這樣的想法來獲取X之前的觸摸板信號,並將其重定向到X和您的Python代碼,這可能超越了evdev。

-1

,從而使設備輸入分佈都正常的/ dev /輸入/ EVENTN您可以創建基於了evdev內核輸入處理程序和,假設爲/ dev /輸入/ copied_eventN

X將從讀的/ dev /輸入/ EVENTN但你依然可以從/ dev /輸入/ copied_eventN

其實讀你可以很容易地通過複製粘貼在驅動程序代碼/輸入/ evdev.c

創建一個內核模塊