]>
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 export function getPointerEvent (e
) {
14 return e
.changedTouches
? e
.changedTouches
[0] : e
.touches
? e
.touches
[0] : e
;
17 export function stopEvent (e
) {
22 // Emulate Element.setCapture() when not supported
23 var _captureRecursion
= false;
24 var _captureElem
= null;
25 function _captureProxy(e
) {
26 // Recursion protection as we'll see our own event
27 if (_captureRecursion
) return;
29 // Clone the event as we cannot dispatch an already dispatched event
30 var newEv
= new e
.constructor(e
.type
, e
);
32 _captureRecursion
= true;
33 _captureElem
.dispatchEvent(newEv
);
34 _captureRecursion
= false;
36 // Avoid double events
39 // Respect the wishes of the redirected event handlers
40 if (newEv
.defaultPrevented
) {
44 // Implicitly release the capture on button release
45 if (e
.type
=== "mouseup") {
50 // Follow cursor style of target element
51 function _captureElemChanged() {
52 var captureElem
= document
.getElementById("noVNC_mouse_capture_elem");
53 captureElem
.style
.cursor
= window
.getComputedStyle(_captureElem
).cursor
;
55 var _captureObserver
= new MutationObserver(_captureElemChanged
);
57 var _captureIndex
= 0;
59 export function setCapture (elem
) {
60 if (elem
.setCapture
) {
64 // IE releases capture on 'click' events which might not trigger
65 elem
.addEventListener('mouseup', releaseCapture
);
68 // Release any existing capture in case this method is
69 // called multiple times without coordination
72 var captureElem
= document
.getElementById("noVNC_mouse_capture_elem");
74 if (captureElem
=== null) {
75 captureElem
= document
.createElement("div");
76 captureElem
.id
= "noVNC_mouse_capture_elem";
77 captureElem
.style
.position
= "fixed";
78 captureElem
.style
.top
= "0px";
79 captureElem
.style
.left
= "0px";
80 captureElem
.style
.width
= "100%";
81 captureElem
.style
.height
= "100%";
82 captureElem
.style
.zIndex
= 10000;
83 captureElem
.style
.display
= "none";
84 document
.body
.appendChild(captureElem
);
86 // This is to make sure callers don't get confused by having
87 // our blocking element as the target
88 captureElem
.addEventListener('contextmenu', _captureProxy
);
90 captureElem
.addEventListener('mousemove', _captureProxy
);
91 captureElem
.addEventListener('mouseup', _captureProxy
);
97 // Track cursor and get initial cursor
98 _captureObserver
.observe(elem
, {attributes
:true});
99 _captureElemChanged();
101 captureElem
.style
.display
= "";
103 // We listen to events on window in order to keep tracking if it
104 // happens to leave the viewport
105 window
.addEventListener('mousemove', _captureProxy
);
106 window
.addEventListener('mouseup', _captureProxy
);
110 export function releaseCapture () {
111 if (document
.releaseCapture
) {
113 document
.releaseCapture();
120 // There might be events already queued, so we need to wait for
121 // them to flush. E.g. contextmenu in Microsoft Edge
122 window
.setTimeout(function(expected
) {
123 // Only clear it if it's the expected grab (i.e. no one
124 // else has initiated a new grab)
125 if (_captureIndex
=== expected
) {
128 }, 0, _captureIndex
);
130 _captureObserver
.disconnect();
132 var captureElem
= document
.getElementById("noVNC_mouse_capture_elem");
133 captureElem
.style
.display
= "none";
135 window
.removeEventListener('mousemove', _captureProxy
);
136 window
.removeEventListener('mouseup', _captureProxy
);