virt2slint

这个crate用于将virtio设备的规范转换为slint的规范。

virtio规范描述了输入事件的格式形式如下:

pub struct InputEvent {
    /// Event type.
    pub event_type: u16,
    /// Event code.
    pub code: u16,
    /// Event value.
    pub value: u32,
}

我们借助virtio-input-decoder crate 将内核传递的u64表示的InputEvent解析为对应的键盘或者鼠标事件。

核心的数据结构是Converter:

pub struct Converter {
    x_res:isize,
    y_res:isize,
    virtual_range:isize,
}

我们需要知道屏幕的分辨率,以及鼠标的移动范围,才能将鼠标的移动转换为屏幕的移动。对于virtio-tablet-device 设备,鼠标的移动会传递绝对坐标; 对于virtio-mouse-device设备,鼠标的移动会传递相对坐标。鉴于相对坐标的管理复杂度,我们目前只支持绝对坐标,也就是virtio-tablet-device设备。

对于qemu模拟器,鼠标输入事件的坐标单位并不是与屏幕的分辨率一致的,而是一个虚拟的坐标范围,我们需要将其转换为屏幕的坐标范围。通常,这个 虚拟的坐标范围是[0, 32767],对于横坐标/纵坐标都是这样。因此简单的转换格式是:

screencoordx = (x_res * virtio_x) / virtual_range
screencoordy = (y_res * virtio_y) / virtual_range

Usage:

use virt2slint::Converter;
let converter = Converter::new(32767,1200,800);
let mut x = 0;
let mut y = 0;
let event = converter.convert(0x0,&mut x,&mut y).unwrap();