spice-html5-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. data/COPYING +674 -0
  2. data/COPYING.LESSER +165 -0
  3. data/LICENSE.txt +15 -0
  4. data/README.md +35 -0
  5. data/lib/spice-html5-rails/version.rb +7 -0
  6. data/lib/spice-html5-rails.rb +10 -0
  7. data/vendor/assets/javascripts/spice-html5.js +25 -0
  8. data/vendor/assets/javascripts/spiceHTML5/atKeynames.js +183 -0
  9. data/vendor/assets/javascripts/spiceHTML5/bitmap.js +51 -0
  10. data/vendor/assets/javascripts/spiceHTML5/cursor.js +92 -0
  11. data/vendor/assets/javascripts/spiceHTML5/display.js +806 -0
  12. data/vendor/assets/javascripts/spiceHTML5/enums.js +282 -0
  13. data/vendor/assets/javascripts/spiceHTML5/inputs.js +271 -0
  14. data/vendor/assets/javascripts/spiceHTML5/lz.js +166 -0
  15. data/vendor/assets/javascripts/spiceHTML5/main.js +177 -0
  16. data/vendor/assets/javascripts/spiceHTML5/png.js +256 -0
  17. data/vendor/assets/javascripts/spiceHTML5/quic.js +1335 -0
  18. data/vendor/assets/javascripts/spiceHTML5/spiceconn.js +455 -0
  19. data/vendor/assets/javascripts/spiceHTML5/spicedataview.js +96 -0
  20. data/vendor/assets/javascripts/spiceHTML5/spicemsg.js +883 -0
  21. data/vendor/assets/javascripts/spiceHTML5/spicetype.js +480 -0
  22. data/vendor/assets/javascripts/spiceHTML5/thirdparty/jsbn.js +589 -0
  23. data/vendor/assets/javascripts/spiceHTML5/thirdparty/prng4.js +79 -0
  24. data/vendor/assets/javascripts/spiceHTML5/thirdparty/rng.js +102 -0
  25. data/vendor/assets/javascripts/spiceHTML5/thirdparty/rsa.js +146 -0
  26. data/vendor/assets/javascripts/spiceHTML5/thirdparty/sha1.js +346 -0
  27. data/vendor/assets/javascripts/spiceHTML5/ticket.js +250 -0
  28. data/vendor/assets/javascripts/spiceHTML5/utils.js +261 -0
  29. data/vendor/assets/javascripts/spiceHTML5/wire.js +123 -0
  30. metadata +108 -0
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>
4
+
5
+ This file is part of spice-html5.
6
+
7
+ spice-html5 is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU Lesser General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ spice-html5 is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public License
18
+ along with spice-html5. If not, see <http://www.gnu.org/licenses/>.
19
+ */
20
+
21
+
22
+ /*----------------------------------------------------------------------------
23
+ ** enums.js
24
+ ** 'constants' for Spice
25
+ **--------------------------------------------------------------------------*/
26
+ var SPICE_MAGIC = "REDQ";
27
+ var SPICE_VERSION_MAJOR = 2;
28
+ var SPICE_VERSION_MINOR = 2;
29
+
30
+ var SPICE_CONNECT_TIMEOUT = (30 * 1000);
31
+
32
+ var SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION = 0;
33
+ var SPICE_COMMON_CAP_AUTH_SPICE = 1;
34
+ var SPICE_COMMON_CAP_AUTH_SASL = 2;
35
+ var SPICE_COMMON_CAP_MINI_HEADER = 3;
36
+
37
+ var SPICE_TICKET_KEY_PAIR_LENGTH = 1024;
38
+ var SPICE_TICKET_PUBKEY_BYTES = (SPICE_TICKET_KEY_PAIR_LENGTH / 8 + 34);
39
+
40
+ var SPICE_LINK_ERR_OK = 0,
41
+ SPICE_LINK_ERR_ERROR = 1,
42
+ SPICE_LINK_ERR_INVALID_MAGIC = 2,
43
+ SPICE_LINK_ERR_INVALID_DATA = 3,
44
+ SPICE_LINK_ERR_VERSION_MISMATCH = 4,
45
+ SPICE_LINK_ERR_NEED_SECURED = 5,
46
+ SPICE_LINK_ERR_NEED_UNSECURED = 6,
47
+ SPICE_LINK_ERR_PERMISSION_DENIED = 7,
48
+ SPICE_LINK_ERR_BAD_CONNECTION_ID = 8,
49
+ SPICE_LINK_ERR_CHANNEL_NOT_AVAILABLE = 9;
50
+
51
+ var SPICE_MSG_MIGRATE = 1;
52
+ var SPICE_MSG_MIGRATE_DATA = 2;
53
+ var SPICE_MSG_SET_ACK = 3;
54
+ var SPICE_MSG_PING = 4;
55
+ var SPICE_MSG_WAIT_FOR_CHANNELS = 5;
56
+ var SPICE_MSG_DISCONNECTING = 6;
57
+ var SPICE_MSG_NOTIFY = 7;
58
+ var SPICE_MSG_LIST = 8;
59
+
60
+ var SPICE_MSG_MAIN_MIGRATE_BEGIN = 101;
61
+ var SPICE_MSG_MAIN_MIGRATE_CANCEL = 102;
62
+ var SPICE_MSG_MAIN_INIT = 103;
63
+ var SPICE_MSG_MAIN_CHANNELS_LIST = 104;
64
+ var SPICE_MSG_MAIN_MOUSE_MODE = 105;
65
+ var SPICE_MSG_MAIN_MULTI_MEDIA_TIME = 106;
66
+ var SPICE_MSG_MAIN_AGENT_CONNECTED = 107;
67
+ var SPICE_MSG_MAIN_AGENT_DISCONNECTED = 108;
68
+ var SPICE_MSG_MAIN_AGENT_DATA = 109;
69
+ var SPICE_MSG_MAIN_AGENT_TOKEN = 110;
70
+ var SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST = 111;
71
+ var SPICE_MSG_MAIN_MIGRATE_END = 112;
72
+ var SPICE_MSG_MAIN_NAME = 113;
73
+ var SPICE_MSG_MAIN_UUID = 114;
74
+ var SPICE_MSG_END_MAIN = 115;
75
+
76
+
77
+ var SPICE_MSGC_ACK_SYNC = 1;
78
+ var SPICE_MSGC_ACK = 2;
79
+ var SPICE_MSGC_PONG = 3;
80
+ var SPICE_MSGC_MIGRATE_FLUSH_MARK = 4;
81
+ var SPICE_MSGC_MIGRATE_DATA = 5;
82
+ var SPICE_MSGC_DISCONNECTING = 6;
83
+
84
+
85
+ var SPICE_MSGC_MAIN_CLIENT_INFO = 101;
86
+ var SPICE_MSGC_MAIN_MIGRATE_CONNECTED = 102;
87
+ var SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR = 103;
88
+ var SPICE_MSGC_MAIN_ATTACH_CHANNELS = 104;
89
+ var SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST = 105;
90
+ var SPICE_MSGC_MAIN_AGENT_START = 106;
91
+ var SPICE_MSGC_MAIN_AGENT_DATA = 107;
92
+ var SPICE_MSGC_MAIN_AGENT_TOKEN = 108;
93
+ var SPICE_MSGC_MAIN_MIGRATE_END = 109;
94
+ var SPICE_MSGC_END_MAIN = 110;
95
+
96
+ var SPICE_MSG_DISPLAY_MODE = 101;
97
+ var SPICE_MSG_DISPLAY_MARK = 102;
98
+ var SPICE_MSG_DISPLAY_RESET = 103;
99
+ var SPICE_MSG_DISPLAY_COPY_BITS = 104;
100
+ var SPICE_MSG_DISPLAY_INVAL_LIST = 105;
101
+ var SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS = 106;
102
+ var SPICE_MSG_DISPLAY_INVAL_PALETTE = 107;
103
+ var SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES= 108;
104
+
105
+ var SPICE_MSG_DISPLAY_STREAM_CREATE = 122;
106
+ var SPICE_MSG_DISPLAY_STREAM_DATA = 123;
107
+ var SPICE_MSG_DISPLAY_STREAM_CLIP = 124;
108
+ var SPICE_MSG_DISPLAY_STREAM_DESTROY = 125;
109
+ var SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL= 126;
110
+
111
+ var SPICE_MSG_DISPLAY_DRAW_FILL = 302;
112
+ var SPICE_MSG_DISPLAY_DRAW_OPAQUE = 303;
113
+ var SPICE_MSG_DISPLAY_DRAW_COPY = 304;
114
+ var SPICE_MSG_DISPLAY_DRAW_BLEND = 305;
115
+ var SPICE_MSG_DISPLAY_DRAW_BLACKNESS = 306;
116
+ var SPICE_MSG_DISPLAY_DRAW_WHITENESS = 307;
117
+ var SPICE_MSG_DISPLAY_DRAW_INVERS = 308;
118
+ var SPICE_MSG_DISPLAY_DRAW_ROP3 = 309;
119
+ var SPICE_MSG_DISPLAY_DRAW_STROKE = 310;
120
+ var SPICE_MSG_DISPLAY_DRAW_TEXT = 311;
121
+ var SPICE_MSG_DISPLAY_DRAW_TRANSPARENT = 312;
122
+ var SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND = 313;
123
+ var SPICE_MSG_DISPLAY_SURFACE_CREATE = 314;
124
+ var SPICE_MSG_DISPLAY_SURFACE_DESTROY = 315;
125
+
126
+ var SPICE_MSGC_DISPLAY_INIT = 101;
127
+
128
+ var SPICE_MSG_INPUTS_INIT = 101;
129
+ var SPICE_MSG_INPUTS_KEY_MODIFIERS = 102;
130
+
131
+ var SPICE_MSG_INPUTS_MOUSE_MOTION_ACK = 111;
132
+
133
+ var SPICE_MSGC_INPUTS_KEY_DOWN = 101;
134
+ var SPICE_MSGC_INPUTS_KEY_UP = 102;
135
+ var SPICE_MSGC_INPUTS_KEY_MODIFIERS = 103;
136
+
137
+ var SPICE_MSGC_INPUTS_MOUSE_MOTION = 111;
138
+ var SPICE_MSGC_INPUTS_MOUSE_POSITION = 112;
139
+ var SPICE_MSGC_INPUTS_MOUSE_PRESS = 113;
140
+ var SPICE_MSGC_INPUTS_MOUSE_RELEASE = 114;
141
+
142
+ var SPICE_MSG_CURSOR_INIT = 101;
143
+ var SPICE_MSG_CURSOR_RESET = 102;
144
+ var SPICE_MSG_CURSOR_SET = 103;
145
+ var SPICE_MSG_CURSOR_MOVE = 104;
146
+ var SPICE_MSG_CURSOR_HIDE = 105;
147
+ var SPICE_MSG_CURSOR_TRAIL = 106;
148
+ var SPICE_MSG_CURSOR_INVAL_ONE = 107;
149
+ var SPICE_MSG_CURSOR_INVAL_ALL = 108;
150
+
151
+
152
+ var SPICE_CHANNEL_MAIN = 1;
153
+ var SPICE_CHANNEL_DISPLAY = 2;
154
+ var SPICE_CHANNEL_INPUTS = 3;
155
+ var SPICE_CHANNEL_CURSOR = 4;
156
+ var SPICE_CHANNEL_PLAYBACK = 5;
157
+ var SPICE_CHANNEL_RECORD = 6;
158
+ var SPICE_CHANNEL_TUNNEL = 7;
159
+ var SPICE_CHANNEL_SMARTCARD = 8;
160
+ var SPICE_CHANNEL_USBREDIR = 9;
161
+
162
+ var SPICE_SURFACE_FLAGS_PRIMARY = (1 << 0);
163
+
164
+ var SPICE_NOTIFY_SEVERITY_INFO = 0;
165
+ var SPICE_NOTIFY_SEVERITY_WARN = 1;
166
+ var SPICE_NOTIFY_SEVERITY_ERROR = 2;
167
+
168
+ var SPICE_MOUSE_MODE_SERVER = (1 << 0),
169
+ SPICE_MOUSE_MODE_CLIENT = (1 << 1),
170
+ SPICE_MOUSE_MODE_MASK = 0x3;
171
+
172
+ var SPICE_CLIP_TYPE_NONE = 0;
173
+ var SPICE_CLIP_TYPE_RECTS = 1;
174
+
175
+ var SPICE_IMAGE_TYPE_BITMAP = 0;
176
+ var SPICE_IMAGE_TYPE_QUIC = 1;
177
+ var SPICE_IMAGE_TYPE_RESERVED = 2;
178
+ var SPICE_IMAGE_TYPE_LZ_PLT = 100;
179
+ var SPICE_IMAGE_TYPE_LZ_RGB = 101;
180
+ var SPICE_IMAGE_TYPE_GLZ_RGB = 102;
181
+ var SPICE_IMAGE_TYPE_FROM_CACHE = 103;
182
+ var SPICE_IMAGE_TYPE_SURFACE = 104;
183
+ var SPICE_IMAGE_TYPE_JPEG = 105;
184
+ var SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS = 106;
185
+ var SPICE_IMAGE_TYPE_ZLIB_GLZ_RGB = 107;
186
+ var SPICE_IMAGE_TYPE_JPEG_ALPHA = 108;
187
+
188
+ var SPICE_IMAGE_FLAGS_CACHE_ME = (1 << 0),
189
+ SPICE_IMAGE_FLAGS_HIGH_BITS_SET = (1 << 1),
190
+ SPICE_IMAGE_FLAGS_CACHE_REPLACE_ME = (1 << 2);
191
+
192
+ var SPICE_BITMAP_FLAGS_PAL_CACHE_ME = (1 << 0),
193
+ SPICE_BITMAP_FLAGS_PAL_FROM_CACHE = (1 << 1),
194
+ SPICE_BITMAP_FLAGS_TOP_DOWN = (1 << 2),
195
+ SPICE_BITMAP_FLAGS_MASK = 0x7;
196
+
197
+ var SPICE_BITMAP_FMT_INVALID = 0,
198
+ SPICE_BITMAP_FMT_1BIT_LE = 1,
199
+ SPICE_BITMAP_FMT_1BIT_BE = 2,
200
+ SPICE_BITMAP_FMT_4BIT_LE = 3,
201
+ SPICE_BITMAP_FMT_4BIT_BE = 4,
202
+ SPICE_BITMAP_FMT_8BIT = 5,
203
+ SPICE_BITMAP_FMT_16BIT = 6,
204
+ SPICE_BITMAP_FMT_24BIT = 7,
205
+ SPICE_BITMAP_FMT_32BIT = 8,
206
+ SPICE_BITMAP_FMT_RGBA = 9;
207
+
208
+
209
+ var SPICE_CURSOR_FLAGS_NONE = (1 << 0),
210
+ SPICE_CURSOR_FLAGS_CACHE_ME = (1 << 1),
211
+ SPICE_CURSOR_FLAGS_FROM_CACHE = (1 << 2),
212
+ SPICE_CURSOR_FLAGS_MASK = 0x7;
213
+
214
+ var SPICE_MOUSE_BUTTON_MASK_LEFT = (1 << 0),
215
+ SPICE_MOUSE_BUTTON_MASK_MIDDLE = (1 << 1),
216
+ SPICE_MOUSE_BUTTON_MASK_RIGHT = (1 << 2),
217
+ SPICE_MOUSE_BUTTON_MASK_MASK = 0x7;
218
+
219
+ var SPICE_MOUSE_BUTTON_INVALID = 0;
220
+ var SPICE_MOUSE_BUTTON_LEFT = 1;
221
+ var SPICE_MOUSE_BUTTON_MIDDLE = 2;
222
+ var SPICE_MOUSE_BUTTON_RIGHT = 3;
223
+ var SPICE_MOUSE_BUTTON_UP = 4;
224
+ var SPICE_MOUSE_BUTTON_DOWN = 5;
225
+
226
+ var SPICE_BRUSH_TYPE_NONE = 0,
227
+ SPICE_BRUSH_TYPE_SOLID = 1,
228
+ SPICE_BRUSH_TYPE_PATTERN = 2;
229
+
230
+ var SPICE_SURFACE_FMT_INVALID = 0,
231
+ SPICE_SURFACE_FMT_1_A = 1,
232
+ SPICE_SURFACE_FMT_8_A = 8,
233
+ SPICE_SURFACE_FMT_16_555 = 16,
234
+ SPICE_SURFACE_FMT_32_xRGB = 32,
235
+ SPICE_SURFACE_FMT_16_565 = 80,
236
+ SPICE_SURFACE_FMT_32_ARGB = 96;
237
+
238
+ var SPICE_ROPD_INVERS_SRC = (1 << 0),
239
+ SPICE_ROPD_INVERS_BRUSH = (1 << 1),
240
+ SPICE_ROPD_INVERS_DEST = (1 << 2),
241
+ SPICE_ROPD_OP_PUT = (1 << 3),
242
+ SPICE_ROPD_OP_OR = (1 << 4),
243
+ SPICE_ROPD_OP_AND = (1 << 5),
244
+ SPICE_ROPD_OP_XOR = (1 << 6),
245
+ SPICE_ROPD_OP_BLACKNESS = (1 << 7),
246
+ SPICE_ROPD_OP_WHITENESS = (1 << 8),
247
+ SPICE_ROPD_OP_INVERS = (1 << 9),
248
+ SPICE_ROPD_INVERS_RES = (1 << 10),
249
+ SPICE_ROPD_MASK = 0x7ff;
250
+
251
+ var LZ_IMAGE_TYPE_INVALID = 0,
252
+ LZ_IMAGE_TYPE_PLT1_LE = 1,
253
+ LZ_IMAGE_TYPE_PLT1_BE = 2, // PLT stands for palette
254
+ LZ_IMAGE_TYPE_PLT4_LE = 3,
255
+ LZ_IMAGE_TYPE_PLT4_BE = 4,
256
+ LZ_IMAGE_TYPE_PLT8 = 5,
257
+ LZ_IMAGE_TYPE_RGB16 = 6,
258
+ LZ_IMAGE_TYPE_RGB24 = 7,
259
+ LZ_IMAGE_TYPE_RGB32 = 8,
260
+ LZ_IMAGE_TYPE_RGBA = 9,
261
+ LZ_IMAGE_TYPE_XXXA = 10;
262
+
263
+
264
+ var QUIC_IMAGE_TYPE_INVALID = 0,
265
+ QUIC_IMAGE_TYPE_GRAY = 1,
266
+ QUIC_IMAGE_TYPE_RGB16 = 2,
267
+ QUIC_IMAGE_TYPE_RGB24 = 3,
268
+ QUIC_IMAGE_TYPE_RGB32 = 4,
269
+ QUIC_IMAGE_TYPE_RGBA = 5;
270
+
271
+ var SPICE_INPUT_MOTION_ACK_BUNCH = 4;
272
+
273
+
274
+ var SPICE_CURSOR_TYPE_ALPHA = 0,
275
+ SPICE_CURSOR_TYPE_MONO = 1,
276
+ SPICE_CURSOR_TYPE_COLOR4 = 2,
277
+ SPICE_CURSOR_TYPE_COLOR8 = 3,
278
+ SPICE_CURSOR_TYPE_COLOR16 = 4,
279
+ SPICE_CURSOR_TYPE_COLOR24 = 5,
280
+ SPICE_CURSOR_TYPE_COLOR32 = 6;
281
+
282
+ var SPICE_VIDEO_CODEC_TYPE_MJPEG = 1;
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>
4
+
5
+ This file is part of spice-html5.
6
+
7
+ spice-html5 is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU Lesser General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ spice-html5 is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public License
18
+ along with spice-html5. If not, see <http://www.gnu.org/licenses/>.
19
+ */
20
+
21
+ /*----------------------------------------------------------------------------
22
+ ** Modifier Keystates
23
+ ** These need to be tracked because focus in and out can get the keyboard
24
+ ** out of sync.
25
+ **------------------------------------------------------------------------*/
26
+ var Shift_state = -1;
27
+ var Ctrl_state = -1;
28
+ var Alt_state = -1;
29
+ var Meta_state = -1;
30
+
31
+ /*----------------------------------------------------------------------------
32
+ ** SpiceInputsConn
33
+ ** Drive the Spice Inputs channel (e.g. mouse + keyboard)
34
+ **--------------------------------------------------------------------------*/
35
+ function SpiceInputsConn()
36
+ {
37
+ SpiceConn.apply(this, arguments);
38
+
39
+ this.mousex = undefined;
40
+ this.mousey = undefined;
41
+ this.button_state = 0;
42
+ this.waiting_for_ack = 0;
43
+ }
44
+
45
+ SpiceInputsConn.prototype = Object.create(SpiceConn.prototype);
46
+ SpiceInputsConn.prototype.process_channel_message = function(msg)
47
+ {
48
+ if (msg.type == SPICE_MSG_INPUTS_INIT)
49
+ {
50
+ var inputs_init = new SpiceMsgInputsInit(msg.data);
51
+ this.keyboard_modifiers = inputs_init.keyboard_modifiers;
52
+ DEBUG > 1 && console.log("MsgInputsInit - modifier " + this.keyboard_modifiers);
53
+ // FIXME - We don't do anything with the keyboard modifiers...
54
+ return true;
55
+ }
56
+ if (msg.type == SPICE_MSG_INPUTS_KEY_MODIFIERS)
57
+ {
58
+ var key = new SpiceMsgInputsKeyModifiers(msg.data);
59
+ this.keyboard_modifiers = key.keyboard_modifiers;
60
+ DEBUG > 1 && console.log("MsgInputsKeyModifiers - modifier " + this.keyboard_modifiers);
61
+ // FIXME - We don't do anything with the keyboard modifiers...
62
+ return true;
63
+ }
64
+ if (msg.type == SPICE_MSG_INPUTS_MOUSE_MOTION_ACK)
65
+ {
66
+ DEBUG > 1 && console.log("mouse motion ack");
67
+ this.waiting_for_ack -= SPICE_INPUT_MOTION_ACK_BUNCH;
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+
73
+
74
+
75
+ function handle_mousemove(e)
76
+ {
77
+ var msg = new SpiceMiniData();
78
+ var move;
79
+ if (this.sc.mouse_mode == SPICE_MOUSE_MODE_CLIENT)
80
+ {
81
+ move = new SpiceMsgcMousePosition(this.sc, e)
82
+ msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_POSITION, move);
83
+ }
84
+ else
85
+ {
86
+ move = new SpiceMsgcMouseMotion(this.sc, e)
87
+ msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_MOTION, move);
88
+ }
89
+ if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready")
90
+ {
91
+ if (this.sc.inputs.waiting_for_ack < (2 * SPICE_INPUT_MOTION_ACK_BUNCH))
92
+ {
93
+ this.sc.inputs.send_msg(msg);
94
+ this.sc.inputs.waiting_for_ack++;
95
+ }
96
+ else
97
+ {
98
+ DEBUG > 0 && this.sc.log_info("Discarding mouse motion");
99
+ }
100
+ }
101
+ }
102
+
103
+ function handle_mousedown(e)
104
+ {
105
+ var press = new SpiceMsgcMousePress(this.sc, e)
106
+ var msg = new SpiceMiniData();
107
+ msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_PRESS, press);
108
+ if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready")
109
+ this.sc.inputs.send_msg(msg);
110
+
111
+ e.preventDefault();
112
+ }
113
+
114
+ function handle_contextmenu(e)
115
+ {
116
+ e.preventDefault();
117
+ return false;
118
+ }
119
+
120
+ function handle_mouseup(e)
121
+ {
122
+ var release = new SpiceMsgcMouseRelease(this.sc, e)
123
+ var msg = new SpiceMiniData();
124
+ msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_RELEASE, release);
125
+ if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready")
126
+ this.sc.inputs.send_msg(msg);
127
+
128
+ e.preventDefault();
129
+ }
130
+
131
+ function handle_mousewheel(e)
132
+ {
133
+ var press = new SpiceMsgcMousePress;
134
+ var release = new SpiceMsgcMouseRelease;
135
+ if (e.wheelDelta > 0)
136
+ press.button = release.button = SPICE_MOUSE_BUTTON_UP;
137
+ else
138
+ press.button = release.button = SPICE_MOUSE_BUTTON_DOWN;
139
+ press.buttons_state = 0;
140
+ release.buttons_state = 0;
141
+
142
+ var msg = new SpiceMiniData();
143
+ msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_PRESS, press);
144
+ if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready")
145
+ this.sc.inputs.send_msg(msg);
146
+
147
+ msg.build_msg(SPICE_MSGC_INPUTS_MOUSE_RELEASE, release);
148
+ if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready")
149
+ this.sc.inputs.send_msg(msg);
150
+
151
+ e.preventDefault();
152
+ }
153
+
154
+ function handle_keydown(e)
155
+ {
156
+ var key = new SpiceMsgcKeyDown(e)
157
+ var msg = new SpiceMiniData();
158
+ check_and_update_modifiers(e, key.code, this.sc);
159
+ msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
160
+ if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready")
161
+ this.sc.inputs.send_msg(msg);
162
+
163
+ e.preventDefault();
164
+ }
165
+
166
+ function handle_keyup(e)
167
+ {
168
+ var key = new SpiceMsgcKeyUp(e)
169
+ var msg = new SpiceMiniData();
170
+ check_and_update_modifiers(e, key.code, this.sc);
171
+ msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
172
+ if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready")
173
+ this.sc.inputs.send_msg(msg);
174
+
175
+ e.preventDefault();
176
+ }
177
+
178
+ function sendCtrlAltDel()
179
+ {
180
+ if (sc && sc.inputs && sc.inputs.state === "ready"){
181
+ var key = new SpiceMsgcKeyDown();
182
+ var msg = new SpiceMiniData();
183
+
184
+ update_modifier(true, KEY_LCtrl, sc);
185
+ update_modifier(true, KEY_Alt, sc);
186
+
187
+ key.code = KEY_KP_Decimal;
188
+ msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
189
+ sc.inputs.send_msg(msg);
190
+ msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
191
+ sc.inputs.send_msg(msg);
192
+
193
+ if(Ctrl_state == false) update_modifier(false, KEY_LCtrl, sc);
194
+ if(Alt_state == false) update_modifier(false, KEY_Alt, sc);
195
+ }
196
+ }
197
+
198
+ function update_modifier(state, code, sc)
199
+ {
200
+ var msg = new SpiceMiniData();
201
+ if (!state)
202
+ {
203
+ var key = new SpiceMsgcKeyUp()
204
+ key.code =(0x80|code);
205
+ msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
206
+ }
207
+ else
208
+ {
209
+ var key = new SpiceMsgcKeyDown()
210
+ key.code = code;
211
+ msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
212
+ }
213
+
214
+ sc.inputs.send_msg(msg);
215
+ }
216
+
217
+ function check_and_update_modifiers(e, code, sc)
218
+ {
219
+ if (Shift_state === -1)
220
+ {
221
+ Shift_state = e.shiftKey;
222
+ Ctrl_state = e.ctrlKey;
223
+ Alt_state = e.altKey;
224
+ Meta_state = e.metaKey;
225
+ }
226
+
227
+ if (code === KEY_ShiftL)
228
+ Shift_state = true;
229
+ else if (code === KEY_Alt)
230
+ Alt_state = true;
231
+ else if (code === KEY_LCtrl)
232
+ Ctrl_state = true;
233
+ else if (code === 0xE0B5)
234
+ Meta_state = true;
235
+ else if (code === (0x80|KEY_ShiftL))
236
+ Shift_state = false;
237
+ else if (code === (0x80|KEY_Alt))
238
+ Alt_state = false;
239
+ else if (code === (0x80|KEY_LCtrl))
240
+ Ctrl_state = false;
241
+ else if (code === (0x80|0xE0B5))
242
+ Meta_state = false;
243
+
244
+ if (sc && sc.inputs && sc.inputs.state === "ready")
245
+ {
246
+ if (Shift_state != e.shiftKey)
247
+ {
248
+ console.log("Shift state out of sync");
249
+ update_modifier(e.shiftKey, KEY_ShiftL, sc);
250
+ Shift_state = e.shiftKey;
251
+ }
252
+ if (Alt_state != e.altKey)
253
+ {
254
+ console.log("Alt state out of sync");
255
+ update_modifier(e.altKey, KEY_Alt, sc);
256
+ Alt_state = e.altKey;
257
+ }
258
+ if (Ctrl_state != e.ctrlKey)
259
+ {
260
+ console.log("Ctrl state out of sync");
261
+ update_modifier(e.ctrlKey, KEY_LCtrl, sc);
262
+ Ctrl_state = e.ctrlKey;
263
+ }
264
+ if (Meta_state != e.metaKey)
265
+ {
266
+ console.log("Meta state out of sync");
267
+ update_modifier(e.metaKey, 0xE0B5, sc);
268
+ Meta_state = e.metaKey;
269
+ }
270
+ }
271
+ }