[Spice-devel] (resend)[spice-html5] prevent out of sync modifier keys
Alon Levy
alevy at redhat.com
Fri Aug 17 03:55:57 PDT 2012
On Thu, Aug 16, 2012 at 02:09:04PM -0500, Aric Stewart wrote:
Thanks, pushed all three.
For the future, you can create a patch series with git format-patch,
then I could save the whole thread in one keystroke.
> Signed-off-by: Aric Stewart <aric at codeweavers.com>
> ---
> inputs.js | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 86 insertions(+), 0 deletions(-)
>
> diff --git a/inputs.js b/inputs.js
> index ce1d15e..57ee626 100644
> --- a/inputs.js
> +++ b/inputs.js
> @@ -18,6 +18,15 @@
> along with spice-html5. If not, see <http://www.gnu.org/licenses/>.
> */
>
> +/*----------------------------------------------------------------------------
> + ** Modifier Keystates
> + ** These need to be tracked because focus in and out can get the keyboard
> + ** out of sync.
> + **------------------------------------------------------------------------*/
> +var Shift_state = -1;
> +var Ctrl_state = -1;
> +var Alt_state = -1;
> +var Meta_state = -1;
>
> /*----------------------------------------------------------------------------
> ** SpiceInputsConn
> @@ -146,6 +155,7 @@ function handle_keydown(e)
> {
> var key = new SpiceMsgcKeyDown(e)
> var msg = new SpiceMiniData();
> + check_and_update_modifiers(e, key.code, this.sc);
> msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
> if (this.sc && this.sc.inputs)
> this.sc.inputs.send_msg(msg);
> @@ -157,9 +167,85 @@ function handle_keyup(e)
> {
> var key = new SpiceMsgcKeyUp(e)
> var msg = new SpiceMiniData();
> + check_and_update_modifiers(e, key.code, this.sc);
> msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
> if (this.sc && this.sc.inputs)
> this.sc.inputs.send_msg(msg);
>
> e.preventDefault();
> }
> +
> +function update_modifier(state, code, sc)
> +{
> + var msg = new SpiceMiniData();
> + if (!state)
> + {
> + var key = new SpiceMsgcKeyUp()
> + key.code =(0x80|code);
> + msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
> + }
> + else
> + {
> + var key = new SpiceMsgcKeyDown()
> + key.code = code;
> + msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
> + }
> +
> + sc.inputs.send_msg(msg);
> +}
> +
> +function check_and_update_modifiers(e, code, sc)
> +{
> + if (Shift_state === -1)
> + {
> + Shift_state = e.shiftKey;
> + Ctrl_state = e.ctrlKey;
> + Alt_state = e.altKey;
> + Meta_state = e.metaKey;
> + }
> +
> + if (code === KEY_ShiftL)
> + Shift_state = true;
> + else if (code === KEY_Alt)
> + Alt_state = true;
> + else if (code === KEY_LCtrl)
> + Ctrl_state = true;
> + else if (code === 0xE0B5)
> + Meta_state = true;
> + else if (code === (0x80|KEY_ShiftL))
> + Shift_state = false;
> + else if (code === (0x80|KEY_Alt))
> + Alt_state = false;
> + else if (code === (0x80|KEY_LCtrl))
> + Ctrl_state = false;
> + else if (code === (0x80|0xE0B5))
> + Meta_state = false;
> +
> + if (sc && sc.inputs)
> + {
> + if (Shift_state != e.shiftKey)
> + {
> + console.log("Shift state out of sync");
> + update_modifier(e.shiftKey, KEY_ShiftL, sc);
> + Shift_state = e.shiftKey;
> + }
> + if (Alt_state != e.altKey)
> + {
> + console.log("Alt state out of sync");
> + update_modifier(e.altKey, KEY_Alt, sc);
> + Alt_state = e.altKey;
> + }
> + if (Ctrl_state != e.ctrlKey)
> + {
> + console.log("Ctrl state out of sync");
> + update_modifier(e.ctrlKey, KEY_LCtrl, sc);
> + Ctrl_state = e.ctrlKey;
> + }
> + if (Meta_state != e.metaKey)
> + {
> + console.log("Meta state out of sync");
> + update_modifier(e.metaKey, 0xE0B5, sc);
> + Meta_state = e.metaKey;
> + }
> + }
> +}
> --
> 1.7.7.5 (Apple Git-26)
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list