Spaces:
Running
Running
| /** | |
| * WHITEBOPHIR | |
| ********************************************************* | |
| * @licstart The following is the entire license notice for the | |
| * JavaScript code in this page. | |
| * | |
| * Copyright (C) 2020 Ophir LOJKINE | |
| * | |
| * | |
| * The JavaScript code in this page is free software: you can | |
| * redistribute it and/or modify it under the terms of the GNU | |
| * General Public License (GNU GPL) as published by the Free Software | |
| * Foundation, either version 3 of the License, or (at your option) | |
| * any later version. The code is distributed WITHOUT ANY WARRANTY; | |
| * without even the implied warranty of MERCHANTABILITY or FITNESS | |
| * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. | |
| * | |
| * As additional permission under GNU GPL version 3 section 7, you | |
| * may distribute non-source (e.g., minimized or compacted) forms of | |
| * that code without the copy of the GNU GPL normally required by | |
| * section 4, provided you include this license notice and a URL | |
| * through which recipients can access the Corresponding Source. | |
| * | |
| * @licend | |
| */ | |
| (function () { | |
| // Code isolation | |
| // Allocate half of the maximum server updates to cursor updates | |
| var MIN_CURSOR_UPDATES_INTERVAL_MS = | |
| (Tools.server_config.MAX_EMIT_COUNT_PERIOD / | |
| Tools.server_config.MAX_EMIT_COUNT) * | |
| 2; | |
| var CURSOR_DELETE_AFTER_MS = 1000 * 5; | |
| var lastCursorUpdate = 0; | |
| var sending = true; | |
| var cursorTool = { | |
| name: "Cursor", | |
| listeners: { | |
| press: function () { | |
| sending = false; | |
| }, | |
| move: handleMarker, | |
| release: function () { | |
| sending = true; | |
| }, | |
| }, | |
| onSizeChange: onSizeChange, | |
| draw: draw, | |
| mouseCursor: "crosshair", | |
| icon: "tools/pencil/icon.svg", | |
| }; | |
| Tools.register(cursorTool); | |
| Tools.addToolListeners(cursorTool); | |
| var message = { | |
| type: "update", | |
| x: 0, | |
| y: 0, | |
| color: Tools.getColor(), | |
| size: Tools.getSize(), | |
| }; | |
| function handleMarker(x, y) { | |
| // throttle local cursor updates | |
| message.x = x; | |
| message.y = y; | |
| message.color = Tools.getColor(); | |
| message.size = Tools.getSize(); | |
| updateMarker(); | |
| } | |
| function onSizeChange(size) { | |
| message.size = size; | |
| updateMarker(); | |
| } | |
| function updateMarker() { | |
| if (!Tools.showMarker || !Tools.showMyCursor) return; | |
| var cur_time = Date.now(); | |
| if ( | |
| cur_time - lastCursorUpdate > MIN_CURSOR_UPDATES_INTERVAL_MS && | |
| (sending || Tools.curTool.showMarker) | |
| ) { | |
| Tools.drawAndSend(message, cursorTool); | |
| lastCursorUpdate = cur_time; | |
| } else { | |
| draw(message); | |
| } | |
| } | |
| var cursorsElem = Tools.svg.getElementById("cursors"); | |
| function createCursor(id) { | |
| var cursor = document.createElementNS( | |
| "http://www.w3.org/2000/svg", | |
| "circle", | |
| ); | |
| cursor.setAttributeNS(null, "class", "opcursor"); | |
| cursor.setAttributeNS(null, "id", id); | |
| cursor.setAttributeNS(null, "cx", 0); | |
| cursor.setAttributeNS(null, "cy", 0); | |
| cursor.setAttributeNS(null, "r", 10); | |
| cursorsElem.appendChild(cursor); | |
| setTimeout(function () { | |
| cursorsElem.removeChild(cursor); | |
| }, CURSOR_DELETE_AFTER_MS); | |
| return cursor; | |
| } | |
| function getCursor(id) { | |
| return document.getElementById(id) || createCursor(id); | |
| } | |
| function draw(message) { | |
| var cursor = getCursor("cursor-" + (message.socket || "me")); | |
| cursor.style.transform = | |
| "translate(" + message.x + "px, " + message.y + "px)"; | |
| if (Tools.isIE) | |
| cursor.setAttributeNS( | |
| null, | |
| "transform", | |
| "translate(" + message.x + " " + message.y + ")", | |
| ); | |
| cursor.setAttributeNS(null, "fill", message.color); | |
| cursor.setAttributeNS(null, "r", message.size / 2); | |
| } | |
| })(); | |