1

Тема: Робота з пристроєм введення (С )

Всім привіт. Пишу код на C який працює з пристроєм введення а саме з клавіатурою.
Залишилось доробити деякі фішки і от не знаю як, можливо хтось підкаже.

Що є готово:
Запускаємо програму з параметром l - отримуємо вивід всіх доступних пристроїв
Ось у мене наступний вивід:
http://i.imgur.com/lJtzL2A.png

Прихований текст

06    Power Button
07    Power Button
09    Sennheiser Communications  Sennheiser USB headset
11    SIGMACHIP USB Keyboard
12    SIGMACHIP USB Keyboard
10    Dell Dell USB Entry Keyboard

Отримую це за допомогою коду

Прихований текст
int list_devices()
{
  int idx;
  int i;
  int num_devices;
  
  
  
  XInputClassInfo *ip;
  
  Display *display = XOpenDisplay(NULL);
   
  
  if(display == NULL) {
   fprintf(stderr, "Could not connect to X server\n");
   return RESULT_FAILURE_OPEN_DISPLAY;
  }

  XDeviceInfo *devices = XListInputDevices(display, &num_devices);
  
  Atom xi_keyboard = XInternAtom(display, XI_KEYBOARD, 0);

  Atom *props;
  Atom prop;
  int ndevs = 0;
  int nprops = 0;
  
  XDeviceInfo *info = XListInputDevices(display, &ndevs);
  XDevice *device;
  for(idx=0;idx<num_devices;++idx) {
    
    if (xi_keyboard  != devices[idx].type) {
      continue;
    }
      
    printf("%02d\t%s\n", (int)devices[idx].id, (char *)devices[idx].name);
                
    device = XOpenDevice(display,  devices[idx].id);     
    if(!device) {
      XFreeDeviceList(info);
      printf("syntog: cannot open device '%s'\n",  devices[idx].name);
      continue;
    }
 
    props = XListDeviceProperties(display, device, &nprops);
    if(!props || !nprops) {
      XCloseDevice(display, device);
      XFree(props);
      XFreeDeviceList(info);
      printf("syntog: no properties on device '%s'\n", info[ndevs].name);
    }
    
    while(nprops--) {
      if(props[nprops] == prop){
        break;
      }
    }
    
    if(!nprops) {
      XCloseDevice(display, device);
      XFree(props);
      XFreeDeviceList(info);
      printf("syntog: no synaptics properties on device '%s'\n", info[ndevs].name);
    }
          
  }
  
  return 0     ;
}

А ось дальше у мене проблема. Необхідно визначити файл до якого прикріплена ця клавіатура. Тобто eventX
Для прикладу вивід пристроїв http://i.imgur.com/qLWYorT.png
І я ніяк не можу зрозуміти як отримати шлях до файлу через ID або через name або ще якусь іншу property мого пристрою. Надіюсь пояснив доступно. Буду радий за допомогу)

2

Re: Робота з пристроєм введення (С )

Я гадаю, що ви розумієте як це переробити під ваші потреби:
grep -E 'Handlers|EV=' /proc/bus/input/devices | grep -B1 'EV=120013' | grep -Eo 'event[0-9]+'
Клавіатурного шпигуна пишете? :D

3

Re: Робота з пристроєм введення (С )

Я гадаю, що ви розумієте як це переробити під ваші потреби:
grep -E 'Handlers|EV=' /proc/bus/input/devices | grep -B1 'EV=120013' | grep -Eo 'event[0-9]+'
Клавіатурного шпигуна пишете? :D

На баш я шарю як зробити але от хочу чисто на C по нормальному 6)

Ось мій скріпт який робить додаткові ф-ції які хочу реалізувати

 DEVICE=/dev/input/by-id/usb-Dell_Dell_USB_Entry_Keyboard-event-kbd
REGEXP="Dell"
ID=`xinput | grep "$REGEXP" | grep -oP "id=\d+" | grep -oP "\d+"`
if [ -z "$ID" ] ; then
echo "Can\`t detect device id";
exit 1;
fi
xinput disable "$ID"
make
./out/program -d $DEVICE -c keyboard.conf

Жорстко задав шлях, але це не фонтан.

На рахунок шпигуна можливо ви і праві, але я пишу для себе і для добра а не зла :)

4

Re: Робота з пристроєм введення (С )

На баш я шарю як зробити але от хочу чисто на C по нормальному

Питання не в bash, а в тому, що потрібна вам інформація знаходиться в файлі /proc/bus/input/devices, а як ви з нього видобуватимете потрібні вам дані (регулярними виразами чи стандартною бібліотекою) то вже ваше діло.

5

Re: Робота з пристроєм введення (С )

Як то кажуть поки не напишеш на форумі - сам не зрозумієш))
Дана тема вирішилась шляхом отримання Властивості девайса. Ось псевдокод

// відкриваємо девайс
 device = XOpenDevice(display,  devices[idx].id);

// вказуємо яку властивість ми хочемо витягувати У нашому випадку це  "Device Node"
  prop = XInternAtom (display, "Device Node", False);

// отримуємо 
    XIGetProperty(display, devices[idx].id, prop, 0, 1000, False, AnyPropertyType, &act_type, &act_format, &nitems, &bytes_after, &data);

// виводимо
  printf("%02d\t%s\t%s\n", (int)devices[idx].id, (char *)devices[idx].name, data);

Ось фото результату. http://i.imgur.com/JsHNRFY.png
На даному етапі тема вичерпана)

Подякували: 0xDADA11C71