#input #mouse #keyboard #mapping #behavior #input-event

rebind

一个将输入键绑定到操作并修改鼠标行为的库。键可以绑定到操作,并在运行时进行转换。

8个版本

使用旧的Rust 2015

0.2.1 2016年4月3日
0.1.1 2015年11月24日
0.0.5 2015年10月29日
0.0.2 2015年9月30日

#1712硬件支持

MIT 协议

26KB
410

rebind

一个将输入键绑定到操作并修改鼠标行为的库。键可以绑定到操作,并在运行时进行转换。使用HashMapKeys映射到Actions,因此查找时间是常数。要在您的应用程序中使用此crate,只需在您的Cargo.toml中添加以下内容:

[dependencies]
rebind = "*"

API示例

extern crate glutin_window;
extern crate piston;
extern crate rebind;

use glutin_window::GlutinWindow;
use piston::event_loop::Events;
use piston::input::Event;
use piston::input::Button::Keyboard;
use piston::input::keyboard::Key;
use piston::window::WindowSettings;
use rebind::{Action, Builder, Translated};

#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)]
enum MyAction {
    Action1, Action2
}

impl Action for MyAction { }

fn main() {
    let window: GlutinWindow = WindowSettings::new("rebind-example", (800, 600))
        .build()
        .expect("Could not create window");

    let translator = Builder::<MyAction>::new((800, 600))
        .with_mapping(MyAction::Action1, Keyboard(Key::D1))
        .with_mapping(MyAction::Action1, Keyboard(Key::A))
        .with_mapping(MyAction::Action2, Keyboard(Key::D2))
        .with_mapping(MyAction::Action2, Keyboard(Key::B))
        .build_translator();

    for e in window.events() {
        if let Event::Input(ref i) = e {
            if let Some(a) = translator.translate(i) {
                match a {
                    Translated::Press(MyAction::Action1) => {
                        println!("Action 1 pressed!");
                    },
                    Translated::Press(MyAction::Action2) => {
                        println!("Action 2 pressed!");
                    },
                    _ => { }
                }
            }
        }
    }
}

自定义哈希器

当自定义哈希器稳定后,将能够指定用于从键查找操作的哈希算法。在此之前,哈希器无法通过构建器进行配置,默认使用SipHasher。但是,如果您使用的是nightly编译器,您可以在Cargo.toml中将Fnv哈希器作为选项启用。

[dependencies.rebind]
version = ">=0.3"
features = ["fnv"]

rebind_plugins

此库有一个名为rebind_plugins的配套crate。如果您使用的是nightly编译器,则可以使用此crate,它包含用于声明Action的特殊derive注解。

#![feature(plugin)]
#![plugin(rebind_macros)]

#[derive(Action)]
enum MyAction {
    Action1, Action2
}

// ... rest of example as normal

示例应用程序

一个展示主要功能(以及用于驱动此库设计决策的主要方法)的示例应用程序位于example/文件夹中。该示例基于稳定版本构建,尽管您可以通过传递--features "rebind_plugins"以及您通常使用的Cargo咒语来构建它以使用rebind_plugins包。

待改进的主要功能

  • 实现从InputTranslator到InputRebind的转换
  • 改进API:InputRebind和InputTranslator之间的区别是否必要或有用?
  • 添加序列化
  • 添加鼠标灵敏度选项
  • 添加更多测试/基准测试
  • 改进文档
  • 添加双击检测
  • 将内部查找从HashMap更改为数组,其中操作存储在对应于键的数值的数组位置。这应该比使用HashMap更快,并且碰撞/算法性DOS攻击不是问题,尽管映射的大小通常很小,查找相对较快,因此这可能在实践中不是问题。

欢迎贡献。

依赖项

~1MB
~20K SLoC