spice-html5-rails 0.0.1 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +2 -0
- data/lib/spice-html5-rails/version.rb +1 -1
- data/vendor/assets/javascripts/spiceHTML5/cursor.js +5 -1
- data/vendor/assets/javascripts/spiceHTML5/display.js +19 -3
- data/vendor/assets/javascripts/spiceHTML5/inputs.js +9 -0
- data/vendor/assets/javascripts/spiceHTML5/simulatecursor.js +202 -0
- data/vendor/assets/javascripts/spiceHTML5/spicearraybuffer.js +58 -0
- data/vendor/assets/javascripts/spiceHTML5/spiceconn.js +9 -11
- data/vendor/assets/javascripts/spiceHTML5/spicedataview.js +24 -0
- data/vendor/assets/javascripts/spiceHTML5/spicemsg.js +32 -8
- data/vendor/assets/javascripts/spiceHTML5/spicetype.js +4 -11
- data/vendor/assets/javascripts/spiceHTML5/utils.js +1 -0
- metadata +54 -73
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6961686e30da1a855c67fe8b897e7251f81eaec7
|
4
|
+
data.tar.gz: 0ad1b8313ec98c90f5d05f6bdbf8e3fab1586d59
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b87855bbfe4896e778f4ef5305d9fbb179059a7f09626df9c7c2ec448e09367bc36f0e8cb4a77e2ec4e0b24c4fc0e4b146ad8b75b354ca3716629edb85959438
|
7
|
+
data.tar.gz: 25b5e538f5941e1b5ab5c1b9a34f8cf43ae1e0ed0f9e2c1289202095321fb6c2267caa798e353e2ea6ea6a78de290b031a9039d2241432beb17ab8eb0dca36cd
|
data/README.md
CHANGED
@@ -19,11 +19,13 @@ Or install it yourself as:
|
|
19
19
|
## Usage
|
20
20
|
|
21
21
|
Add in application.js or some per-controller .js.
|
22
|
+
|
22
23
|
//= require spice-html5
|
23
24
|
|
24
25
|
## Source
|
25
26
|
|
26
27
|
Spice home page: [http://www.spice-space.org](http://www.spice-space.org)
|
28
|
+
|
27
29
|
Spice-html5 code is available here: git://anongit.freedesktop.org/spice/spice-html5
|
28
30
|
|
29
31
|
## Contributing
|
@@ -88,5 +88,9 @@ SpiceCursorConn.prototype.set_cursor = function(cursor)
|
|
88
88
|
var pngstr = create_rgba_png(cursor.header.height, cursor.header.width, cursor.data);
|
89
89
|
var curstr = 'url(data:image/png,' + pngstr + ') ' +
|
90
90
|
cursor.header.hot_spot_x + ' ' + cursor.header.hot_spot_y + ", default";
|
91
|
-
document.getElementById(this.parent.screen_id)
|
91
|
+
var screen = document.getElementById(this.parent.screen_id);
|
92
|
+
screen.style.cursor = 'auto';
|
93
|
+
screen.style.cursor = curstr;
|
94
|
+
if (window.getComputedStyle(screen, null).cursor == 'auto')
|
95
|
+
SpiceSimulateCursor.simulate_cursor(this, cursor, screen, pngstr);
|
92
96
|
}
|
@@ -527,6 +527,16 @@ SpiceDisplayConn.prototype.process_channel_message = function(msg)
|
|
527
527
|
this.streams[m.id] = undefined;
|
528
528
|
return true;
|
529
529
|
}
|
530
|
+
if (msg.type == SPICE_MSG_DISPLAY_INVAL_LIST)
|
531
|
+
{
|
532
|
+
var m = new SpiceMsgDisplayInvalList(msg.data);
|
533
|
+
var i;
|
534
|
+
DEBUG > 1 && console.log(this.type + ": MsgInvalList " + m.count + " items");
|
535
|
+
for (i = 0; i < m.count; i++)
|
536
|
+
if (this.cache[m.resources[i].id] != undefined)
|
537
|
+
delete this.cache[m.resources[i].id];
|
538
|
+
return true;
|
539
|
+
}
|
530
540
|
|
531
541
|
return false;
|
532
542
|
}
|
@@ -575,7 +585,7 @@ SpiceDisplayConn.prototype.draw_copy_helper = function(o)
|
|
575
585
|
if (o.descriptor && (o.descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME))
|
576
586
|
{
|
577
587
|
if (! ("cache" in this))
|
578
|
-
this.cache =
|
588
|
+
this.cache = {};
|
579
589
|
this.cache[o.descriptor.id] = o.image_data;
|
580
590
|
}
|
581
591
|
|
@@ -721,6 +731,8 @@ function handle_mouseover(e)
|
|
721
731
|
|
722
732
|
function handle_mouseout(e)
|
723
733
|
{
|
734
|
+
if (this.sc && this.sc.cursor && this.sc.cursor.spice_simulated_cursor)
|
735
|
+
this.sc.cursor.spice_simulated_cursor.style.display = 'none';
|
724
736
|
this.blur();
|
725
737
|
}
|
726
738
|
|
@@ -764,7 +776,7 @@ function handle_draw_jpeg_onload()
|
|
764
776
|
(this.o.descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME))
|
765
777
|
{
|
766
778
|
if (! ("cache" in this.o.sc))
|
767
|
-
this.o.sc.cache =
|
779
|
+
this.o.sc.cache = {};
|
768
780
|
|
769
781
|
this.o.sc.cache[this.o.descriptor.id] =
|
770
782
|
t.getImageData(0, 0,
|
@@ -776,11 +788,15 @@ function handle_draw_jpeg_onload()
|
|
776
788
|
{
|
777
789
|
context.drawImage(this, this.o.base.box.left, this.o.base.box.top);
|
778
790
|
|
791
|
+
// Give the Garbage collector a clue to recycle this; avoids
|
792
|
+
// fairly massive memory leaks during video playback
|
793
|
+
this.src = null;
|
794
|
+
|
779
795
|
if (this.o.descriptor &&
|
780
796
|
(this.o.descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME))
|
781
797
|
{
|
782
798
|
if (! ("cache" in this.o.sc))
|
783
|
-
this.o.sc.cache =
|
799
|
+
this.o.sc.cache = {};
|
784
800
|
|
785
801
|
this.o.sc.cache[this.o.descriptor.id] =
|
786
802
|
context.getImageData(this.o.base.box.left, this.o.base.box.top,
|
@@ -98,6 +98,15 @@ function handle_mousemove(e)
|
|
98
98
|
DEBUG > 0 && this.sc.log_info("Discarding mouse motion");
|
99
99
|
}
|
100
100
|
}
|
101
|
+
|
102
|
+
if (this.sc && this.sc.cursor && this.sc.cursor.spice_simulated_cursor)
|
103
|
+
{
|
104
|
+
this.sc.cursor.spice_simulated_cursor.style.display = 'block';
|
105
|
+
this.sc.cursor.spice_simulated_cursor.style.left = e.pageX - this.sc.cursor.spice_simulated_cursor.spice_hot_x + 'px';
|
106
|
+
this.sc.cursor.spice_simulated_cursor.style.top = e.pageY - this.sc.cursor.spice_simulated_cursor.spice_hot_y + 'px';
|
107
|
+
e.preventDefault();
|
108
|
+
}
|
109
|
+
|
101
110
|
}
|
102
111
|
|
103
112
|
function handle_mousedown(e)
|
@@ -0,0 +1,202 @@
|
|
1
|
+
"use strict";
|
2
|
+
/*
|
3
|
+
Copyright (C) 2013 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
|
+
** SpiceSimulateCursor
|
23
|
+
** Internet Explorer 10 does not support data uri's in cursor assignment.
|
24
|
+
** This file provides a number of gimmicks to compensate. First, if there
|
25
|
+
** is a preloaded cursor available, we will use that. Failing that, we will
|
26
|
+
** simulate a cursor using an image that is moved around the screen.
|
27
|
+
**--------------------------------------------------------------------------*/
|
28
|
+
var SpiceSimulateCursor = {
|
29
|
+
|
30
|
+
cursors : new Array(),
|
31
|
+
unknown_cursors : new Array(),
|
32
|
+
warned: false,
|
33
|
+
|
34
|
+
add_cursor: function(sha1, value)
|
35
|
+
{
|
36
|
+
SpiceSimulateCursor.cursors[sha1] = value;
|
37
|
+
},
|
38
|
+
|
39
|
+
unknown_cursor: function(sha1, curdata)
|
40
|
+
{
|
41
|
+
if (! SpiceSimulateCursor.warned)
|
42
|
+
{
|
43
|
+
SpiceSimulateCursor.warned = true;
|
44
|
+
alert("Internet Explorer does not support dynamic cursors. " +
|
45
|
+
"This page will now simulate cursors with images, " +
|
46
|
+
"which will be imperfect. We recommend using Chrome or Firefox instead. " +
|
47
|
+
"\n\nIf you need to use Internet Explorer, you can create a static cursor " +
|
48
|
+
"file for each cursor your application uses. " +
|
49
|
+
"View the console log for more information on creating static cursors for your environment.");
|
50
|
+
}
|
51
|
+
|
52
|
+
if (! SpiceSimulateCursor.unknown_cursors[sha1])
|
53
|
+
{
|
54
|
+
SpiceSimulateCursor.unknown_cursors[sha1] = curdata;
|
55
|
+
console.log('Unknown cursor. Simulation required. To avoid simulation for this cursor, create and include a custom javascript file, and add the following line:');
|
56
|
+
console.log('SpiceCursorSimulator.add_cursor("' + sha1 + '"), "<your filename here>.cur");');
|
57
|
+
console.log('And then run following command, redirecting output into <your filename here>.cur:');
|
58
|
+
console.log('php -r "echo urldecode(\'' + curdata + '\');"');
|
59
|
+
}
|
60
|
+
},
|
61
|
+
|
62
|
+
simulate_cursor: function (spicecursor, cursor, screen, pngstr)
|
63
|
+
{
|
64
|
+
var cursor_sha = hex_sha1(pngstr + ' ' + cursor.header.hot_spot_x + ' ' + cursor.header.hot_spot_y);
|
65
|
+
if (typeof SpiceSimulateCursor.cursors != 'undefined')
|
66
|
+
if (typeof SpiceSimulateCursor.cursors[cursor_sha] != 'undefined')
|
67
|
+
{
|
68
|
+
var curstr = 'url(' + SpiceSimulateCursor.cursors[cursor_sha] + '), default';
|
69
|
+
screen.style.cursor = curstr;
|
70
|
+
}
|
71
|
+
|
72
|
+
if (window.getComputedStyle(screen, null).cursor == 'auto')
|
73
|
+
{
|
74
|
+
SpiceSimulateCursor.unknown_cursor(cursor_sha,
|
75
|
+
SpiceSimulateCursor.create_icondir(cursor.header.width, cursor.header.height,
|
76
|
+
cursor.data.byteLength, cursor.header.hot_spot_x, cursor.header.hot_spot_y) + pngstr);
|
77
|
+
|
78
|
+
document.getElementById(spicecursor.parent.screen_id).style.cursor = 'none';
|
79
|
+
if (! spicecursor.spice_simulated_cursor)
|
80
|
+
{
|
81
|
+
spicecursor.spice_simulated_cursor = document.createElement('img');
|
82
|
+
|
83
|
+
spicecursor.spice_simulated_cursor.style.position = 'absolute';
|
84
|
+
spicecursor.spice_simulated_cursor.style.display = 'none';
|
85
|
+
spicecursor.spice_simulated_cursor.style.overflow = 'hidden';
|
86
|
+
|
87
|
+
spicecursor.spice_simulated_cursor.spice_screen = document.getElementById(spicecursor.parent.screen_id);
|
88
|
+
|
89
|
+
spicecursor.spice_simulated_cursor.addEventListener('mousemove', SpiceSimulateCursor.handle_sim_mousemove);
|
90
|
+
|
91
|
+
spicecursor.spice_simulated_cursor.spice_screen.appendChild(spicecursor.spice_simulated_cursor);
|
92
|
+
}
|
93
|
+
|
94
|
+
spicecursor.spice_simulated_cursor.src = 'data:image/png,' + pngstr;
|
95
|
+
|
96
|
+
spicecursor.spice_simulated_cursor.spice_hot_x = cursor.header.hot_spot_x;
|
97
|
+
spicecursor.spice_simulated_cursor.spice_hot_y = cursor.header.hot_spot_y;
|
98
|
+
|
99
|
+
spicecursor.spice_simulated_cursor.style.pointerEvents = "none";
|
100
|
+
}
|
101
|
+
else
|
102
|
+
{
|
103
|
+
if (spicecursor.spice_simulated_cursor)
|
104
|
+
{
|
105
|
+
spicecursor.spice_simulated_cursor.spice_screen.removeChild(spicecursor.spice_simulated_cursor);
|
106
|
+
delete spicecursor.spice_simulated_cursor;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
},
|
110
|
+
|
111
|
+
handle_sim_mousemove: function(e)
|
112
|
+
{
|
113
|
+
var retval;
|
114
|
+
var f = SpiceSimulateCursor.duplicate_mouse_event(e, this.spice_screen);
|
115
|
+
return this.spice_screen.dispatchEvent(f);
|
116
|
+
},
|
117
|
+
|
118
|
+
duplicate_mouse_event: function(e, target)
|
119
|
+
{
|
120
|
+
var evt = document.createEvent("mouseevent");
|
121
|
+
evt.initMouseEvent(e.type, true, true, e.view, e.detail,
|
122
|
+
e.screenX, e.screenY, e.clientX, e.clientY,
|
123
|
+
e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);
|
124
|
+
return evt;
|
125
|
+
},
|
126
|
+
|
127
|
+
ICONDIR: function ()
|
128
|
+
{
|
129
|
+
},
|
130
|
+
|
131
|
+
ICONDIRENTRY: function(width, height, bytes, hot_x, hot_y)
|
132
|
+
{
|
133
|
+
this.width = width;
|
134
|
+
this.height = height;
|
135
|
+
this.bytes = bytes;
|
136
|
+
this.hot_x = hot_x;
|
137
|
+
this.hot_y = hot_y;
|
138
|
+
},
|
139
|
+
|
140
|
+
|
141
|
+
create_icondir: function (width, height, bytes, hot_x, hot_y)
|
142
|
+
{
|
143
|
+
var i;
|
144
|
+
var header = new SpiceSimulateCursor.ICONDIR();
|
145
|
+
var entry = new SpiceSimulateCursor.ICONDIRENTRY(width, height, bytes, hot_x, hot_y);
|
146
|
+
|
147
|
+
var mb = new ArrayBuffer(header.buffer_size() + entry.buffer_size());
|
148
|
+
var at = header.to_buffer(mb);
|
149
|
+
at = entry.to_buffer(mb, at);
|
150
|
+
|
151
|
+
var u8 = new Uint8Array(mb);
|
152
|
+
var str = "";
|
153
|
+
for (i = 0; i < at; i++)
|
154
|
+
{
|
155
|
+
str += "%";
|
156
|
+
if (u8[i] < 16)
|
157
|
+
str += "0";
|
158
|
+
str += u8[i].toString(16);
|
159
|
+
}
|
160
|
+
return str;
|
161
|
+
},
|
162
|
+
|
163
|
+
};
|
164
|
+
|
165
|
+
SpiceSimulateCursor.ICONDIR.prototype =
|
166
|
+
{
|
167
|
+
to_buffer: function(a, at)
|
168
|
+
{
|
169
|
+
at = at || 0;
|
170
|
+
var dv = new SpiceDataView(a);
|
171
|
+
dv.setUint16(at, 0, true); at += 2;
|
172
|
+
dv.setUint16(at, 2, true); at += 2;
|
173
|
+
dv.setUint16(at, 1, true); at += 2;
|
174
|
+
return at;
|
175
|
+
},
|
176
|
+
buffer_size: function()
|
177
|
+
{
|
178
|
+
return 6;
|
179
|
+
}
|
180
|
+
};
|
181
|
+
|
182
|
+
SpiceSimulateCursor.ICONDIRENTRY.prototype =
|
183
|
+
{
|
184
|
+
to_buffer: function(a, at)
|
185
|
+
{
|
186
|
+
at = at || 0;
|
187
|
+
var dv = new SpiceDataView(a);
|
188
|
+
dv.setUint8(at, this.width); at++;
|
189
|
+
dv.setUint8(at, this.height); at++;
|
190
|
+
dv.setUint8(at, 0); at++; /* color palette count, unused */
|
191
|
+
dv.setUint8(at, 0); at++; /* reserved */
|
192
|
+
dv.setUint16(at, this.hot_x, true); at += 2;
|
193
|
+
dv.setUint16(at, this.hot_y, true); at += 2;
|
194
|
+
dv.setUint32(at, this.bytes, true); at += 4;
|
195
|
+
dv.setUint32(at, at + 4, true); at += 4; /* Offset to bytes */
|
196
|
+
return at;
|
197
|
+
},
|
198
|
+
buffer_size: function()
|
199
|
+
{
|
200
|
+
return 16;
|
201
|
+
}
|
202
|
+
};
|
@@ -0,0 +1,58 @@
|
|
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
|
+
** SpiceArrayBufferSlice
|
23
|
+
** This function is a work around for IE 10, which has no slice()
|
24
|
+
** method in it's subclass.
|
25
|
+
**--------------------------------------------------------------------------*/
|
26
|
+
function SpiceArrayBufferSlice(start, end)
|
27
|
+
{
|
28
|
+
start = start || 0;
|
29
|
+
end = end || this.byteLength;
|
30
|
+
if (end < 0)
|
31
|
+
end = this.byteLength + end;
|
32
|
+
if (start < 0)
|
33
|
+
start = this.byteLength + start;
|
34
|
+
if (start < 0)
|
35
|
+
start = 0;
|
36
|
+
if (end < 0)
|
37
|
+
end = 0;
|
38
|
+
if (end > this.byteLength)
|
39
|
+
end = this.byteLength;
|
40
|
+
if (start > end)
|
41
|
+
start = end;
|
42
|
+
|
43
|
+
var ret = new ArrayBuffer(end - start);
|
44
|
+
var in1 = new Uint8Array(this, start, end - start);
|
45
|
+
var out = new Uint8Array(ret);
|
46
|
+
var i;
|
47
|
+
|
48
|
+
for (i = 0; i < end - start; i++)
|
49
|
+
out[i] = in1[i];
|
50
|
+
|
51
|
+
return ret;
|
52
|
+
}
|
53
|
+
|
54
|
+
if (! ArrayBuffer.prototype.slice)
|
55
|
+
{
|
56
|
+
ArrayBuffer.prototype.slice = SpiceArrayBufferSlice;
|
57
|
+
console.log("WARNING: ArrayBuffer.slice() is missing; we are extending ArrayBuffer to compensate");
|
58
|
+
}
|
@@ -318,20 +318,18 @@ SpiceConn.prototype =
|
|
318
318
|
var rc;
|
319
319
|
DEBUG > 0 && console.log("<< hdr " + this.channel_type() + " type " + msg.type + " size " + (msg.data && msg.data.byteLength));
|
320
320
|
rc = this.process_common_messages(msg);
|
321
|
-
if (rc)
|
322
|
-
return rc;
|
323
|
-
|
324
|
-
if (this.process_channel_message)
|
325
|
-
rc = this.process_channel_message(msg);
|
326
|
-
else
|
321
|
+
if (! rc)
|
327
322
|
{
|
328
|
-
|
329
|
-
|
323
|
+
if (this.process_channel_message)
|
324
|
+
{
|
325
|
+
rc = this.process_channel_message(msg);
|
326
|
+
if (! rc)
|
327
|
+
this.log_warn(this.type + ": Unknown message type " + msg.type + "!");
|
328
|
+
}
|
329
|
+
else
|
330
|
+
this.log_err(this.type + ": No message handlers for this channel; message " + msg.type);
|
330
331
|
}
|
331
332
|
|
332
|
-
if (! rc)
|
333
|
-
this.log_warn(this.type + ": Unknown message type " + msg.type + "!");
|
334
|
-
|
335
333
|
if (this.msgs_until_ack !== undefined && this.ack_window)
|
336
334
|
{
|
337
335
|
this.msgs_until_ack--;
|
@@ -66,6 +66,18 @@ SpiceDataView.prototype = {
|
|
66
66
|
return (this.getUint16(byteOffset + high, littleEndian) << 16) |
|
67
67
|
this.getUint16(byteOffset + low, littleEndian);
|
68
68
|
},
|
69
|
+
getUint64: function (byteOffset, littleEndian)
|
70
|
+
{
|
71
|
+
var low = 4, high = 0;
|
72
|
+
if (littleEndian)
|
73
|
+
{
|
74
|
+
low = 0;
|
75
|
+
high = 4;
|
76
|
+
}
|
77
|
+
|
78
|
+
return (this.getUint32(byteOffset + high, littleEndian) << 32) |
|
79
|
+
this.getUint32(byteOffset + low, littleEndian);
|
80
|
+
},
|
69
81
|
setUint8: function(byteOffset, b)
|
70
82
|
{
|
71
83
|
this.u8[byteOffset] = (b & 0xff);
|
@@ -93,4 +105,16 @@ SpiceDataView.prototype = {
|
|
93
105
|
this.setUint16(byteOffset + high, (w & 0xffffffff) >> 16, littleEndian);
|
94
106
|
this.setUint16(byteOffset + low, (w & 0x0000ffff), littleEndian);
|
95
107
|
},
|
108
|
+
setUint64: function(byteOffset, w, littleEndian)
|
109
|
+
{
|
110
|
+
var low = 4, high = 0;
|
111
|
+
if (littleEndian)
|
112
|
+
{
|
113
|
+
low = 0;
|
114
|
+
high = 4;
|
115
|
+
}
|
116
|
+
|
117
|
+
this.setUint32(byteOffset + high, (w & 0xffffffffffffffff) >> 32, littleEndian);
|
118
|
+
this.setUint32(byteOffset + low, (w & 0x00000000ffffffff), littleEndian);
|
119
|
+
},
|
96
120
|
}
|
@@ -414,9 +414,7 @@ SpiceMsgNotify.prototype =
|
|
414
414
|
at = at || 0;
|
415
415
|
var i;
|
416
416
|
var dv = new SpiceDataView(a);
|
417
|
-
this.time_stamp =
|
418
|
-
this.time_stamp[0] = dv.getUint32(at, true); at += 4;
|
419
|
-
this.time_stamp[1] = dv.getUint32(at, true); at += 4;
|
417
|
+
this.time_stamp = dv.getUint64(at, true); at += 8;
|
420
418
|
this.severity = dv.getUint32(at, true); at += 4;
|
421
419
|
this.visibility = dv.getUint32(at, true); at += 4;
|
422
420
|
this.what = dv.getUint32(at, true); at += 4;
|
@@ -445,8 +443,7 @@ SpiceMsgcDisplayInit.prototype =
|
|
445
443
|
at = at || 0;
|
446
444
|
var dv = new SpiceDataView(a);
|
447
445
|
dv.setUint8(at, this.pixmap_cache_id, true); at++;
|
448
|
-
dv.
|
449
|
-
dv.setUint32(at, this.pixmap_cache_size, true); at += 4;
|
446
|
+
dv.setUint64(at, this.pixmap_cache_size, true); at += 8;
|
450
447
|
dv.setUint8(at, this.glz_dictionary_id, true); at++;
|
451
448
|
dv.setUint32(at, this.glz_dictionary_window_size, true); at += 4;
|
452
449
|
},
|
@@ -639,8 +636,11 @@ function SpiceMsgcMousePosition(sc, e)
|
|
639
636
|
this.buttons_state = sc.buttons_state;
|
640
637
|
if (e)
|
641
638
|
{
|
642
|
-
|
643
|
-
|
639
|
+
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
|
640
|
+
var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
|
641
|
+
|
642
|
+
this.x = e.clientX - sc.display.surfaces[sc.display.primary_surface].canvas.offsetLeft + scrollLeft;
|
643
|
+
this.y = e.clientY - sc.display.surfaces[sc.display.primary_surface].canvas.offsetTop + scrollTop;
|
644
644
|
sc.mousex = this.x;
|
645
645
|
sc.mousey = this.y;
|
646
646
|
}
|
@@ -805,7 +805,7 @@ SpiceMsgDisplayStreamCreate.prototype =
|
|
805
805
|
this.id = dv.getUint32(at, true); at += 4;
|
806
806
|
this.flags = dv.getUint8(at, true); at += 1;
|
807
807
|
this.codec_type = dv.getUint8(at, true); at += 1;
|
808
|
-
|
808
|
+
this.stamp = dv.getUint64(at, true); at += 8;
|
809
809
|
this.stream_width = dv.getUint32(at, true); at += 4;
|
810
810
|
this.stream_height = dv.getUint32(at, true); at += 4;
|
811
811
|
this.src_width = dv.getUint32(at, true); at += 4;
|
@@ -881,3 +881,27 @@ SpiceMsgDisplayStreamDestroy.prototype =
|
|
881
881
|
this.id = dv.getUint32(at, true); at += 4;
|
882
882
|
},
|
883
883
|
}
|
884
|
+
|
885
|
+
function SpiceMsgDisplayInvalList(a, at)
|
886
|
+
{
|
887
|
+
this.count = 0;
|
888
|
+
this.resources = [];
|
889
|
+
this.from_buffer(a,at);
|
890
|
+
}
|
891
|
+
|
892
|
+
SpiceMsgDisplayInvalList.prototype =
|
893
|
+
{
|
894
|
+
from_buffer: function (a, at)
|
895
|
+
{
|
896
|
+
var i;
|
897
|
+
at = at || 0;
|
898
|
+
var dv = new SpiceDataView(a);
|
899
|
+
this.count = dv.getUint16(at, true); at += 2;
|
900
|
+
for (i = 0; i < this.count; i++)
|
901
|
+
{
|
902
|
+
this.resources[i] = {};
|
903
|
+
this.resources[i].type = dv.getUint8(at, true); at++;
|
904
|
+
this.resources[i].id = dv.getUint64(at, true); at += 8;
|
905
|
+
}
|
906
|
+
},
|
907
|
+
}
|
@@ -109,8 +109,7 @@ SpiceImageDescriptor.prototype =
|
|
109
109
|
{
|
110
110
|
from_dv: function(dv, at, mb)
|
111
111
|
{
|
112
|
-
this.id = dv.
|
113
|
-
this.id += (dv.getUint32(at, true) << 32); at += 4;
|
112
|
+
this.id = dv.getUint64(at, true); at += 8;
|
114
113
|
this.type = dv.getUint8(at, true); at ++;
|
115
114
|
this.flags = dv.getUint8(at, true); at ++;
|
116
115
|
this.width = dv.getUint32(at, true); at += 4;
|
@@ -128,9 +127,7 @@ SpicePalette.prototype =
|
|
128
127
|
from_dv: function(dv, at, mb)
|
129
128
|
{
|
130
129
|
var i;
|
131
|
-
this.unique =
|
132
|
-
this.unique[0] = dv.getUint32(at, true); at += 4;
|
133
|
-
this.unique[1] = dv.getUint32(at, true); at += 4;
|
130
|
+
this.unique = dv.getUint64(at, true); at += 8;
|
134
131
|
this.num_ents = dv.getUint16(at, true); at += 2;
|
135
132
|
this.ents = [];
|
136
133
|
for (i = 0; i < this.num_ents; i++)
|
@@ -156,9 +153,7 @@ SpiceBitmap.prototype =
|
|
156
153
|
this.stride = dv.getUint32(at, true); at += 4;
|
157
154
|
if (this.flags & SPICE_BITMAP_FLAGS_PAL_FROM_CACHE)
|
158
155
|
{
|
159
|
-
this.palette_id =
|
160
|
-
this.palette_id[0] = dv.getUint32(at, true); at += 4;
|
161
|
-
this.palette_id[1] = dv.getUint32(at, true); at += 4;
|
156
|
+
this.palette_id = dv.getUint64(at, true); at += 8;
|
162
157
|
}
|
163
158
|
else
|
164
159
|
{
|
@@ -425,9 +420,7 @@ SpiceCursorHeader.prototype =
|
|
425
420
|
{
|
426
421
|
from_dv: function(dv, at, mb)
|
427
422
|
{
|
428
|
-
this.unique =
|
429
|
-
this.unique[0] = dv.getUint32(at, true); at += 4;
|
430
|
-
this.unique[1] = dv.getUint32(at, true); at += 4;
|
423
|
+
this.unique = dv.getUint64(at, true); at += 8;
|
431
424
|
this.type = dv.getUint8(at, true); at ++;
|
432
425
|
this.width = dv.getUint16(at, true); at += 2;
|
433
426
|
this.height = dv.getUint16(at, true); at += 2;
|
@@ -208,6 +208,7 @@ common_scanmap[93] = 0xE05D; //KEY_Menu
|
|
208
208
|
|
209
209
|
/* Firefox/Mozilla codes */
|
210
210
|
var firefox_scanmap = [];
|
211
|
+
firefox_scanmap[173] = KEY_Minus;
|
211
212
|
firefox_scanmap[109] = KEY_Minus;
|
212
213
|
firefox_scanmap[61] = KEY_Equal;
|
213
214
|
firefox_scanmap[59] = KEY_SemiColon;
|
metadata
CHANGED
@@ -1,108 +1,89 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: spice-html5-rails
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 0.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.4
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Amos Benari
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2014-02-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: railties
|
22
|
-
|
23
|
-
|
24
|
-
none: false
|
25
|
-
requirements:
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
26
17
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 3
|
31
|
-
- 1
|
32
|
-
version: "3.1"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.1'
|
33
20
|
type: :runtime
|
34
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.1'
|
35
27
|
description: Spice HTML5 client packed for Rails application
|
36
|
-
email:
|
28
|
+
email:
|
37
29
|
- abenari@redhat.com
|
38
30
|
executables: []
|
39
|
-
|
40
31
|
extensions: []
|
41
|
-
|
42
32
|
extra_rdoc_files: []
|
43
|
-
|
44
|
-
files:
|
45
|
-
- lib/spice-html5-rails.rb
|
33
|
+
files:
|
46
34
|
- lib/spice-html5-rails/version.rb
|
47
|
-
-
|
48
|
-
- vendor/assets/javascripts/spiceHTML5/
|
49
|
-
- vendor/assets/javascripts/spiceHTML5/
|
35
|
+
- lib/spice-html5-rails.rb
|
36
|
+
- vendor/assets/javascripts/spiceHTML5/inputs.js
|
37
|
+
- vendor/assets/javascripts/spiceHTML5/png.js
|
38
|
+
- vendor/assets/javascripts/spiceHTML5/quic.js
|
39
|
+
- vendor/assets/javascripts/spiceHTML5/cursor.js
|
40
|
+
- vendor/assets/javascripts/spiceHTML5/display.js
|
50
41
|
- vendor/assets/javascripts/spiceHTML5/spicetype.js
|
51
42
|
- vendor/assets/javascripts/spiceHTML5/main.js
|
52
|
-
- vendor/assets/javascripts/spiceHTML5/
|
43
|
+
- vendor/assets/javascripts/spiceHTML5/bitmap.js
|
53
44
|
- vendor/assets/javascripts/spiceHTML5/lz.js
|
45
|
+
- vendor/assets/javascripts/spiceHTML5/ticket.js
|
46
|
+
- vendor/assets/javascripts/spiceHTML5/simulatecursor.js
|
47
|
+
- vendor/assets/javascripts/spiceHTML5/spicearraybuffer.js
|
48
|
+
- vendor/assets/javascripts/spiceHTML5/thirdparty/rsa.js
|
49
|
+
- vendor/assets/javascripts/spiceHTML5/thirdparty/prng4.js
|
50
|
+
- vendor/assets/javascripts/spiceHTML5/thirdparty/sha1.js
|
51
|
+
- vendor/assets/javascripts/spiceHTML5/thirdparty/rng.js
|
52
|
+
- vendor/assets/javascripts/spiceHTML5/thirdparty/jsbn.js
|
53
|
+
- vendor/assets/javascripts/spiceHTML5/spicedataview.js
|
54
54
|
- vendor/assets/javascripts/spiceHTML5/enums.js
|
55
|
-
- vendor/assets/javascripts/spiceHTML5/
|
55
|
+
- vendor/assets/javascripts/spiceHTML5/wire.js
|
56
56
|
- vendor/assets/javascripts/spiceHTML5/atKeynames.js
|
57
|
+
- vendor/assets/javascripts/spiceHTML5/utils.js
|
58
|
+
- vendor/assets/javascripts/spiceHTML5/spiceconn.js
|
57
59
|
- vendor/assets/javascripts/spiceHTML5/spicemsg.js
|
58
|
-
- vendor/assets/javascripts/
|
59
|
-
- vendor/assets/javascripts/spiceHTML5/quic.js
|
60
|
-
- vendor/assets/javascripts/spiceHTML5/wire.js
|
61
|
-
- vendor/assets/javascripts/spiceHTML5/display.js
|
62
|
-
- vendor/assets/javascripts/spiceHTML5/png.js
|
63
|
-
- vendor/assets/javascripts/spiceHTML5/thirdparty/jsbn.js
|
64
|
-
- vendor/assets/javascripts/spiceHTML5/thirdparty/rng.js
|
65
|
-
- vendor/assets/javascripts/spiceHTML5/thirdparty/sha1.js
|
66
|
-
- vendor/assets/javascripts/spiceHTML5/thirdparty/prng4.js
|
67
|
-
- vendor/assets/javascripts/spiceHTML5/thirdparty/rsa.js
|
68
|
-
- vendor/assets/javascripts/spiceHTML5/spicedataview.js
|
69
|
-
- vendor/assets/javascripts/spiceHTML5/cursor.js
|
60
|
+
- vendor/assets/javascripts/spice-html5.js
|
70
61
|
- LICENSE.txt
|
71
62
|
- COPYING
|
72
63
|
- COPYING.LESSER
|
73
64
|
- README.md
|
74
65
|
homepage: http://www.spice-space.org
|
75
66
|
licenses: []
|
76
|
-
|
67
|
+
metadata: {}
|
77
68
|
post_install_message:
|
78
69
|
rdoc_options: []
|
79
|
-
|
80
|
-
require_paths:
|
70
|
+
require_paths:
|
81
71
|
- lib
|
82
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
none: false
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
hash: 3
|
97
|
-
segments:
|
98
|
-
- 0
|
99
|
-
version: "0"
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
100
82
|
requirements: []
|
101
|
-
|
102
83
|
rubyforge_project:
|
103
|
-
rubygems_version:
|
84
|
+
rubygems_version: 2.0.14
|
104
85
|
signing_key:
|
105
|
-
specification_version:
|
86
|
+
specification_version: 4
|
106
87
|
summary: Spice client using HTML5 (WebSockets, Canvas).
|
107
88
|
test_files: []
|
108
|
-
|
89
|
+
has_rdoc:
|