Bagaimana cara kerja acara mouse di linux?

25

Ini sebagian besar karena penasaran, saya mencoba memahami bagaimana penanganan acara bekerja pada tingkat rendah, jadi tolong jangan merujuk saya ke perangkat lunak yang akan melakukannya untuk saya.

Jika misalnya saya ingin menulis sebuah program dalam C / C ++ yang bereaksi terhadap klik mouse, saya menganggap saya perlu menggunakan system call untuk menghubungkan beberapa fungsi ke kernel, atau mungkin Anda hanya perlu terus-menerus memeriksa status mouse, Saya tidak tahu

Saya berasumsi itu mungkin karena hampir semuanya mungkin di C / C ++, karena levelnya sangat rendah, saya sebagian besar tertarik pada cara kerjanya, meskipun saya mungkin tidak akan pernah harus mengimplementasikannya sendiri.

Pertanyaannya adalah bagaimana cara kerjanya di linux, apakah ada panggilan sistem tertentu, perpustakaan, dll?

58
sumber

Jawaban:

28

Jika Anda menulis program dunia nyata yang menggunakan mouse di Linux, kemungkinan besar Anda menulis aplikasi X, dan dalam hal ini Anda harus meminta server X untuk acara mouse. Qt , GTK , dan libsdl adalah beberapa pustaka C populer yang menyediakan fungsi untuk mengakses mouse, keyboard, grafik, timer, dan fitur lain yang diperlukan untuk menulis program GUI. Ncurses adalah perpustakaan serupa untuk aplikasi terminal.

Tetapi jika Anda menjelajahi sistem Anda, atau Anda tidak dapat menggunakan X untuk alasan apa pun, berikut adalah cara kerjanya di antarmuka kernel.

Gagasan inti dalam filosofi UNIX adalah bahwa "semuanya adalah file". Lebih khusus lagi, sebanyak mungkin hal harus dapat diakses melalui panggilan sistem yang sama yang Anda gunakan untuk bekerja dengan file. Jadi antarmuka kernel ke mouse adalah file perangkat. Anda open()itu, panggilan opsional poll()atau select()di atasnya untuk melihat apakah ada data yang masuk, dan read()untuk membaca data.

Pada masa pra-USB, file perangkat tertentu sering berupa port serial, mis. /dev/ttyS0, Atau port PS / 2 /dev/psaux,. Anda berbicara dengan mouse menggunakan protokol perangkat keras apa pun yang dibangun ke dalam mouse. Saat ini, /dev/input/*subsistem lebih disukai, karena menyediakan cara terpadu dan tidak tergantung pada perangkat untuk menangani banyak perangkat input yang berbeda. Secara khusus, /dev/input/miceakan memberi Anda acara dari mouse apa pun yang terpasang pada sistem Anda, dan /dev/input/mouseNakan memberi Anda acara dari mouse tertentu. Di sebagian besar distribusi Linux modern, file-file ini dibuat secara dinamis ketika Anda mencolokkan mouse.

Untuk informasi lebih lanjut tentang apa yang akan Anda baca atau tulis ke file perangkat mouse, Anda dapat mulai dengan input / input.txt dalam dokumentasi kernel. Lihat khususnya di bagian 3.2.2 (mousedev) dan 3.2.4 (evdev), dan juga bagian 4 dan 5.

Jander
sumber
8

Secara umum, informasi dari perangkat keras terpapar ke aplikasi melalui file perangkat . Untuk tikus, pada sistem Linux modern, perangkat ini /dev/mice(perangkat ini mengumpulkan peristiwa dari semua mouse yang terhubung, ada juga perangkat yang sesuai dengan masing-masing mouse individu).

Ketika Anda memindahkan atau mengklik mouse, mouse mengirimkan sinyal listrik ke komputer, yang menyebabkannya menimbulkan interupsi . Sepotong kode dalam kernel Linux yang disebut interrupt handler pada gilirannya membaca data kejadian (misalnya tombol mana yang ditekan) dan memicu rangkaian pemberitahuan di dalam kernel.

Jika ada aplikasi yang membaca dari file perangkat yang sesuai dengan perangkat ini, aplikasi tersebut diberitahu bahwa input sedang menunggu. Misalnya, jika aplikasi diblokir dalam panggilan sistem , maka panggilan sistem kembali.read

Pada sistem yang khas, ada satu proses membaca peristiwa tikus: server X Window . Program itu mengelola tampilan grafis dan input periferal. Masing-masing aplikasi grafis kemudian diberitahu tentang peristiwa mouse melalui protokol peristiwa X generik, yang membawa jenis peristiwa lain seperti penekanan tombol, perubahan fokus jendela, perubahan visibilitas jendela, ...

Gilles 'SANGAT berhenti menjadi jahat'
sumber