研究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. ng 表单提交验证

    http://www.runoob.com/try/try.php?filename=try_ng_validate

  2. 基础总结篇之二:Activity的四种launchMode (转载)

    转自:http://blog.csdn.net/liuhe688/article/details/6754323 合抱之木,生於毫末:九層之台,起於累土:千里之行,始於足下.<老子> 今天 ...

  3. Ruby基本语法

    更新: 2017/06/09 更新: 2017/06/20 cattr_accessor定义类变量,相当于@@ 更新: 2017/06/23 生成类的实例 更新: 2017/06/24 补充loop的 ...

  4. FrameLayout 的使用方法

    一.FrameLayout介绍 FrameLayout帧布局是最简单的布局之一,采用帧布局的容器中无论放入多少个控件,控件默认情况下左上角都对齐到容器的左上角,如果控件一样大,同一时间只能见到最上面的 ...

  5. poj 2774 Long Long Message【SA】

    把两个串接到一起求一个SA,然后找最大的sa[i]和sa[i-1]不是一个串的he[i] #include<iostream> #include<cstdio> #includ ...

  6. Jquery Validate不是用submit按钮提交表单,使用a标签js代码都可以

    不多说,上代码. $("#form").validate(); $("#btn").click(function() { if($("#form&qu ...

  7. 组合数学1.4&3.10 By cellur925

    本文引用于清华大学出版社卢开澄.卢华明<组合数学第五版>. 今天我们稍微讨论下圆排列以及$n$对夫妻的问题. 1.4圆周排列 这个问题是:从$n$个人中取$r$个在圆周上,我们用$Q(n, ...

  8. php 中的引用(&)与foreach结合后的一个注意点

    关于php中引用的概念及foreach循环的的应用就不多说了,php文档已经说的很明白了.直接上一段代码: <?php $arr = array(1,2, 3); foreach($arr as ...

  9. 跟我一起玩Win32开发(18):使用对话框的两个技巧

    相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理.今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写 ...

  10. 跟我一起玩Win32开发(4):创建菜单

    也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...