代码之家  ›  专栏  ›  技术社区  ›  rid

用eviocsmask过滤密钥码

  •  0
  • rid  · 技术社区  · 6 年前

    我只想收到 EV_KEY 带代码的事件 224 225 当从一个 /dev/input/event* 文件我该怎么做?


    据我所知,我需要跑 ioctl(fd, EVIOCSMASK, &mask) ,但我不知道如何设置 struct input_mask 按照我的规格。

    我试着设置 type 电子钥匙 ,但这似乎会过滤掉 外面的 电子钥匙 ,如果我放了什么东西 codes_* (例如一个代码数组和指向它的指针),然后 ioctl 回报 -1 是的。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nominal Animal    6 年前

    看看 include/linux/input.h 以下内容:

    事件掩码是每个客户端的掩码,它指定哪些事件是 转发给客户。每个事件代码都由一个位表示 在事件掩码中。如果设置了位,则将事件传递给客户端 正常情况下。

    换句话说:

    #include <stdlib.h>
    #include <limits.h>
    #include <sys/ioctl.h>
    #include <linux/input.h>
    #include <errno.h>
    
    #define  ULONG_BITS  (CHAR_BIT * sizeof (unsigned long))
    
    static void set_bit(unsigned long bits[], size_t bit)
    {
        bits[bit / ULONG_BITS] |= 1UL << (bit % ULONG_BITS);
    }
    
    static void set_keymask(int fd)
    {
        unsigned long      bits[(KEY_CNT + ULONG_BITS - 1) / ULONG_BITS] = { 0 };
        struct input_mask  mask;
    
        mask.type = EV_KEY;
        mask.codes_size = KEY_CNT;
        mask.codes_ptr = &bits;
    
        /* Only report KEY_BRIGHTNESSDOWN and KEY_BRIGHTNESSUP */
        set_bit(bits, KEY_BRIGHTNESSDOWN);
        set_bit(bits, KEY_BRIGHTNESSUP);
    
        if (ioctl(fd, EVIOSMASK, &mask))
            return errno;
    
        return 0;
    }
    
        2
  •  1
  •   amine.ahd    6 年前

    下面是一个如何设置掩码的示例

        struct input_mask mask;
    
        bitset_put(types, KEY_BRIGHTNESSDOWN); // event ID 224
        bitset_put(types, KEY_BRIGHTNESSUP); // event ID 225
    
        mask = (struct input_mask) {
                .type = EV_KEY,
                .codes_size = sizeof(types),
                .codes_ptr = PTR_TO_UINT64(types),
        };
    
        if (ioctl(b->fd, EVIOCSMASK, &mask) < 0)
        {
          //log the error here and check errno to get a nice description about the error
        }...
    

    正如您所看到的,代码很容易理解,您可以声明要接收的事件类型(这里是ev-key),然后声明一个数组来过滤可以获得的事件 here