2017-02-15 16 views
0

Я пытаюсь прочитать события мыши от /dev/input/mice файл. Я могу разобрать 3-байтовый ввод мыши для получения трех состояний кнопок и приращений в координатах X и Y. Тем не менее, ввод мыши при прокрутке вверх идентичен тому, когда я прокручиваю вниз. Как отличить событие прокрутки от события прокрутки вниз? Есть ли какие-либо ioctls, которые могут выполнять любую необходимую конфигурацию, чтобы я получал разные входы от мыши на эти два события?Как получить событие колеса прокрутки мыши в c

Следующая простая программа для просмотра ввода с мыши при возникновении события мыши. Прокрутка вверх и прокрутка вниз приводит к тому, что эта программа выводит один и тот же результат (а именно, 8 0 0).

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdbool.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <errno.h> 

int main(void) { 

    int mouse_fd = open("/dev/input/mice", O_RDONLY | O_NONBLOCK); 
    signed char input[4]; 
    ssize_t rd_cnt; 

    if(mouse_fd < 0) 
    { 
     perror("Could not open /dev/input/mice"); 
     exit(EXIT_FAILURE); 
    } 

    while(true) 
    { 
     errno = 0; 
     rd_cnt = read(mouse_fd, input, 4); 
     if(rd_cnt <= 0 && errno != EAGAIN) 
     { 
      perror("Mouse read error:"); 
      exit(EXIT_FAILURE); 
     } 
     else 
     { 
      for(int i = 0; i < rd_cnt; i++) 
      { 
       printf("%d", input[i]); 
       if(i == rd_cnt - 1) 
       { 
        printf("\n"); 
       } 
       else 
       { 
        printf("\t"); 
       } 
      } 
     } 
    } 

    return 0; 
} 
+0

Есть ли у нас что-то вроде * libinput *? Одним из примеров является библиотека для X, которая делает все это. Вы можете изучить его источники. – 0andriy

+0

Вы думаете об использовании SDL2 для ввода мыши? –

+0

Недавно я узнал, что то, что я искал, - это использование входной подсистемы для получения событий мыши. Моя проблема решена. Спасибо вам за вашу помощь. –

ответ

0

Альтернативой будет использование SDL2.

Мне удалось собрать пример чтения входов мыши с помощью SDL, поэтому возьмите то, что вам нравится.

#include <SDL2/SDL.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdbool.h> 


char* itoa(int i, char b[]){ 
    char const digit[] = ""; 
    char* p = b; 
    if(i<0){ 
     *p++ = '-'; 
     i *= -1; 
    } 
    int shifter = i; 
    do{ //Move to where representation ends 
     ++p; 
     shifter = shifter/10; 
    }while(shifter); 
    *p = '\0'; 
    do{ //Move back, inserting digits as u go 
     *--p = digit[i%10]; 
     i = i/10; 
    }while(i); 
    return b; 
} 

int main() 
{ 
    //initialize the window 
    bool quit = false; 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_Window* window = SDL_CreateWindow("Mouse Events", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); 
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); 

    // the event that will occur when a mouse event happens 
    SDL_Event event; 
    while(!quit) 
    { 

     while (SDL_PollEvent(&event)) //returns one is there is a pending event (if an event happens) 
     { 
      switch(event.type) 
      { 
       case SDL_QUIT: //if the window is exited 
        quit = true; 
        break; 

       case SDL_MOUSEBUTTONDOWN: 
        switch (event.button.button) 
        { 
         case SDL_BUTTON_LEFT: 
          SDL_ShowSimpleMessageBox(0, "Click", "Left button was pressed!", window); 
          break; 
         case SDL_BUTTON_RIGHT: 
          SDL_ShowSimpleMessageBox(0, "Click", "Right button was pressed!", window); 
          break; 
        } 
        break; 
       case SDL_MOUSEWHEEL: 
        if(event.wheel.y == -1) //negative means the scroll wheel has gone away from the user 
        { 
         SDL_ShowSimpleMessageBox(0, "Wheel Event", "You rolled away from yourself!", window); 
        } else if (event.wheel.y == 1) //vice-versa 
        { 
         SDL_ShowSimpleMessageBox(0, "Wheel Event", "You rolled towards yourself!", window); 
        } 

      } 

     } 

     //do some SDL cleanup 
     SDL_Rect dstrect = { 288, 208, 64, 64 }; 

     SDL_RenderClear(renderer); 
     SDL_RenderPresent(renderer); 
    } 

} 

event.wheel типа можно найти здесь: https://wiki.libsdl.org/SDL_MouseWheelEvent

Надежда это какую-то пользу для вас!

Если вы не хотите использовать SDL2, возможно, стоит посмотреть в источнике библиотеки, чтобы увидеть, что он делает.