spice-html5-rails 0.0.1 → 0.1.4
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.
- 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:
|