Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
1230a4c
Use theme-color to color address bar in browsers
samhed Jul 22, 2024
6c07136
Interrupt AltGr sequence detection on focus lost, fixes #1880
leedagee Jul 31, 2024
bc31e4e
Stop creating sinon sandbox early
CendioOssman Aug 5, 2024
1b2fe33
Manually load sinon and chai
CendioOssman Aug 5, 2024
a020ef0
Merge branch 'altgr-seq-interrupt' of https://github.com/leedagee/noVNC
CendioOssman Aug 5, 2024
06f14a5
Add test for AltGr abort on blur
CendioOssman Aug 5, 2024
074fa1a
Let browser construct URL string for us
CendioOssman Aug 8, 2024
96c76f7
Allow relative WebSocket URLs
CendioOssman Aug 8, 2024
9334c68
Handle all settings via UI.getSetting()
CendioOssman Jun 26, 2020
c6606a5
Merge UI startup in to a single routine
CendioOssman Jun 26, 2020
84897fd
Handle disabling settings without label
CendioOssman Jun 26, 2020
c6c8e5e
Add Zlib encoding
markpeek Aug 15, 2024
d106b7a
Add H.264 decoder
any1 Jun 29, 2024
bbb6a5b
Fix host and port via query string
CendioOssman Aug 19, 2024
c1bba97
Add unit tests for H.264 decoder
any1 Aug 11, 2024
a446551
Fix sQpushBytes sending the beginning of the array multiple times
Bobini1 Aug 23, 2024
ffb4c0b
Let fake WebSocket handle large sends
CendioOssman Aug 29, 2024
50e4685
Fix tests for large WebSocket sends
CendioOssman Aug 29, 2024
047531e
Merge branch 'webcodec-h264' of https://github.com/any1/noVNC
CendioOssman Aug 29, 2024
438e5b3
Make it easier for downstream to modify settings
CendioOssman Jun 26, 2020
28d4020
Load settings from web server
CendioOssman Aug 8, 2024
ed1fef4
Merge branch 'ui_init' of github.com:CendioOssman/noVNC
CendioOssman Oct 9, 2024
88a5a59
Fix typos in Russian translation
dim5x Nov 2, 2024
43326eb
Fix handling of VideoDecoder.isConfigSupported()
CendioOssman Nov 20, 2024
89e0591
Use common H.264 check in tests
CendioOssman Nov 20, 2024
69750c7
Raise JavaScript version requirement
CendioOssman Nov 21, 2024
3677afe
Do a real H.264 test decode to determine support
CendioOssman Nov 21, 2024
a89dfd6
Handle exceptions from VideoDecoder.flush()
CendioOssman Nov 21, 2024
2463ccd
Detect broken Firefox H.264 decoder
CendioOssman Nov 21, 2024
90a6c7b
Update zh_CN.po
wxtewx Nov 23, 2024
7f5b51a
Consistently use "sentence case" style
CendioOssman Nov 27, 2024
7335bb4
Also adjust to "sentence case" in translations
CendioOssman Nov 27, 2024
52ddb20
Merge branch 'master' of https://github.com/wxtewx/noVNC
CendioOssman Nov 27, 2024
52392ec
Update Japanese translation
nnn1590 Dec 14, 2024
3e2e04b
Replace node-getopt with commander for args
CendioOssman Dec 17, 2024
673cb34
Replace po2json with pofile
CendioOssman Dec 17, 2024
e6e03a2
Fix resizes back to initial remote session size
samhed Dec 27, 2024
3193f80
Comment different resize functions in rfb.js
samhed Dec 27, 2024
4bbed1d
Standardize on 4 space-indentation in CSS files
samhed Jan 11, 2025
bf245da
Increase padding of buttons and inputs
samhed Jan 11, 2025
72cac2e
Add margin between label and input in noVNC_panel
samhed Jan 11, 2025
7603ced
Create CSS variables for common noVNC-colors
samhed Jan 11, 2025
7a4d1a8
Move mouse event help functions to broader scope
CendioHalim Jan 9, 2025
de9d688
Add unit test for wheel + buttons pressed
CendioHalim Jan 10, 2025
db22ec6
Split button click with dragging test
CendioHalim Jan 9, 2025
c3934e0
Move mouse move flushing to separate function
CendioHalim Jan 14, 2025
dce8ab3
Dispatch mouse events in dragging unit tests
CendioHalim Jan 9, 2025
31d6a77
Check for correct button events in dragging tests
CendioHalim Jan 10, 2025
ea057d0
Move gesture event help functions to broader scope
CendioHalim Jan 10, 2025
f9eb476
Add tests for dragging with gestures
CendioHalim Jan 14, 2025
b9230cf
Use MouseEvent.buttons for button state tracking
CendioHalim Nov 29, 2024
d1548c1
Don't send mouse events when dragging viewport
CendioHalim Jan 13, 2025
6383fa6
Flush mouseMove when initiating viewport dragging
CendioHalim Jan 14, 2025
9cdbd28
Merge branch 'mouse-buttonstate-remove' of https://github.com/CendioH…
CendioOssman Jan 14, 2025
e8602f2
Move sendFbuMsg() to broader scope
CendioHalim Jan 14, 2025
e081d14
Add support for forward and back mouse buttons
CendioHalim Jan 9, 2025
c7bd247
Merge branch 'extra-mouse-buttons' of https://github.com/CendioHalim/…
CendioOssman Jan 15, 2025
83a5e9e
Also test Ctrl+AltGr, as that is what browsers use
CendioOssman Jan 15, 2025
4f284c2
Remove bold styling tags in vnc.html
CendioZeijlon Jan 17, 2025
ca270ef
Standardize on 6px or 12px border-radius
samhed Jan 11, 2025
e9b48ae
Get rid of gradients on buttons and inputs
samhed Jan 12, 2025
3f29c9d
Differentiate buttons from text inputs
samhed Jan 12, 2025
e1208b0
Redesign select dropdown arrow
samhed Jan 12, 2025
633b4c2
Redesign checkboxes and radiobuttons
samhed Jan 12, 2025
7fdcc66
Add indeterminate styling to checkboxes and radios
samhed Jan 12, 2025
017888c
Rework how buttons react to :hover and :active
samhed Jan 12, 2025
33a2548
Make buttons flat by removing borders
samhed Jan 12, 2025
30d46a0
Fix :disabled styling of file-selector-button
samhed Jan 12, 2025
ee08032
Put specific :disabled rules with its element
samhed Jan 12, 2025
e092f06
Move general :disabled rules to common top section
samhed Jan 12, 2025
d819985
Support 'disabled' attribute on labels
samhed Jan 12, 2025
1c45fd8
Capitalize CSS section headings
samhed Jan 12, 2025
91cd920
Keep CSS for different input elements together
samhed Jan 12, 2025
f0ec3d6
Avoid 2 borders when focus-visible on text inputs
samhed Jan 12, 2025
deb76f9
Add some sane default CSS for textareas
samhed Jan 12, 2025
28e1717
Remove number picker's increase/decrease buttons
samhed Jan 12, 2025
a2352b9
Standardize on ellipsis-type text-overflow
samhed Jan 12, 2025
7b58cb9
Add minimum width to buttons
samhed Jan 12, 2025
54e7681
Pointer cursor on buttons & grab on sliders
samhed Jan 12, 2025
2bc5057
Add styling for color pickers
samhed Jan 12, 2025
331ad34
Make interface airier by increasing line-height
samhed Jan 12, 2025
24f99e5
Add styling for toggle switches
samhed Jan 13, 2025
6c1e7bc
Utilize toggle switch in settings
samhed Jan 13, 2025
3a5dd22
Add styling for checked options in select boxes
samhed Jan 13, 2025
20611b6
Add styling for multi-select lists
samhed Jan 13, 2025
abe3c7b
Make range slider thumbs circular
samhed Jan 13, 2025
8800923
Only color the left part of the range track
samhed Jan 13, 2025
4ab4286
Make text in panel headings bold
samhed Jan 13, 2025
b5675bb
Fix spacing between elements in dialogs
samhed Jan 13, 2025
6db9dbc
Tweak design of noVNC connect button
samhed Jan 14, 2025
14f9ea5
Fix settings panel layout on small screens
samhed Jan 16, 2025
237a34d
Add exceptions for CSS validator false positives
samhed Jan 23, 2025
24835bd
Make the background of expanded settings lighter
samhed Jan 23, 2025
9f727b7
Merge branch 'ui_refresh'
CendioZeijlon Jan 28, 2025
b9f172d
Update README.md with ExtendedMouseButtons feature
CendioZeijlon Jan 28, 2025
4e410a0
Use less technical phrasing in README
samhed Feb 4, 2025
bbbef2d
Add helper for ExtendedDesktopSize in tests
CendioOssman Feb 5, 2025
70446bf
Make resizeSession setting test more realistic
CendioOssman Feb 5, 2025
c821783
Include SetDesktopSize responses in tests
CendioOssman Feb 5, 2025
0b5e968
Better resize rate limiting
CendioOssman Feb 5, 2025
bb797dc
Merge branch 'resize' of https://github.com/CendioOssman/noVNC
CendioOssman Feb 6, 2025
7ee7922
chore: fix some typos
tianzedavid Feb 12, 2025
d5315eb
Merge pull request #1934 from tianzedavid/master
CendioZeijlon Feb 14, 2025
e8030a9
Update translation template file
CendioZeijlon Feb 14, 2025
09fc4f7
Update Swedish translations
CendioZeijlon Feb 14, 2025
c3b8cbd
Update README.md with H.264 encoding support
CendioZeijlon Feb 14, 2025
b45f35c
noVNC 1.6.0 beta
CendioZeijlon Feb 14, 2025
b25675e
Upgrade to websockify 0.13.0 in snap package
CendioZeijlon Feb 28, 2025
045a0ba
Let browser handle parsing of URLs before relaying
CendioZeijlon Mar 10, 2025
59b674d
Merge branch 'fix-sub-url-query'
CendioZeijlon Mar 12, 2025
6002d57
Update French translation
voilier-martineke Feb 17, 2025
09440da
Update Dutch translation
haroldh Mar 3, 2025
3947b4c
Update generated json files for new translations
CendioZeijlon Mar 12, 2025
a8dfd6a
noVNC 1.6.0
CendioZeijlon Mar 12, 2025
f0a39cd
Fix appearance of extra key buttons
samhed Mar 24, 2025
6010c9d
Update comment reference missed in previous commit
samhed Mar 24, 2025
1546535
Only include valid translations in .json files
CendioOssman Mar 13, 2025
8edb3d2
Close VideoFrame after H.264 detection
CendioOssman Apr 8, 2025
980a49e
Fix typo in error-handler.js
liaopeiyuan Apr 10, 2025
6f9edb1
Fix typo in Portuguese translation for "Show extra keys"
Leostruka Apr 12, 2025
d7a3773
Merge branch 'master' of github.com:Leostruka/noVNC
CendioZeijlon Apr 15, 2025
a22857c
Document new behaviour of host/port/encrypt/path
CendioOssman Apr 28, 2025
88749fc
Document new JSON settings files
CendioOssman Apr 28, 2025
243d7fd
Disable setting showDotCursor in RFB constructor
CendioZeijlon May 7, 2025
4cb5aa4
Merge branch 'obsolete-showDotCursor-rfb-option' of github.com:ThinLi…
CendioZeijlon May 7, 2025
e4def7f
Add Croatian translation
milotype Aug 25, 2025
d49d2b3
Use Croatian translations
CendioZeijlon Sep 5, 2025
8ebd9dd
Fix broken Chai import
CendioZeijlon Sep 8, 2025
23b7219
Drop Image data once rendered
CendioOssman Sep 10, 2025
d5b18a8
Expose length of buffered WebSocket data
CendioOssman Sep 3, 2025
356eab4
Scan all buffered data looking for JPEG end
CendioOssman Sep 3, 2025
6cf0204
Remove deprecated "directories" entry
elikoga May 6, 2025
fe29dc6
Convert NPM bundle to ES-Module format
elikoga May 6, 2025
44b7489
Merge branch 'switch-to-es-module-publish-and-use-exports' of github.…
CendioOssman Sep 15, 2025
eaf5b70
Remove obsolete checks in novnc_proxy
CendioZeijlon Oct 20, 2025
71d0bfa
Use bash's type command to find websockify
CendioZeijlon Oct 20, 2025
f5a4eed
Add permissions-exclusive async clipboard
Jun 10, 2025
d9b45d3
Disable clipboard button with async clipboard
Sep 12, 2025
3d5698c
Add async clipboard module to internal API docs
Jun 11, 2025
fb7e891
Merge branch 'clipboard-async' of https://github.com/tobfah/noVNC
CendioZeijlon Oct 22, 2025
e977ad9
initial
mloginov Oct 27, 2025
5ab6c69
Merge remote-tracking branch 'remotes/base/master' into 17214_update_2
mloginov Oct 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions app/ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import * as Log from '../core/util/logging.js';
import _, { l10n } from './localization.js';
import { isTouchDevice, isMac, isIOS, isAndroid, isChromeOS, isSafari,
hasScrollbarGutter, dragThreshold }
hasScrollbarGutter, dragThreshold, browserAsyncClipboardSupport }
from '../core/util/browser.js';
import { setCapture, getPointerEvent } from '../core/util/events.js';
import KeyTable from "../core/input/keysym.js";
Expand All @@ -20,7 +20,7 @@ import * as WebUtil from "./webutil.js";

const PAGE_TITLE = "noVNC";

const LINGUAS = ["cs", "de", "el", "es", "fr", "it", "ja", "ko", "nl", "pl", "pt_BR", "ru", "sv", "tr", "zh_CN", "zh_TW"];
const LINGUAS = ["cs", "de", "el", "es", "fr", "hr", "it", "ja", "ko", "nl", "pl", "pt_BR", "ru", "sv", "tr", "zh_CN", "zh_TW"];

const UI = {

Expand Down Expand Up @@ -1160,6 +1160,7 @@ const UI = {
UI.rfb.showDotCursor = UI.getSetting('show_dot');

UI.updateViewOnly(); // requires UI.rfb
UI.updateClipboard();
},

disconnect() {
Expand Down Expand Up @@ -1817,6 +1818,31 @@ const UI = {
}
},

updateClipboard() {
browserAsyncClipboardSupport()
.then((support) => {
if (support === 'unsupported') {
// Use fallback clipboard panel
return;
}
if (support === 'denied' || support === 'available') {
UI.closeClipboardPanel();
document.getElementById('noVNC_clipboard_button')
.classList.add('noVNC_hidden');
document.getElementById('noVNC_clipboard_button')
.removeEventListener('click', UI.toggleClipboardPanel);
document.getElementById('noVNC_clipboard_text')
.removeEventListener('change', UI.clipboardSend);
if (UI.rfb) {
UI.rfb.removeEventListener('clipboard', UI.clipboardReceive);
}
}
})
.catch(() => {
// Treat as unsupported
});
},

updateShowDotCursor() {
if (!UI.rfb) return;
UI.rfb.showDotCursor = UI.getSetting('show_dot');
Expand Down
72 changes: 72 additions & 0 deletions core/clipboard.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* noVNC: HTML5 VNC client
* Copyright (c) 2025 The noVNC authors
* Licensed under MPL 2.0 or any later version (see LICENSE.txt)
*/

import * as Log from './util/logging.js';
import { browserAsyncClipboardSupport } from './util/browser.js';

export default class AsyncClipboard {
constructor(target) {
this._target = target || null;

this._isAvailable = null;

this._eventHandlers = {
'focus': this._handleFocus.bind(this),
};

// ===== EVENT HANDLERS =====

this.onpaste = () => {};
}

// ===== PRIVATE METHODS =====

async _ensureAvailable() {
if (this._isAvailable !== null) return this._isAvailable;
try {
const status = await browserAsyncClipboardSupport();
this._isAvailable = (status === 'available');
} catch {
this._isAvailable = false;
}
return this._isAvailable;
}

async _handleFocus(event) {
if (!(await this._ensureAvailable())) return;
try {
const text = await navigator.clipboard.readText();
this.onpaste(text);
} catch (error) {
Log.Error("Clipboard read failed: ", error);
}
}

// ===== PUBLIC METHODS =====

writeClipboard(text) {
// Can lazily check cached availability
if (!this._isAvailable) return false;
navigator.clipboard.writeText(text)
.catch(error => Log.Error("Clipboard write failed: ", error));
return true;
}

grab() {
if (!this._target) return;
this._ensureAvailable()
.then((isAvailable) => {
if (isAvailable) {
this._target.addEventListener('focus', this._eventHandlers.focus);
}
});
}

ungrab() {
if (!this._target) return;
this._target.removeEventListener('focus', this._eventHandlers.focus);
}
}
31 changes: 23 additions & 8 deletions core/decoders/jpeg.js
Original file line number Diff line number Diff line change
Expand Up @@ -119,18 +119,33 @@ export default class JPEGDecoder {
let extra = 0;
if (type === 0xDA) {
// start of scan
extra += 2;
if (sock.rQwait("JPEG", length-2 + 2, 4)) {
return null;
}

let len = sock.rQlen();
let data = sock.rQpeekBytes(len, false);

while (true) {
if (sock.rQwait("JPEG", length-2+extra, 4)) {
let idx = data.indexOf(0xFF, length-2+extra);
if (idx === -1) {
sock.rQwait("JPEG", Infinity, 4);
return null;
}
let data = sock.rQpeekBytes(length-2+extra, false);
if (data.at(-2) === 0xFF && data.at(-1) !== 0x00 &&
!(data.at(-1) >= 0xD0 && data.at(-1) <= 0xD7)) {
extra -= 2;
break;

if (idx === len-1) {
sock.rQwait("JPEG", Infinity, 4);
return null;
}
extra++;

if (data.at(idx+1) === 0x00 ||
(data.at(idx+1) >= 0xD0 && data.at(idx+1) <= 0xD7)) {
extra = idx+2 - (length-2);
continue;
}

extra = idx - (length-2);
break;
}
}

Expand Down
3 changes: 3 additions & 0 deletions core/display.js
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,9 @@ export default class Display {
return;
}
this.drawImage(a.img, a.x, a.y);
// This helps the browser free the memory right
// away, rather than ballooning
a.img.src = "";
} else {
a.img._noVNCDisplay = this;
a.img.addEventListener('load', this._resumeRenderQ);
Expand Down
29 changes: 22 additions & 7 deletions core/rfb.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { clientToElement } from './util/element.js';
import { setCapture } from './util/events.js';
import EventTargetMixin from './util/eventtarget.js';
import Display from "./display.js";
import AsyncClipboard from "./clipboard.js";
import Inflator from "./inflator.js";
import Deflator from "./deflator.js";
import Keyboard from "./input/keyboard.js";
Expand Down Expand Up @@ -164,6 +165,7 @@ export default class RFB extends EventTargetMixin {
this._sock = null; // Websock object
this._display = null; // Display object
this._flushing = false; // Display flushing state
this._asyncClipboard = null; // Async clipboard object
this._keyboard = null; // Keyboard input handler object
this._gestures = null; // Gesture input handler object
this._resizeObserver = null; // Resize observer object
Expand Down Expand Up @@ -266,6 +268,9 @@ export default class RFB extends EventTargetMixin {
throw exc;
}

this._asyncClipboard = new AsyncClipboard(this._canvas);
this._asyncClipboard.onpaste = this.clipboardPasteFrom.bind(this);

this._keyboard = new Keyboard(this._canvas);
this._keyboard.onkeyevent = this._handleKeyEvent.bind(this);
this._remoteCapsLock = null; // Null indicates unknown or irrelevant
Expand Down Expand Up @@ -317,8 +322,10 @@ export default class RFB extends EventTargetMixin {
this._rfbConnectionState === "connected") {
if (viewOnly) {
this._keyboard.ungrab();
this._asyncClipboard.ungrab();
} else {
this._keyboard.grab();
this._asyncClipboard.grab();
}
}
}
Expand Down Expand Up @@ -2221,7 +2228,10 @@ export default class RFB extends EventTargetMixin {
this._setDesktopName(name);
this._resize(width, height);

if (!this._viewOnly) { this._keyboard.grab(); }
if (!this._viewOnly) {
this._keyboard.grab();
this._asyncClipboard.grab();
}

this._fbDepth = 24;

Expand Down Expand Up @@ -2336,6 +2346,15 @@ export default class RFB extends EventTargetMixin {
return this._fail("Unexpected SetColorMapEntries message");
}

_writeClipboard(text) {
if (this._viewOnly) return;
if (this._asyncClipboard.writeClipboard(text)) return;
// Fallback clipboard
this.dispatchEvent(
new CustomEvent("clipboard", {detail: {text: text}})
);
}

_handleServerCutText() {
Log.Debug("ServerCutText");

Expand All @@ -2355,9 +2374,7 @@ export default class RFB extends EventTargetMixin {
return true;
}

this.dispatchEvent(new CustomEvent(
"clipboard",
{ detail: { text: text } }));
this._writeClipboard(text);

} else {
//Extended msg.
Expand Down Expand Up @@ -2493,9 +2510,7 @@ export default class RFB extends EventTargetMixin {

textData = textData.replaceAll("\r\n", "\n");

this.dispatchEvent(new CustomEvent(
"clipboard",
{ detail: { text: textData } }));
this._writeClipboard(textData);
}
} else {
return this._fail("Unexpected action in extended clipboard message: " + actions);
Expand Down
33 changes: 33 additions & 0 deletions core/util/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,39 @@
import * as Log from './logging.js';
import Base64 from '../base64.js';

// Async clipboard detection

/* Evaluates if there is browser support for the async clipboard API and
* relevant clipboard permissions. Returns 'unsupported' if permission states
* cannot be resolved. On the other hand, detecting 'granted' or 'prompt'
* permission states for both read and write indicates full API support with no
* imposed native browser paste prompt. Conversely, detecting 'denied' indicates
* the user elected to disable clipboard.
*/
export async function browserAsyncClipboardSupport() {
if (!(navigator?.permissions?.query &&
navigator?.clipboard?.writeText &&
navigator?.clipboard?.readText)) {
return 'unsupported';
}
try {
const writePerm = await navigator.permissions.query(
{name: "clipboard-write", allowWithoutGesture: true});
const readPerm = await navigator.permissions.query(
{name: "clipboard-read", allowWithoutGesture: false});
if (writePerm.state === "denied" || readPerm.state === "denied") {
return 'denied';
}
if ((writePerm.state === "granted" || writePerm.state === "prompt") &&
(readPerm.state === "granted" || readPerm.state === "prompt")) {
return 'available';
}
} catch {
return 'unsupported';
}
return 'unsupported';
}

// Touch detection
export let isTouchDevice = ('ontouchstart' in document.documentElement) ||
// required for Chrome debugger
Expand Down
4 changes: 4 additions & 0 deletions core/websock.js
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,10 @@ export default class Websock {
return res >>> 0;
}

rQlen() {
return this._rQlen - this._rQi;
}

rQshiftStr(len) {
let str = "";
// Handle large arrays in steps to avoid long strings on the stack
Expand Down
30 changes: 26 additions & 4 deletions docs/API-internal.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,19 @@ keysym values.
* __Display__ (core/display.js): Efficient 2D rendering abstraction
layered on the HTML5 canvas element.

* __Clipboard__ (core/clipboard.js): Clipboard event handler.

* __Websock__ (core/websock.js): Websock client from websockify
with transparent binary data support.
[Websock API](https://github.com/novnc/websockify-js/wiki/websock.js) wiki page.


## 1.2 Callbacks

For the Mouse, Keyboard and Display objects the callback functions are
assigned to configuration attributes, just as for the RFB object. The
WebSock module has a method named 'on' that takes two parameters: the
callback event name, and the callback function.
For the Mouse, Keyboard, Display, and Clipboard objects, the callback
functions are assigned to configuration attributes, just as for the RFB
object. The WebSock module has a method named 'on' that takes two
parameters: the callback event name, and the callback function.

## 2. Modules

Expand Down Expand Up @@ -81,3 +83,23 @@ None
| blitImage | (x, y, width, height, arr, offset, from_queue) | Blit pixels (of R,G,B,A) to the display
| drawImage | (img, x, y) | Draw image and track damage
| autoscale | (containerWidth, containerHeight) | Scale the display

## 2.3 Clipboard module

### 2.3.1 Configuration attributes

None

### 2.3.2 Methods

| name | parameters | description
| ------------------ | ----------------- | ------------
| writeClipboard | (text) | An async write text to clipboard
| grab | () | Begin capturing clipboard events
| ungrab | () | Stop capturing clipboard events

### 2.3.3 Callbacks

| name | parameters | description
| ------- | ---------- | ------------
| onpaste | (text) | Called following a target focus event and an async clipboard read
File renamed without changes.
14 changes: 5 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,20 @@
"name": "@novnc/novnc",
"version": "1.6.0",
"description": "An HTML5 VNC client",
"browser": "lib/rfb",
"directories": {
"lib": "lib",
"doc": "docs",
"test": "tests"
},
"type": "module",
"files": [
"lib",
"core",
"vendor",
"AUTHORS",
"VERSION",
"docs/API.md",
"docs/LIBRARY.md",
"docs/LICENSE*"
],
"exports": "./core/rfb.js",
"scripts": {
"lint": "eslint app core po/po2js po/xgettext-html tests utils",
"test": "karma start karma.conf.js",
"prepublish": "node ./utils/convert.js --clean"
"test": "karma start karma.conf.cjs"
},
"repository": {
"type": "git",
Expand Down
Loading
Loading