]>
git.proxmox.com Git - mirror_novnc.git/blob - core/util/events.js
2 * noVNC: HTML5 VNC client
3 * Copyright (C) 2012 Joel Martin
4 * Licensed under MPL 2.0 (see LICENSE.txt)
6 * See README.md for usage and integration instructions.
10 * Cross-browser event and position routines
13 import * as Log
from './logging.js';
15 export function getPointerEvent (e
) {
16 return e
.changedTouches
? e
.changedTouches
[0] : e
.touches
? e
.touches
[0] : e
;
19 export function stopEvent (e
) {
24 // Emulate Element.setCapture() when not supported
25 var _captureRecursion
= false;
26 var _captureElem
= null;
27 function _captureProxy(e
) {
28 // Recursion protection as we'll see our own event
29 if (_captureRecursion
) return;
31 // Clone the event as we cannot dispatch an already dispatched event
32 var newEv
= new e
.constructor(e
.type
, e
);
34 _captureRecursion
= true;
35 _captureElem
.dispatchEvent(newEv
);
36 _captureRecursion
= false;
38 // Avoid double events
41 // Respect the wishes of the redirected event handlers
42 if (newEv
.defaultPrevented
) {
46 // Implicitly release the capture on button release
47 if (e
.type
=== "mouseup") {
52 // Follow cursor style of target element
53 function _captureElemChanged() {
54 var captureElem
= document
.getElementById("noVNC_mouse_capture_elem");
55 captureElem
.style
.cursor
= window
.getComputedStyle(_captureElem
).cursor
;
57 var _captureObserver
= new MutationObserver(_captureElemChanged
);
59 var _captureIndex
= 0;
61 export function setCapture (elem
) {
62 if (elem
.setCapture
) {
66 // IE releases capture on 'click' events which might not trigger
67 elem
.addEventListener('mouseup', releaseCapture
);
70 // Release any existing capture in case this method is
71 // called multiple times without coordination
74 var captureElem
= document
.getElementById("noVNC_mouse_capture_elem");
76 if (captureElem
=== null) {
77 captureElem
= document
.createElement("div");
78 captureElem
.id
= "noVNC_mouse_capture_elem";
79 captureElem
.style
.position
= "fixed";
80 captureElem
.style
.top
= "0px";
81 captureElem
.style
.left
= "0px";
82 captureElem
.style
.width
= "100%";
83 captureElem
.style
.height
= "100%";
84 captureElem
.style
.zIndex
= 10000;
85 captureElem
.style
.display
= "none";
86 document
.body
.appendChild(captureElem
);
88 // This is to make sure callers don't get confused by having
89 // our blocking element as the target
90 captureElem
.addEventListener('contextmenu', _captureProxy
);
92 captureElem
.addEventListener('mousemove', _captureProxy
);
93 captureElem
.addEventListener('mouseup', _captureProxy
);
99 // Track cursor and get initial cursor
100 _captureObserver
.observe(elem
, {attributes
:true});
101 _captureElemChanged();
103 captureElem
.style
.display
= "";
105 // We listen to events on window in order to keep tracking if it
106 // happens to leave the viewport
107 window
.addEventListener('mousemove', _captureProxy
);
108 window
.addEventListener('mouseup', _captureProxy
);
112 export function releaseCapture () {
113 if (document
.releaseCapture
) {
115 document
.releaseCapture();
122 // There might be events already queued, so we need to wait for
123 // them to flush. E.g. contextmenu in Microsoft Edge
124 window
.setTimeout(function(expected
) {
125 // Only clear it if it's the expected grab (i.e. no one
126 // else has initiated a new grab)
127 if (_captureIndex
=== expected
) {
130 }, 0, _captureIndex
);
132 _captureObserver
.disconnect();
134 var captureElem
= document
.getElementById("noVNC_mouse_capture_elem");
135 captureElem
.style
.display
= "none";
137 window
.removeEventListener('mousemove', _captureProxy
);
138 window
.removeEventListener('mouseup', _captureProxy
);