tabby-rdp 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileTransfer = exports.STYLE = void 0;
4
+ const fs = require("fs");
5
+ const os = require("os");
6
+ const path = require("path");
7
+ exports.STYLE = `
8
+ .trd-toast { position: absolute; top: 12px; right: 12px; z-index: 2; max-width: min(420px, calc(100% - 24px));
9
+ display: flex; gap: 10px; align-items: center; padding: 8px 10px; border-radius: 6px;
10
+ background: rgba(30, 30, 30, 0.92); color: #ddd; font-size: 12px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.4); }
11
+ .trd-toast-text { flex: auto; white-space: pre-line; }
12
+ .trd-toast .btn { flex: none; padding: 2px 8px; font-size: 12px; }
13
+ .trd-overlay.trd-drop-target::after { content: 'Drop to copy to the remote desktop, then paste there'; position: absolute; inset: 0;
14
+ display: flex; align-items: center; justify-content: center; background: rgba(40, 90, 160, 0.35); color: #fff; font-size: 15px;
15
+ pointer-events: none; }
16
+ `;
17
+ const plural = (n, one) => `${n} ${one}${n === 1 ? '' : 's'}`;
18
+ /**
19
+ * Files through the clipboard, with IronRDP's RdpFileTransferProvider: files dropped on the desktop (or
20
+ * picked) are offered on the remote clipboard, to paste there; files copied on the remote can be saved to
21
+ * the Mac's Downloads folder. Messages show as a small bar over the desktop.
22
+ */
23
+ class FileTransfer {
24
+ constructor(rdp, overlay, log) {
25
+ this.overlay = overlay;
26
+ this.log = log;
27
+ this.toastEl = null;
28
+ /** Files the remote offered last (for tests: saveAll). */
29
+ this.offered = [];
30
+ /** Where the last save went (for tests and "Show in Finder"). */
31
+ this.lastSaved = [];
32
+ this.provider = new rdp.RdpFileTransferProvider({ storageBackend: 'blob' });
33
+ this.provider.on('files-available', (files) => this.offer(files));
34
+ this.provider.on('error', (e) => {
35
+ this.log(`files: ${e?.message ?? JSON.stringify(e)}`);
36
+ this.toast(`File transfer failed: ${e?.message ?? 'unknown error'}`);
37
+ });
38
+ // Drop files on the desktop to send them. Handled here so Tabby doesn't paste their paths into
39
+ // the console under the desktop.
40
+ overlay.addEventListener('dragover', event => {
41
+ if (event.dataTransfer?.types.includes('Files')) {
42
+ event.preventDefault();
43
+ event.stopPropagation();
44
+ overlay.classList.add('trd-drop-target');
45
+ }
46
+ });
47
+ overlay.addEventListener('dragleave', event => {
48
+ if (!overlay.contains(event.relatedTarget)) {
49
+ overlay.classList.remove('trd-drop-target');
50
+ }
51
+ });
52
+ overlay.addEventListener('drop', event => {
53
+ overlay.classList.remove('trd-drop-target');
54
+ if (!event.dataTransfer?.types.includes('Files')) {
55
+ return;
56
+ }
57
+ event.preventDefault();
58
+ event.stopPropagation();
59
+ this.provider.handleDrop(event).then((dropped) => this.send(dropped), (e) => this.toast(`Couldn't read the dropped files: ${e?.message ?? e}`));
60
+ }, true);
61
+ }
62
+ /** Mac → remote: offers the files on the remote clipboard; the remote copies them when they're pasted. */
63
+ send(files) {
64
+ const count = files.filter(f => !f.isDirectory).length;
65
+ if (!count) {
66
+ return;
67
+ }
68
+ try {
69
+ const upload = this.provider.uploadFiles(files);
70
+ this.log(`files: offered ${count} to the remote`);
71
+ this.toast(`${plural(count, 'file')} ready: paste on the remote desktop (⌘V) to copy ${count === 1 ? 'it' : 'them'} there`, [], 0);
72
+ upload.completion.then(() => { this.log('files: pasted on the remote'); this.toast(`Copied ${plural(count, 'file')} to the remote desktop`); }, (e) => { this.log(`files: upload: ${e?.message ?? e}`); this.toast(`Copying to the remote desktop failed: ${e?.message ?? e}`); });
73
+ }
74
+ catch (e) {
75
+ this.toast(`Couldn't offer the files: ${e?.message ?? e}`);
76
+ }
77
+ }
78
+ /** Picks files on the Mac to send. */
79
+ async pickAndSend() {
80
+ const files = await this.provider.showFilePicker({ multiple: true });
81
+ this.send(files);
82
+ }
83
+ /** Remote → Mac: the remote copied files; offer saving them. */
84
+ offer(files) {
85
+ this.offered = files;
86
+ const count = files.filter(f => !f.isDirectory).length;
87
+ this.log(`files: the remote copied ${count}`);
88
+ if (count) {
89
+ this.toast(`${plural(count, 'file')} copied on the remote desktop`, [{ label: 'Save to Downloads', run: () => this.saveAll() }], 15000);
90
+ }
91
+ }
92
+ /** Downloads what the remote offered into a folder (default ~/Downloads), keeping their folder structure. */
93
+ async saveAll(dir = path.join(os.homedir(), 'Downloads')) {
94
+ const files = this.offered;
95
+ const saved = [];
96
+ this.toast(`Saving ${plural(files.filter(f => !f.isDirectory).length, 'file')}…`, [], 0);
97
+ try {
98
+ for (const [index, file] of files.entries()) {
99
+ // Relative paths use `\` (the wire convention); never let one leave the target folder.
100
+ const parts = [...(file.path ?? '').split('\\'), file.name].filter(p => p && p !== '.' && p !== '..');
101
+ if (file.isDirectory) {
102
+ continue;
103
+ }
104
+ const blob = await this.provider.downloadFile(file, index).completion;
105
+ const target = uniquePath(path.join(dir, ...parts));
106
+ await fs.promises.mkdir(path.dirname(target), { recursive: true });
107
+ await fs.promises.writeFile(target, Buffer.from(await blob.arrayBuffer()));
108
+ saved.push(target);
109
+ }
110
+ this.lastSaved = saved;
111
+ this.log(`files: saved ${saved.length}`);
112
+ this.toast(`Saved ${plural(saved.length, 'file')} to ${path.basename(dir)}`, saved.length ? [{
113
+ label: 'Show in Finder',
114
+ run: () => require('electron').shell.showItemInFolder(saved[0]),
115
+ }] : []);
116
+ }
117
+ catch (e) {
118
+ this.log(`files: save: ${e?.message ?? e}`);
119
+ this.toast(`Saving failed: ${e?.message ?? e}`);
120
+ }
121
+ return saved;
122
+ }
123
+ /** A message over the desktop; hides after `hideAfter` ms (0: stays until replaced). */
124
+ toast(text, actions = [], hideAfter = 6000) {
125
+ clearTimeout(this.toastTimer);
126
+ this.toastEl?.remove();
127
+ const el = document.createElement('div');
128
+ el.className = 'trd-toast';
129
+ const label = document.createElement('div');
130
+ label.className = 'trd-toast-text';
131
+ label.textContent = text;
132
+ el.append(label, ...actions.map(action => {
133
+ const button = document.createElement('button');
134
+ button.className = 'btn btn-primary';
135
+ button.textContent = action.label;
136
+ button.addEventListener('click', () => action.run());
137
+ return button;
138
+ }));
139
+ const close = document.createElement('button');
140
+ close.className = 'btn btn-link';
141
+ close.textContent = '×';
142
+ close.title = 'Dismiss';
143
+ close.addEventListener('click', () => el.remove());
144
+ el.append(close);
145
+ this.overlay.appendChild(el);
146
+ this.toastEl = el;
147
+ if (hideAfter) {
148
+ this.toastTimer = setTimeout(() => el.remove(), hideAfter);
149
+ }
150
+ }
151
+ dispose() {
152
+ clearTimeout(this.toastTimer);
153
+ this.toastEl?.remove();
154
+ try {
155
+ this.provider.dispose();
156
+ }
157
+ catch { }
158
+ }
159
+ }
160
+ exports.FileTransfer = FileTransfer;
161
+ /** `file.txt`, or `file 2.txt`, `file 3.txt`… if taken. */
162
+ function uniquePath(target) {
163
+ if (!fs.existsSync(target)) {
164
+ return target;
165
+ }
166
+ const { dir, name, ext } = path.parse(target);
167
+ for (let n = 2;; n++) {
168
+ const candidate = path.join(dir, `${name} ${n}${ext}`);
169
+ if (!fs.existsSync(candidate)) {
170
+ return candidate;
171
+ }
172
+ }
173
+ }
174
+ //# sourceMappingURL=fileTransfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileTransfer.js","sourceRoot":"","sources":["../src/fileTransfer.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -15,13 +15,15 @@ const tabby_terminal_1 = require("tabby-terminal");
15
15
  const desktop_service_1 = require("./desktop.service");
16
16
  const desk_1 = require("./desk");
17
17
  const header_1 = require("./header");
18
+ const keyboard_1 = require("./keyboard");
18
19
  const ssh_1 = require("./ssh");
19
20
  const targets_1 = require("./targets");
20
21
  const ui_1 = require("./ui");
21
22
  let RemoteDesktopModule = class RemoteDesktopModule {
22
- constructor(app, hotkeys, desktop, header, targets, injector) {
23
+ constructor(app, hotkeys, desktop, header, targets, keyboard, injector) {
23
24
  (0, desktop_service_1.installStyle)();
24
25
  header.install();
26
+ keyboard.install(ui_1.TOGGLE_HOTKEY);
25
27
  hotkeys.hotkey$.subscribe((id) => {
26
28
  if (id !== ui_1.TOGGLE_HOTKEY) {
27
29
  return;
@@ -46,7 +48,7 @@ RemoteDesktopModule = __decorate([
46
48
  { provide: tabby_terminal_1.TerminalDecorator, useClass: desk_1.DeskTriggerDecorator, multi: true },
47
49
  ],
48
50
  }),
49
- __metadata("design:paramtypes", [tabby_core_1.AppService, tabby_core_1.HotkeysService, desktop_service_1.RemoteDesktopService, header_1.HeaderControls, targets_1.RemoteTargets, core_1.Injector])
51
+ __metadata("design:paramtypes", [tabby_core_1.AppService, tabby_core_1.HotkeysService, desktop_service_1.RemoteDesktopService, header_1.HeaderControls, targets_1.RemoteTargets, keyboard_1.DesktopKeyboard, core_1.Injector])
50
52
  ], RemoteDesktopModule);
51
53
  exports.default = RemoteDesktopModule;
52
54
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,wCAAkD;AAClD,2CAAmH;AACnH,mDAAkD;AAClD,uDAAsE;AACtE,iCAA6C;AAC7C,qCAAyC;AACzC,+BAAkC;AAClC,uCAAwD;AACxD,6BAEa;AAWE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACpC,YAAa,GAAe,EAAE,OAAuB,EAAE,OAA6B,EAAE,MAAsB,EAAE,OAAsB,EAAE,QAAkB;QACpJ,IAAA,8BAAY,GAAE,CAAA;QACd,MAAM,CAAC,OAAO,EAAE,CAAA;QAChB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAU,EAAE,EAAE;YACrC,IAAI,EAAE,KAAK,kBAAa,EAAE,CAAC;gBACvB,OAAM;YACV,CAAC;YACD,MAAM,IAAI,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACzC,IAAI,IAAI,EAAE,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACxB,CAAC;QACL,CAAC,CAAC,CAAA;QACF,sDAAsD;QACtD,MAAM,CAAC,GAAG,MAAa,CAAA;QACvB,CAAC,CAAC,eAAe,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAb,uBAAa,EAAE,QAAQ,EAAE,UAAU,EAAV,gBAAU,EAAE,CAAA;IACtF,CAAC;CACJ,CAAA;AAjBoB,mBAAmB;IATvC,IAAA,eAAQ,EAAC;QACN,SAAS,EAAE;YACP,EAAE,OAAO,EAAE,2BAAc,EAAE,QAAQ,EAAE,yBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE;YACxE,EAAE,OAAO,EAAE,2BAAc,EAAE,QAAQ,EAAE,wBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE;YACvE,EAAE,OAAO,EAAE,uCAA0B,EAAE,QAAQ,EAAE,6BAAwB,EAAE,KAAK,EAAE,IAAI,EAAE;YACxF,EAAE,OAAO,EAAE,kCAAiB,EAAE,QAAQ,EAAE,+BAA0B,EAAE,KAAK,EAAE,IAAI,EAAE;YACjF,EAAE,OAAO,EAAE,kCAAiB,EAAE,QAAQ,EAAE,2BAAoB,EAAE,KAAK,EAAE,IAAI,EAAE;SAC9E;KACJ,CAAC;qCAEoB,uBAAU,EAAW,2BAAc,EAAW,sCAAoB,EAAU,uBAAc,EAAW,uBAAa,EAAY,eAAQ;GADvI,mBAAmB,CAiBvC;kBAjBoB,mBAAmB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,wCAAkD;AAClD,2CAAmH;AACnH,mDAAkD;AAClD,uDAAsE;AACtE,iCAA6C;AAC7C,qCAAyC;AACzC,yCAA4C;AAC5C,+BAAkC;AAClC,uCAAwD;AACxD,6BAEa;AAWE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACpC,YAAa,GAAe,EAAE,OAAuB,EAAE,OAA6B,EAAE,MAAsB,EAAE,OAAsB,EAAE,QAAyB,EAAE,QAAkB;QAC/K,IAAA,8BAAY,GAAE,CAAA;QACd,MAAM,CAAC,OAAO,EAAE,CAAA;QAChB,QAAQ,CAAC,OAAO,CAAC,kBAAa,CAAC,CAAA;QAC/B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAU,EAAE,EAAE;YACrC,IAAI,EAAE,KAAK,kBAAa,EAAE,CAAC;gBACvB,OAAM;YACV,CAAC;YACD,MAAM,IAAI,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACzC,IAAI,IAAI,EAAE,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACxB,CAAC;QACL,CAAC,CAAC,CAAA;QACF,sDAAsD;QACtD,MAAM,CAAC,GAAG,MAAa,CAAA;QACvB,CAAC,CAAC,eAAe,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAb,uBAAa,EAAE,QAAQ,EAAE,UAAU,EAAV,gBAAU,EAAE,CAAA;IACtF,CAAC;CACJ,CAAA;AAlBoB,mBAAmB;IATvC,IAAA,eAAQ,EAAC;QACN,SAAS,EAAE;YACP,EAAE,OAAO,EAAE,2BAAc,EAAE,QAAQ,EAAE,yBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE;YACxE,EAAE,OAAO,EAAE,2BAAc,EAAE,QAAQ,EAAE,wBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE;YACvE,EAAE,OAAO,EAAE,uCAA0B,EAAE,QAAQ,EAAE,6BAAwB,EAAE,KAAK,EAAE,IAAI,EAAE;YACxF,EAAE,OAAO,EAAE,kCAAiB,EAAE,QAAQ,EAAE,+BAA0B,EAAE,KAAK,EAAE,IAAI,EAAE;YACjF,EAAE,OAAO,EAAE,kCAAiB,EAAE,QAAQ,EAAE,2BAAoB,EAAE,KAAK,EAAE,IAAI,EAAE;SAC9E;KACJ,CAAC;qCAEoB,uBAAU,EAAW,2BAAc,EAAW,sCAAoB,EAAU,uBAAc,EAAW,uBAAa,EAAY,0BAAe,EAAY,eAAQ;GADlK,mBAAmB,CAkBvC;kBAlBoB,mBAAmB"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DesktopKeyboard = void 0;
13
+ const core_1 = require("@angular/core");
14
+ const tabby_core_1 = require("tabby-core");
15
+ const desktop_service_1 = require("./desktop.service");
16
+ const targets_1 = require("./targets");
17
+ /**
18
+ * Tabby shortcuts that keep working while a desktop covers the pane: getting back to the console, and moving
19
+ * between tabs. Everything else (⌘W, ⌘T, ⌘V paste, …) belongs to the remote desktop then; Tabby would otherwise
20
+ * act on the terminal underneath (⌘V pasted the Mac clipboard into the hidden SSH console).
21
+ */
22
+ /** Modifier and lock keys: macOS does send their keyups, and they must stay down until then. */
23
+ const MODIFIERS = /^(Shift|Control|Alt|Meta|OS)(Left|Right)$|^(CapsLock|Fn|FnLock|NumLock|ScrollLock)$/;
24
+ const TABBY_SHORTCUTS = new Set(['next-tab', 'previous-tab', 'next-mru-tab', 'previous-mru-tab', 'toggle-last-tab', 'toggle-fullscreen']);
25
+ /**
26
+ * Routes the keyboard while a remote desktop has it:
27
+ * - Tabby's hotkeys: only the desktop/console switch and TABBY_SHORTCUTS fire, and those don't reach the remote.
28
+ * - Mac shortcuts (setting, on by default): ⌘ is sent as Ctrl, so ⌘C/⌘V/⌘Z/… do what they do on a Mac, and
29
+ * tapping ⌘ on its own is the Windows/Super key (Start, Activities). Off: ⌘ is the Windows/Super key.
30
+ * - macOS sends no keyup for a key pressed while ⌘ is down; the remote gets one right after the keydown, so
31
+ * the key doesn't stay pressed there.
32
+ */
33
+ let DesktopKeyboard = class DesktopKeyboard {
34
+ constructor(app, hotkeys, desktop, zone) {
35
+ this.app = app;
36
+ this.hotkeys = hotkeys;
37
+ this.desktop = desktop;
38
+ this.zone = zone;
39
+ /** The copies handed to IronRDP (they pass this module's window listener too). */
40
+ this.copies = new WeakSet();
41
+ /** The pane a key event started on: a Tabby shortcut (⌘1) can switch tabs before this module sees it. */
42
+ this.startedOn = new WeakMap();
43
+ /** ⌘ is down and nothing else was pressed with it (a tap sends the Windows key). */
44
+ this.metaAlone = false;
45
+ }
46
+ install(toggleHotkey) {
47
+ // Tabby matches hotkeys in a document listener; filter what it may match while a desktop covers the pane.
48
+ const hotkeys = this.hotkeys;
49
+ const match = hotkeys.matchActiveHotkey?.bind(hotkeys);
50
+ if (typeof match === 'function') {
51
+ hotkeys.matchActiveHotkey = (partial) => {
52
+ const id = match(partial);
53
+ if (id && this.coveredPane() && id !== toggleHotkey && !TABBY_SHORTCUTS.has(id) && !/^tab-\d+$/.test(id)) {
54
+ return null;
55
+ }
56
+ return id;
57
+ };
58
+ }
59
+ // On window: after Tabby's hotkey listener (on document, registered once Tabby's config has loaded,
60
+ // which can be after this) and, registered at startup, before IronRDP's (window, per desktop).
61
+ this.zone.runOutsideAngular(() => {
62
+ for (const type of ['keydown', 'keyup']) {
63
+ window.addEventListener(type, event => this.startedOn.set(event, this.coveredPane()), true);
64
+ window.addEventListener(type, event => this.copies.has(event) || this.route(event));
65
+ }
66
+ });
67
+ }
68
+ /** The active pane, while a desktop (or its sign-in or add form) covers it. */
69
+ coveredPane() {
70
+ const pane = (0, targets_1.desktopPaneOf)(this.app.activeTab);
71
+ if (!pane) {
72
+ return null;
73
+ }
74
+ return this.desktop.isVisible(pane) || pane.element.nativeElement.querySelector('.trd-form-overlay') ? pane : null;
75
+ }
76
+ route(event) {
77
+ const pane = this.startedOn.has(event) ? this.startedOn.get(event) : this.coveredPane();
78
+ const focused = document.activeElement;
79
+ if (!pane || focused?.tagName !== 'IRON-REMOTE-DESKTOP' || !pane.element.nativeElement.contains(focused)) {
80
+ return;
81
+ }
82
+ // A Tabby shortcut Tabby just acted on: not for the remote.
83
+ if (event.type === 'keydown' && this.hotkeys.pressedHotkey) {
84
+ this.metaAlone = false;
85
+ event.stopImmediatePropagation();
86
+ event.preventDefault();
87
+ return;
88
+ }
89
+ const isMeta = event.code === 'MetaLeft' || event.code === 'MetaRight';
90
+ const macShortcuts = process.platform === 'darwin' && this.desktop.settings().macShortcuts;
91
+ if (macShortcuts && (isMeta || event.metaKey)) {
92
+ // Replace the event for IronRDP: ⌘ becomes Ctrl.
93
+ event.stopImmediatePropagation();
94
+ event.preventDefault();
95
+ if (event.type === 'keydown') {
96
+ this.metaAlone = isMeta && !event.repeat ? true : isMeta && this.metaAlone;
97
+ }
98
+ this.forward(event, isMeta ? { key: 'Control', code: event.code === 'MetaRight' ? 'ControlRight' : 'ControlLeft' } : {});
99
+ if (isMeta && event.type === 'keyup' && this.metaAlone) {
100
+ // ⌘ tapped on its own: the Windows key.
101
+ this.metaAlone = false;
102
+ const win = { key: 'Meta', code: event.code === 'MetaRight' ? 'MetaRight' : 'MetaLeft', plain: true };
103
+ this.forward(event, win, 'keydown');
104
+ this.forward(event, win, 'keyup');
105
+ }
106
+ if (event.type === 'keydown' && !MODIFIERS.test(event.code)) {
107
+ this.forward(event, {}, 'keyup');
108
+ }
109
+ return;
110
+ }
111
+ if (process.platform === 'darwin' && event.type === 'keydown' && event.metaKey && !MODIFIERS.test(event.code)) {
112
+ // ⌘ stays the Windows key: IronRDP gets this keydown as is, plus the keyup macOS won't send.
113
+ setTimeout(() => this.forward(event, {}, 'keyup'));
114
+ }
115
+ }
116
+ /** Hands IronRDP (its listeners are on window) a copy of the event, with ⌘ mapped to Ctrl when asked. */
117
+ forward(event, change, type = event.type) {
118
+ // `plain`: send the key as is (the Windows key for a ⌘ tap), not mapped.
119
+ const macShortcuts = process.platform === 'darwin' && this.desktop.settings().macShortcuts && !change.plain;
120
+ const copy = new KeyboardEvent(type, {
121
+ key: change.key ?? event.key,
122
+ code: change.code ?? event.code,
123
+ location: event.location,
124
+ repeat: event.repeat,
125
+ shiftKey: event.shiftKey,
126
+ altKey: event.altKey,
127
+ ctrlKey: macShortcuts ? event.ctrlKey || event.metaKey : event.ctrlKey,
128
+ metaKey: macShortcuts ? false : event.metaKey,
129
+ cancelable: true,
130
+ });
131
+ this.copies.add(copy);
132
+ window.dispatchEvent(copy);
133
+ }
134
+ };
135
+ exports.DesktopKeyboard = DesktopKeyboard;
136
+ exports.DesktopKeyboard = DesktopKeyboard = __decorate([
137
+ (0, core_1.Injectable)({ providedIn: 'root' }),
138
+ __metadata("design:paramtypes", [tabby_core_1.AppService,
139
+ tabby_core_1.HotkeysService,
140
+ desktop_service_1.RemoteDesktopService,
141
+ core_1.NgZone])
142
+ ], DesktopKeyboard);
143
+ //# sourceMappingURL=keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,18 @@ command -v gnome-shell >/dev/null 2>&1 || fail "gnome-shell is not installed"
15
15
  if systemctl --user is-active -q gnome-remote-desktop.service; then
16
16
  fail "a desktop-session GNOME Remote Desktop is already running for this user"
17
17
  fi
18
- D="$HOME/.local/share/tabby-remote-desktop"
18
+ D="$HOME/.local/share/tabby-rdp"
19
+ # Before 0.2 this was ~/.local/share/tabby-remote-desktop, with a '# tabby-remote-desktop' login hook: move it over
20
+ # once (keys, password, helpers) and drop the old hook line (the 'desk' part below adds the current one if wanted).
21
+ OLD="$HOME/.local/share/tabby-remote-desktop"
22
+ if [ -d "$OLD" ] && [ ! -e "$D" ]; then
23
+ mv "$OLD" "$D" || fail "could not move $OLD to $D"
24
+ fi
25
+ for rc in "$HOME/.bashrc" "$HOME/.zshrc"; do
26
+ if [ -f "$rc" ] && grep -qF '# tabby-remote-desktop' "$rc"; then
27
+ sed -i.trd-bak '/# tabby-remote-desktop$/d' "$rc" && rm -f "$rc.trd-bak"
28
+ fi
29
+ done
19
30
  mkdir -p "$D" && chmod 700 "$D" || fail "could not create $D"
20
31
  if [ ! -s "$D/tls.key" ]; then
21
32
  openssl req -new -newkey rsa:3072 -days 3650 -nodes -x509 -subj "/CN=$(hostname)" \
@@ -30,7 +41,7 @@ cat > "$D/login.sh" <<'TRD_EOF'
30
41
  # tabby-rdp ('desk' setting): interactive SSH logins run inside a shareable session, so 'desk' in Tabby can
31
42
  # bring this console to the remote desktop. Backend ("native" trd-pty or "tmux") is in $TRD_HOME/backend.
32
43
  # Set TABBY_NO_SESSION=1 (or TABBY_NO_TMUX=1) to skip; turning 'desk' off in Tabby removes this hook.
33
- TRD_HOME="$HOME/.local/share/tabby-remote-desktop"
44
+ TRD_HOME="$HOME/.local/share/tabby-rdp"
34
45
  case ":$PATH:" in *":$TRD_HOME/bin:"*) ;; *) PATH="$TRD_HOME/bin:$PATH"; export PATH ;; esac
35
46
  case $- in *i*) ;; *) return 0 ;; esac
36
47
  if [ -n "$SSH_TTY" ] && [ -z "$TMUX" ] && [ -z "$TRD_SESSION" ] && [ -z "$TABBY_NO_TMUX$TABBY_NO_SESSION" ]; then
@@ -87,15 +98,15 @@ chmod 755 "$D/bin/trd-pty"
87
98
  printf '%s\n' "${"$"}{TRD_BACKEND:-native}" > "$D/backend"
88
99
  for rc in "$HOME/.bashrc" "$HOME/.zshrc"; do
89
100
  [ -f "$rc" ] || continue
90
- grep -qF '# tabby-remote-desktop' "$rc" && continue
101
+ grep -qF '# tabby-rdp' "$rc" && continue
91
102
  # Only one line: turning desk off deletes exactly it, so on/off cycles leave the file as it was.
92
103
  [ -z "$(tail -c1 "$rc")" ] || echo >> "$rc"
93
- printf '[ -f "$HOME/.local/share/tabby-remote-desktop/login.sh" ] && . "$HOME/.local/share/tabby-remote-desktop/login.sh" # tabby-remote-desktop\n' >> "$rc"
104
+ printf '[ -f "$HOME/.local/share/tabby-rdp/login.sh" ] && . "$HOME/.local/share/tabby-rdp/login.sh" # tabby-rdp\n' >> "$rc"
94
105
  done
95
106
  else
96
107
  for rc in "$HOME/.bashrc" "$HOME/.zshrc"; do
97
- if [ -f "$rc" ] && grep -qF '# tabby-remote-desktop' "$rc"; then
98
- sed -i.trd-bak '/# tabby-remote-desktop$/d' "$rc" && rm -f "$rc.trd-bak"
108
+ if [ -f "$rc" ] && grep -qF '# tabby-rdp' "$rc"; then
109
+ sed -i.trd-bak '/# tabby-rdp$/d' "$rc" && rm -f "$rc.trd-bak"
99
110
  fi
100
111
  done
101
112
  # Sessions already running keep going; new logins are plain again.
@@ -171,6 +182,7 @@ function trdPty() {
171
182
  trdPtySource ??= fs.readFileSync(path.join(__dirname, '..', 'remote', 'trd-pty.py'), 'utf8');
172
183
  return trdPtySource;
173
184
  }
185
+ /** Makes sure the remote user has a headless GNOME session served by grd, with fresh credentials. */
174
186
  async function prepareRemoteDesktop(target, desk, backend = 'native') {
175
187
  const script = `TRD_DESK=${desk ? 1 : 0}\nTRD_BACKEND=${backend === 'tmux' ? 'tmux' : 'native'}\n` +
176
188
  SETUP_SCRIPT.replace('@@TRD_PTY_PY@@', trdPty().trimEnd());
@@ -1 +1 @@
1
- {"version":3,"file":"remoteSetup.js","sourceRoot":"","sources":["../src/remoteSetup.ts"],"names":[],"mappings":";;AAwLA,oDAaC;AArMD,yBAAwB;AACxB,6BAA4B;AAS5B,kHAAkH;AAClH,yGAAyG;AACzG,2GAA2G;AAC3G,yGAAyG;AACzG,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;QAiBvB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+DAqE2C,GAAG;;;;;;;;OAQ3D,GAAG;;;;CAIT,CAAA;AAMD,IAAI,YAAY,GAAkB,IAAI,CAAA;AACtC,SAAS,MAAM;IACX,YAAY,KAAK,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5F,OAAO,YAAY,CAAA;AACvB,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAE,MAAoB,EAAE,IAAa,EAAE,UAA0B,QAAQ;IAC/G,MAAM,MAAM,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI;QAC9F,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC9C,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtC,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC;IACD,MAAM,EAAE,GAAG,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChE,IAAI,CAAC,EAAE,EAAE,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AACpE,CAAC"}
1
+ {"version":3,"file":"remoteSetup.js","sourceRoot":"","sources":["../src/remoteSetup.ts"],"names":[],"mappings":";;AAmMA,oDAaC;AAhND,yBAAwB;AACxB,6BAA4B;AAS5B,kHAAkH;AAClH,yGAAyG;AACzG,2GAA2G;AAC3G,yGAAyG;AACzG,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4BvB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+DAqE2C,GAAG;;;;;;;;OAQ3D,GAAG;;;;CAIT,CAAA;AAKD,IAAI,YAAY,GAAkB,IAAI,CAAA;AACtC,SAAS,MAAM;IACX,YAAY,KAAK,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5F,OAAO,YAAY,CAAA;AACvB,CAAC;AAED,qGAAqG;AAC9F,KAAK,UAAU,oBAAoB,CAAE,MAAoB,EAAE,IAAa,EAAE,UAA0B,QAAQ;IAC/G,MAAM,MAAM,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI;QAC9F,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC9C,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtC,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC;IACD,MAAM,EAAE,GAAG,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChE,IAAI,CAAC,EAAE,EAAE,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AACpE,CAAC"}
package/dist/ssh.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isSSHTab = isSSHTab;
4
+ exports.isConnected = isConnected;
4
5
  exports.openTcpStream = openTcpStream;
5
6
  exports.execRemote = execRemote;
6
7
  const sshChannelStream_1 = require("./sshChannelStream");
@@ -8,9 +9,26 @@ function isSSHTab(tab) {
8
9
  // The profile is set when the tab is created; sshSession only once it connects.
9
10
  return tab?.profile?.type === 'ssh' && !!tab.element?.nativeElement;
10
11
  }
12
+ // SSH sessions Tabby has torn down. They still say `open` afterwards, and the tab keeps them until it reconnects.
13
+ const destroyed = new WeakSet();
14
+ const watched = new WeakSet();
15
+ /** Whether the tab's SSH connection is up (not closed, not torn down). */
16
+ function isConnected(tab) {
17
+ const session = tab.sshSession;
18
+ if (!session) {
19
+ return false;
20
+ }
21
+ if (!watched.has(session)) {
22
+ watched.add(session);
23
+ // willDestroy$ completes after it fires, so subscribing late still reports it.
24
+ const mark = () => destroyed.add(session);
25
+ session.willDestroy$?.subscribe({ next: mark, complete: mark });
26
+ }
27
+ return !!session.open && !destroyed.has(session);
28
+ }
11
29
  function client(tab) {
12
30
  const ssh = tab.sshSession?.ssh;
13
- if (!tab.sshSession?.open || typeof ssh?.openTCPForwardChannel !== 'function') {
31
+ if (!isConnected(tab) || typeof ssh?.openTCPForwardChannel !== 'function') {
14
32
  throw new Error('The SSH connection is not open');
15
33
  }
16
34
  return ssh;
@@ -18,13 +36,19 @@ function client(tab) {
18
36
  /** A direct-tcpip channel to host:port as the remote sees it (e.g. its own 127.0.0.1), as a Node stream. */
19
37
  async function openTcpStream(tab, host, port) {
20
38
  const ssh = client(tab);
39
+ const session = tab.sshSession;
21
40
  const channel = await ssh.activateChannel(await ssh.openTCPForwardChannel({
22
41
  addressToConnectTo: host,
23
42
  portToConnectTo: port,
24
43
  originatorAddress: '127.0.0.1',
25
44
  originatorPort: 0,
26
45
  }));
27
- return new sshChannelStream_1.SSHChannelStream(channel);
46
+ const stream = new sshChannelStream_1.SSHChannelStream(channel);
47
+ // When Tabby tears the SSH session down (dropped connection, Reconnect), its channels don't report closing:
48
+ // end the stream then, so the desktop notices instead of freezing.
49
+ const gone = session?.willDestroy$?.subscribe(() => stream.destroy(new Error('the SSH connection closed')));
50
+ stream.once('close', () => gone?.unsubscribe());
51
+ return stream;
28
52
  }
29
53
  /** Runs `command` on the remote with `stdin`, returns stdout. No PTY, no exit status (russh doesn't expose it). */
30
54
  async function execRemote(tab, command, stdin = '', timeoutMs = 60000) {
package/dist/ssh.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
package/dist/targets.js CHANGED
@@ -109,6 +109,8 @@ class SystemSSHTarget {
109
109
  });
110
110
  return stream;
111
111
  }
112
+ // Each tunnel and command is its own ssh process.
113
+ isOpen() { return true; }
112
114
  exec(command, stdin) {
113
115
  return new Promise((resolve, reject) => {
114
116
  const child = (0, child_process_1.spawn)('ssh', [...this.args('-T'), command], { stdio: ['pipe', 'pipe', 'pipe'] });
@@ -142,6 +144,10 @@ class TabbySSHTarget {
142
144
  }
143
145
  openTcp(host, port) { return (0, ssh_1.openTcpStream)(this.tab, host, port); }
144
146
  exec(command, stdin) { return (0, ssh_1.execRemote)(this.tab, command, stdin); }
147
+ isOpen() { return (0, ssh_1.isConnected)(this.tab); }
148
+ get reconnectSSH() {
149
+ return typeof this.tab.reconnect === 'function' ? () => this.tab.reconnect() : undefined;
150
+ }
145
151
  }
146
152
  // ---- detection ---------------------------------------------------------------------------------
147
153
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}
package/dist/ui.js CHANGED
@@ -44,6 +44,10 @@ let RemoteDesktopConfig = class RemoteDesktopConfig extends tabby_core_1.ConfigP
44
44
  sharpness: 'standard',
45
45
  // `desk`: installs a login hook on remotes (applied the next time a desktop opens there).
46
46
  desk: false,
47
+ // macOS: ⌘ acts as Ctrl on the remote desktop (false: ⌘ is the Windows/Super key).
48
+ macShortcuts: true,
49
+ // Play the remote desktop's sound (applies on the next connect).
50
+ sound: true,
47
51
  // More desktops behind SSH hosts (e.g. a Windows VM whose RDP port the host forwards); see desktops.ts.
48
52
  desktops: [],
49
53
  },
@@ -108,6 +112,9 @@ let RemoteDesktopContextMenu = class RemoteDesktopContextMenu extends tabby_core
108
112
  label: toggleLabel(this.desktop, pane),
109
113
  click: () => this.desktop.toggle(pane),
110
114
  }, ...desktopChoices(this.desktop, pane, this.targets.cached(pane)?.label)];
115
+ if (this.desktop.isConnected(pane)) {
116
+ items.push({ label: 'Send files to the remote desktop…', click: () => this.desktop.sendFiles(pane) });
117
+ }
111
118
  if (this.desktop.has(pane)) {
112
119
  items.push({ label: 'Disconnect remote desktop', click: () => this.desktop.disconnect(pane) });
113
120
  }
@@ -145,6 +152,18 @@ function settingsMenu(desktop) {
145
152
  checked: current.desk,
146
153
  click: () => desktop.updateSettings({ desk: !current.desk }),
147
154
  },
155
+ {
156
+ type: 'checkbox',
157
+ label: 'Play the remote desktop\'s sound (applies on the next connect)',
158
+ checked: current.sound,
159
+ click: () => desktop.updateSettings({ sound: !current.sound }),
160
+ },
161
+ ...process.platform === 'darwin' ? [{
162
+ type: 'checkbox',
163
+ label: 'Mac shortcuts on the remote desktop (⌘C, ⌘V, ⌘Z… act as Ctrl+C, Ctrl+V…; off: ⌘ is the Windows key)',
164
+ checked: current.macShortcuts,
165
+ click: () => desktop.updateSettings({ macShortcuts: !current.macShortcuts }),
166
+ }] : [],
148
167
  { type: 'separator' },
149
168
  {
150
169
  label: 'Remove a desktop',