summaryrefslogtreecommitdiff
path: root/cursor.js
diff options
context:
space:
mode:
Diffstat (limited to 'cursor.js')
-rw-r--r--cursor.js92
1 files changed, 92 insertions, 0 deletions
diff --git a/cursor.js b/cursor.js
new file mode 100644
index 0000000..e3f6e0e
--- /dev/null
+++ b/cursor.js
@@ -0,0 +1,92 @@
+"use strict";
+/*
+ Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>
+
+ This file is part of spice-html5.
+
+ spice-html5 is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ spice-html5 is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with spice-html5. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+/*----------------------------------------------------------------------------
+** SpiceCursorConn
+** Drive the Spice Cursor Channel
+**--------------------------------------------------------------------------*/
+function SpiceCursorConn()
+{
+ SpiceConn.apply(this, arguments);
+}
+
+SpiceCursorConn.prototype = Object.create(SpiceConn.prototype);
+SpiceCursorConn.prototype.process_channel_message = function(msg)
+{
+ if (msg.type == SPICE_MSG_CURSOR_INIT)
+ {
+ var cursor_init = new SpiceMsgCursorInit(msg.data);
+ DEBUG > 1 && console.log("SpiceMsgCursorInit");
+ if (this.parent && this.parent.inputs &&
+ this.parent.inputs.mouse_mode == SPICE_MOUSE_MODE_SERVER)
+ {
+ // FIXME - this imagines that the server actually
+ // provides the current cursor position,
+ // instead of 0,0. As of May 11, 2012,
+ // that assumption was false :-(.
+ this.parent.inputs.mousex = cursor_init.position.x;
+ this.parent.inputs.mousey = cursor_init.position.y;
+ }
+ // FIXME - We don't handle most of the parameters here...
+ return true;
+ }
+
+ if (msg.type == SPICE_MSG_CURSOR_SET)
+ {
+ var cursor_set = new SpiceMsgCursorSet(msg.data);
+ DEBUG > 1 && console.log("SpiceMsgCursorSet");
+ if (cursor_set.flags & SPICE_CURSOR_FLAGS_NONE)
+ {
+ document.getElementById(this.parent.screen_id).style.cursor = "none";
+ return true;
+ }
+
+ if (cursor_set.flags > 0)
+ this.log_warn("FIXME: No support for cursor flags " + cursor_set.flags);
+
+ if (cursor_set.cursor.header.type != SPICE_CURSOR_TYPE_ALPHA)
+ {
+ this.log_warn("FIXME: No support for cursor type " + cursor_set.cursor.header.type);
+ return false;
+ }
+
+ this.set_cursor(cursor_set.cursor);
+
+ return true;
+ }
+
+ if (msg.type == SPICE_MSG_CURSOR_HIDE)
+ {
+ DEBUG > 1 && console.log("SpiceMsgCursorHide");
+ document.getElementById(this.parent.screen_id).style.cursor = "none";
+ return true;
+ }
+
+ return false;
+}
+
+SpiceCursorConn.prototype.set_cursor = function(cursor)
+{
+ var pngstr = create_rgba_png(cursor.header.height, cursor.header.width, cursor.data);
+ var curstr = 'url(data:image/png,' + pngstr + ') ' +
+ cursor.header.hot_spot_x + ' ' + cursor.header.hot_spot_y + ", default";
+ document.getElementById(this.parent.screen_id).style.cursor = curstr;
+}