spice-html5-rails 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
}
|