Làm thế nào để các sự kiện chuột làm việc trong linux?


25

Điều này chủ yếu là vì tò mò, tôi đang cố gắng hiểu cách xử lý sự kiện hoạt động ở mức độ thấp, vì vậy xin đừng tham khảo cho tôi một phần mềm sẽ làm điều đó cho tôi.

Ví dụ, nếu tôi muốn viết một chương trình bằng C / C ++ phản ứng với các lần nhấp chuột, tôi giả sử tôi cần sử dụng một cuộc gọi hệ thống để nối một số chức năng vào kernel hoặc có thể bạn chỉ cần liên tục kiểm tra trạng thái của chuột, Tôi không biết.

Tôi cho rằng điều đó là có thể vì mọi thứ đều có thể có trong C / C ++, ở mức độ thấp, tôi chủ yếu quan tâm đến cách thức hoạt động của nó, mặc dù có lẽ tôi sẽ không bao giờ phải tự thực hiện.

Câu hỏi là làm thế nào nó hoạt động trong linux, có một số cuộc gọi hệ thống, thư viện c, vv?

Câu trả lời:


28

Nếu bạn đang viết một chương trình trong thế giới thực sử dụng chuột trong Linux, rất có thể bạn đang viết một ứng dụng X và trong trường hợp đó, bạn nên hỏi máy chủ X về các sự kiện chuột. Qt , GTKlibsdl là một số thư viện C phổ biến cung cấp các chức năng để truy cập chuột, bàn phím, đồ họa, bộ hẹn giờ và các tính năng khác cần thiết để viết chương trình GUI. Ncurses là một thư viện tương tự cho các ứng dụng đầu cuối.

Nhưng nếu bạn đang khám phá hệ thống của mình hoặc bạn không thể sử dụng X vì bất kỳ lý do gì, thì đây là cách nó hoạt động ở giao diện kernel.

Một ý tưởng cốt lõi trong triết lý UNIX là "mọi thứ đều là một tập tin". Cụ thể hơn, càng nhiều thứ càng tốt có thể truy cập được thông qua cùng các cuộc gọi hệ thống mà bạn sử dụng để làm việc với các tệp. Và do đó, giao diện kernel cho chuột là một tập tin thiết bị. Bạn open(), tùy chọn gọi poll()hoặc select()trên đó để xem liệu có dữ liệu đến và read()để đọc dữ liệu.

Trong thời gian trước USB, tệp thiết bị cụ thể thường là cổng nối tiếp, ví dụ: /dev/ttyS0cổng PS / 2 , /dev/psaux. Bạn đã nói chuyện với chuột bằng bất kỳ giao thức phần cứng nào được tích hợp vào chuột. Ngày nay, /dev/input/*hệ thống con được ưa thích, vì nó cung cấp một cách thống nhất, độc lập với thiết bị để xử lý nhiều thiết bị đầu vào khác nhau. Cụ thể, /dev/input/micesẽ cung cấp cho bạn các sự kiện từ bất kỳ con chuột nào được gắn vào hệ thống của bạn và /dev/input/mouseNsẽ cung cấp cho bạn các sự kiện từ một con chuột cụ thể. Trong hầu hết các bản phân phối Linux hiện đại, các tệp này được tạo động khi bạn cắm chuột.

Để biết thêm thông tin về chính xác những gì bạn sẽ đọc hoặc ghi vào tệp thiết bị chuột, bạn có thể bắt đầu với input / input.txt trong tài liệu kernel. Nhìn cụ thể vào các phần 3.2.2 (mousedev) và 3.2.4 (evdev), và cả phần 4 và 5.


8

Nói chung, thông tin từ các thiết bị phần cứng được tiếp xúc với các ứng dụng thông qua các tệp thiết bị . Đối với chuột, trên các hệ thống Linux hiện đại, thiết bị này /dev/mice(thiết bị này thu thập các sự kiện từ tất cả các con chuột được kết nối, cũng có các thiết bị tương ứng với từng con chuột riêng lẻ).

Khi bạn di chuyển hoặc nhấp chuột, chuột sẽ gửi tín hiệu điện đến máy tính, điều này khiến nó tăng tín hiệu ngắt . Một đoạn mã trong nhân Linux được gọi là trình xử lý ngắt lần lượt đọc dữ liệu sự kiện (ví dụ: nút nào được nhấn) và kích hoạt một chuỗi thông báo bên trong hạt nhân.

Nếu có bất kỳ ứng dụng nào đang đọc từ tệp thiết bị tương ứng với thiết bị này, ứng dụng đó được thông báo rằng đầu vào đang chờ. Ví dụ: nếu ứng dụng bị chặn trong một cuộc gọi hệ thống , thì cuộc gọi hệ thống sẽ trả về.read

Trên một hệ thống điển hình, có một quá trình đọc các sự kiện chuột: máy chủ X Window . Chương trình đó quản lý màn hình đồ họa và các thiết bị ngoại vi đầu vào. Các ứng dụng đồ họa riêng lẻ sau đó được thông báo về các sự kiện chuột thông qua giao thức sự kiện X chung, mang các loại sự kiện khác như nhấn phím, thay đổi tiêu điểm cửa sổ, thay đổi khả năng hiển thị của cửa sổ,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.