研究SPICE,找到了他们官方指定的HTML5客户端。
下载下来用一下,发现跟网页VNC的水平差不多了。
http://www.spice-space.org/page/Html5

服务端直接用QEMU起了一个WINDOWS XP,设定SPICE、再启动一个websockify。
但是一连上就发现鼠标不正常,反映总比实际的距离短。

于是看了下源码,鼠标支持两种模式:
模式1是客户端向服务器发出消息,告诉他鼠标移动了多少。
模式2是客户端向服务器发出消息,告诉他鼠标的具体位置。

追踪了一个,发现SPICE-HTML5最终和QEMU协商为模式1,然后打开inputs.js,发现这么一段代码。
0123456789101112131415161718192021

if (this.sc.mouse_mode == SPICE_MOUSE_MODE_CLIENT)
{
    move = new SpiceMsgcMousePosition(this.sc, e)
    msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_POSITION, move);
}
else
{
    move = new SpiceMsgcMouseMotion(this.sc, e)
    msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_MOTION, move);
}
if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready")
{
    if (this.sc.inputs.waiting_for_ack < (2 * SPICE_INPUT_MOTION_ACK_BUNCH))
    {
        this.sc.inputs.send_msg(msg);
        this.sc.inputs.waiting_for_ack++;
    }
    else
    {
        DEBUG > 0 && this.sc.log_info("Discarding mouse motion");
    }
}

基本可以确定就是无论模式一还是模式2,都先生成消息,然后再发给服务器。
但是在发送之前有个检测
01234

if (this.sc.inputs.waiting_for_ack < (2 * SPICE_INPUT_MOTION_ACK_BUNCH))
{
    this.sc.inputs.send_msg(msg);
    this.sc.inputs.waiting_for_ack++;
}

貌似是“如果还在等待反馈(阈值之前),就先不发送”。
没仔细看SpiceMsgcMouseMotion,但是我做个VNC的网页客户端,做一个队列来缓存事件是常有的,如果不做队列,那么必须要记录下上一次发送消息时的状态。因此我猜测这个地方很有可能在SpiceMsgcMouseMotion里面有个状态记录上一次鼠标状态,如果这个消息被丢弃,那么就会丢弃一个鼠标移动事件。
代码整体改写如下:
0123456789101112131415161718192021

if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready")
{
    if (this.sc.inputs.waiting_for_ack < (2 * SPICE_INPUT_MOTION_ACK_BUNCH))
    {
        if (this.sc.mouse_mode == SPICE_MOUSE_MODE_CLIENT)
        {
            move = new SpiceMsgcMousePosition(this.sc, e)
            msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_POSITION, move);
        }
        else
        {
            move = new SpiceMsgcMouseMotion(this.sc, e)
            msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_MOTION, move);
        }
        this.sc.inputs.send_msg(msg);
        this.sc.inputs.waiting_for_ack++;
    }
    else
    {
        DEBUG > 0 && this.sc.log_info("Discarding mouse motion");
    }
}

试了一下,完美运行。。。

SPICE-HTML5 鼠标指针BUG修复的更多相关文章

  1. Mac更换鼠标指针样式_ANI、CUR文件解析

    前情提要 因为之前写了一篇mousecape的博客有一些回应,所以我决定写个续.主要是教大家怎么把cur文件和ani文件插入到mousecape里面,顺便提供几个做好的cape文件. 先给大家推荐一个 ...

  2. Mac更换鼠标指针样式_mousecape教程

    mousecape项目介绍 这是github上的一个项目,作者是alexzielenski. 项目是用于修改Mac系统鼠标样式的,支持动态鼠标样式. 该项目停止更新于2014年,目前仍可以被较新的系统 ...

  3. cursor CSS属性定义鼠标指针悬浮在元素上时的外观。

    1 1 cursor CSS属性定义鼠标指针悬浮在元素上时的外观. https://developer.mozilla.org/zh-CN/docs/Web/CSS/cursor 概述 cursor  ...

  4. CSS/HTML 改变鼠标指针形状

    改变鼠标指针形状的方法有两种:第一种:用的来改变鼠标指针形状.另一种是:利用第三方控件的方法,而我自己最常用的是第一种:用css样式表来改变鼠标指针形状 我们先来看第一种:用来改变鼠标指针形状. 有些 ...

  5. HTML5鼠标hover的时候图片放大的效果展示

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. [ActionScript 3.0] AS3.0 本机鼠标指针

    Flash Player 10.2添加了内置的本机鼠标指针(native mouse cursor)支持,虽然在之前的版本里我们可以侦听MouseEvent事件来模拟鼠标指针,但是在有了原生的本机鼠标 ...

  7. esriControlsMousePointer 控制鼠标指针

    axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass; 控制鼠标指针选项. 不变 值 描述 esriPo ...

  8. 仿酷狗音乐播放器开发日志十九——CTreeNodeUI的bug修复二(附源码)

    转载请说明原出处,谢谢 今天本来打算把仿酷狗播放列表的子控件拖动插入功能做一下,但是仔细使用播放列表控件时发现了几个逻辑错误,由于我的播放 列表控件是基于CTreeViewUI和CTreeNodeUI ...

  9. C# 设置鼠标指针

    鼠标光标指针的使用 #region 设置鼠标指针 //设置鼠标指针 //Cursor cus = new Cursor(@"C:\Users\Public\Pictures\Sample P ...

随机推荐

  1. Viewpager animation duration setting

    private void animatePagerTransition(final boolean forward) { ValueAnimator animator = ValueAnimator. ...

  2. JavaScript-Tool:wdtree

    ylbtech-JavaScript-Tool:wdtree 1.返回顶部 1. 插件描述:wdTree是一个轻量级jQuery插件用于创建一个带有嵌套Check Boxe的树形控件. wdTree是 ...

  3. 相对定位relative与绝对定位absolute

    relative:相对定位,并没有脱离原来文档流,依然在原来的位置上,可以通过设置left,top,来设置自己的偏移量,但是它依然占据自己原来的位置,偏移的位置会遮盖其他的元素 absolute:绝对 ...

  4. wcf中事务的操作

    using System; using System.ServiceModel; namespace Larryle.Wcf.ServiceContract.Transaction { [Servic ...

  5. ubuntu的NAT方式上网配置

    vm菜单栏虚拟机--->设置---->网络适配器---->勾选NAT方式 vi /etc/network/interfaces修改配置文件如下: auto loiface lo in ...

  6. 设置socket IP_TOS选项 (转载)

    转自:http://zhangjunxin520.blog.163.com/blog/static/305037032011721102857609/ 在IP头中,有一Type-of-Service字 ...

  7. Android App组件之ListFragment -- 说明和示例(转载)

    转自:http://www.cnblogs.com/skywang12345/p/3160260.html 1 ListFragement介绍 ListFragment继承于Fragment.因此它具 ...

  8. ORACLE PL/SQL 实例精解之第三章 PL/SQL中的SQL

    3.1 在PL/SQL中使用DML 在PL/SQL语块中,两种变量赋值a. := 初始化.b. select into语法,PL/SQL语块的声明部分被声明的变量,后期可以使用选择语句进行赋值. 3. ...

  9. EOJ3247:铁路修复计划

    传送门 题意 分析 这题用二分做就好啦,有点卡常数,改了几下for的次数 套了个板子,连最小生成树都忘记了QAQ trick 代码 #include<cstdio> #include< ...

  10. bzoj 5495: [2019省队联测]异或粽子【可持久化trie+大根堆】

    和bzoj4504差不多,就是换了个数据结构 像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么 ...