2008-09-24 33 views
5

Đầu tiên, vâng tôi biết về this question, nhưng tôi đang tìm kiếm thêm một chút thông tin về điều đó. Tôi có thực sự, một vấn đề khá giống nhau, trong đó tôi cần để có thể nắm bắt đầu vào cho chuột/bàn phím/phím điều khiển, và tôi cũng muốn tránh SDL nếu có thể. Tôi đã nhiều hơn hoặc ít tự hỏi nếu có ai biết nơi tôi có thể nhận được một số mồi tốt về xử lý đầu vào từ các thiết bị trong Linux, có lẽ ngay cả một số hướng dẫn. SDL hoạt động tốt cho xử lý đầu vào đa nền tảng, nhưng tôi sẽ không sử dụng bất kỳ thứ gì khác từ SDL, vì vậy tôi muốn cắt nó hoàn toàn. Đề xuất, nhận xét và trợ giúp đều được đánh giá cao. Cảm ơn!Ghi lại đầu vào trong Linux

Chỉnh sửa cho rõ ràng:

Vấn đề là để nắm bắt chuyển động chuột, bàn phím bấm/release, cú click chuột, và có khả năng điều khiển xử lý cho một trò chơi.

+0

Tôi cảm thấy câu hỏi này khá rộng. Nói chuyện trực tiếp với thiết bị đầu vào? (Thường là một ý tưởng tồi cho một ứng dụng cấp cao.) Sử dụng X? (Nếu X, bạn có muốn Xlib, XCB, Gtk +, Qt, ...) GPM cho chuột trong chế độ console không? – asveikau

Trả lời

5

Sử dụng liên kết bên dưới xem xét các chức năng khoảng trống kGUISystemX :: Loop (void)

Đây là vòng lặp chính của tôi để có được đầu vào thông qua bàn phím và chuột sử dụng X Windows trên Linux.

http://code.google.com/p/kgui/source/browse/trunk/kguilinux.cpp

Dưới đây là một đoạn trích:

if(XPending(m_display)) 
    { 
     XNextEvent(m_display, &m_e); 
     switch(m_e.type) 
     { 
     case MotionNotify: 
      m_mousex=m_e.xmotion.x; 
      m_mousey=m_e.xmotion.y; 
     break; 
     case ButtonPress: 
      switch(m_e.xbutton.button) 
      { 
      case Button1: 
       m_mouseleft=true; 
      break; 
      case Button3: 
       m_mouseright=true; 
      break; 
      case Button4:/* middle mouse wheel moved */ 
       m_mousewheel=1; 
      break; 
      case Button5:/* middle mouse wheel moved */ 
       m_mousewheel=-1; 
      break; 
      } 
     break; 
     case ButtonRelease: 
      switch(m_e.xbutton.button) 
      { 
      case Button1: 
       m_mouseleft=false; 
      break; 
      case Button3: 
       m_mouseright=false; 
      break; 
      } 
     break; 
     case KeyPress: 
     { 
      XKeyEvent *ke; 
      int ks; 
      int key; 

      ke=&m_e.xkey; 
      kGUI::SetKeyShift((ke->state&ShiftMask)!=0); 
      kGUI::SetKeyControl((ke->state&ControlMask)!=0); 
      ks=XLookupKeysym(ke,(ke->state&ShiftMask)?1:0); 
...... 
1

Bạn không nói rõ mục đích của ứng dụng của bạn, nhưng đọc dữ liệu thô từ các thiết bị đầu vào là hiếm khi những gì bạn muốn, trừ khi bạn chỉ làm điều đó cho vui (hoặc dự án trường học hoặc bất cứ điều gì)

Nếu bạn đang viết một ứng dụng GUI (một ứng dụng chạy trong môi trường đồ họa X11), bạn có thể dựa vào các trình điều khiển nhập liệu đồ họa (hoặc nguyên X).

Nếu bạn đang viết ứng dụng chế độ văn bản, thì có thể readline hoặc thậm chí ncurses có thể là lựa chọn thay thế tốt.

2

Nếu bạn biết dự án của mình sẽ chỉ chạy dưới Linux (không phải Windows hoặc thậm chí một trong các BSD), bạn nên xem xét hệ thống nhập của hạt nhân Linux. Tải xuống kernel source và đọc Documentation/input/input.txt, đặc biệt là mô tả của hệ thống evdev.

Để có giải pháp cấp cao hơn (và di động hơn) đáng kể, read up on Xlib. Rõ ràng nó đòi hỏi một máy chủ X đang chạy, nhưng nó có lợi thế là kế thừa các thiết lập bàn phím của người dùng. Sự kiện phím điều khiển không may không được bao gồm, bạn có thể cần phải sử dụng API joystick hạt nhân cho những người.

-1

Bạn có thể lấy đầu vào trực tiếp từ các tập tin trong/dev/input. Đây là cách đơn giản nhất để làm điều đó và bạn không cần thêm bất kỳ phần mềm nào.

Các vấn đề liên quan