spice-html5-rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +674 -0
- data/COPYING.LESSER +165 -0
- data/LICENSE.txt +15 -0
- data/README.md +35 -0
- data/lib/spice-html5-rails/version.rb +7 -0
- data/lib/spice-html5-rails.rb +10 -0
- data/vendor/assets/javascripts/spice-html5.js +25 -0
- data/vendor/assets/javascripts/spiceHTML5/atKeynames.js +183 -0
- data/vendor/assets/javascripts/spiceHTML5/bitmap.js +51 -0
- data/vendor/assets/javascripts/spiceHTML5/cursor.js +92 -0
- data/vendor/assets/javascripts/spiceHTML5/display.js +806 -0
- data/vendor/assets/javascripts/spiceHTML5/enums.js +282 -0
- data/vendor/assets/javascripts/spiceHTML5/inputs.js +271 -0
- data/vendor/assets/javascripts/spiceHTML5/lz.js +166 -0
- data/vendor/assets/javascripts/spiceHTML5/main.js +177 -0
- data/vendor/assets/javascripts/spiceHTML5/png.js +256 -0
- data/vendor/assets/javascripts/spiceHTML5/quic.js +1335 -0
- data/vendor/assets/javascripts/spiceHTML5/spiceconn.js +455 -0
- data/vendor/assets/javascripts/spiceHTML5/spicedataview.js +96 -0
- data/vendor/assets/javascripts/spiceHTML5/spicemsg.js +883 -0
- data/vendor/assets/javascripts/spiceHTML5/spicetype.js +480 -0
- data/vendor/assets/javascripts/spiceHTML5/thirdparty/jsbn.js +589 -0
- data/vendor/assets/javascripts/spiceHTML5/thirdparty/prng4.js +79 -0
- data/vendor/assets/javascripts/spiceHTML5/thirdparty/rng.js +102 -0
- data/vendor/assets/javascripts/spiceHTML5/thirdparty/rsa.js +146 -0
- data/vendor/assets/javascripts/spiceHTML5/thirdparty/sha1.js +346 -0
- data/vendor/assets/javascripts/spiceHTML5/ticket.js +250 -0
- data/vendor/assets/javascripts/spiceHTML5/utils.js +261 -0
- data/vendor/assets/javascripts/spiceHTML5/wire.js +123 -0
- 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
|
+
}
|