使用EVIOCSMASK过滤键码

时间:2018-07-14 18:49:33

标签: c linux ioctl

EV_KEY文件中读取文件时,我只希望接收224事件,代码为225/dev/input/event*。我该怎么办?


据我所知,我需要运行ioctl(fd, EVIOCSMASK, &mask),但我不知道如何根据自己的规范设置struct input_mask

我尝试将type设置为EV_KEY,但这似乎过滤了 EV_KEY,并且如果我在codes_*中设置了任何内容(例如作为代码数组和指向它的指针),则ioctl返回-1

2 个答案:

答案 0 :(得分:1)

以下是设置遮罩的示例

    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的事件

答案 1 :(得分:1)

include/linux/input.h

  

事件掩码是每个客户端的掩码,用于指定哪些事件是   转发给客户。每个事件代码用一个位表示   在事件蒙版中。如果该位置1,则事件被传递给客户端   通常。

换句话说:

FragmentManager fm = getSupportFragmentManager();
switch (item.getItemId()) {
    case R.id.menuitemdashboard:
        fm.beginTransaction().replace(R.id.viewContainer, new dashboard()).commit();
        break;
    case R.id.menuitemlogout:
        //TODO replace logout with fragment
        fm.beginTransaction().replace(R.id.viewContainer, //*log out*/).commit();
        break;
    case R.id.menuitemprofile:
        //TODO replace profile with fragment
        fm.beginTransaction().replace(R.id.viewContainer, //*profile*/).commit();
        break;
    case R.id.menuitemreports:
        //TODO replace reports with fragment
        fm.beginTransaction().replace(R.id.viewContainer, //*reports*/).commit();
        break;
    case R.id.menuitemvisits:
        fmbeginTransaction().replace(R.id.viewContainer, new visits()).commit();
        break;
}