From 8c78ca949ebc7ad6d3d2d63725e6632dded8148c Mon Sep 17 00:00:00 2001 From: Mehmet Bektas Date: Tue, 7 Mar 2023 22:32:47 -0800 Subject: [PATCH] ability to configure Ctrl + W behavior --- src/main/app.ts | 11 +++++++- src/main/config/settings.ts | 10 +++++++ src/main/eventtypes.ts | 3 +- src/main/labview/labview.ts | 34 +++++++++++++++++++++++ src/main/settingsdialog/preload.ts | 3 ++ src/main/settingsdialog/settingsdialog.ts | 22 +++++++++++++-- 6 files changed, 79 insertions(+), 4 deletions(-) diff --git a/src/main/app.ts b/src/main/app.ts index 684d06bd..ad39529c 100644 --- a/src/main/app.ts +++ b/src/main/app.ts @@ -21,6 +21,7 @@ import { IServerFactory, JupyterServerFactory } from './server'; import { connectAndGetServerInfo, IJupyterServerInfo } from './connect'; import { UpdateDialog } from './updatedialog/updatedialog'; import { + CtrlWBehavior, DEFAULT_WIN_HEIGHT, DEFAULT_WIN_WIDTH, LogLevel, @@ -377,7 +378,8 @@ export class JupyterApplication implements IApplication, IDisposable { overrideDefaultServerArgs: userSettings.getValue( SettingType.overrideDefaultServerArgs ), - serverEnvVars: userSettings.getValue(SettingType.serverEnvVars) + serverEnvVars: userSettings.getValue(SettingType.serverEnvVars), + ctrlWBehavior: userSettings.getValue(SettingType.ctrlWBehavior) }, this._registry ); @@ -791,6 +793,13 @@ export class JupyterApplication implements IApplication, IDisposable { } ); + this._evm.registerEventHandler( + EventTypeMain.SetCtrlWBehavior, + (_event, behavior: CtrlWBehavior) => { + userSettings.setValue(SettingType.ctrlWBehavior, behavior); + } + ); + this._evm.registerSyncEventHandler( EventTypeMain.GetServerInfo, (event): Promise => { diff --git a/src/main/config/settings.ts b/src/main/config/settings.ts index 53fc60d2..976f1c5e 100644 --- a/src/main/config/settings.ts +++ b/src/main/config/settings.ts @@ -33,6 +33,12 @@ export enum LogLevel { Debug = 'debug' } +export enum CtrlWBehavior { + Close = 'close', + Warn = 'warn', + DoNotClose = 'do-not-close' +} + export type KeyValueMap = { [key: string]: string }; export enum SettingType { @@ -52,6 +58,8 @@ export enum SettingType { startupMode = 'startupMode', + ctrlWBehavior = 'ctrlWBehavior', + logLevel = 'logLevel' } @@ -137,6 +145,8 @@ export class UserSettings { startupMode: new Setting(StartupMode.WelcomePage), + ctrlWBehavior: new Setting(CtrlWBehavior.Close), + logLevel: new Setting(LogLevel.Warn) }; diff --git a/src/main/eventtypes.ts b/src/main/eventtypes.ts index 3f38fa32..cefa0320 100644 --- a/src/main/eventtypes.ts +++ b/src/main/eventtypes.ts @@ -54,7 +54,8 @@ export enum EventTypeMain { ShowInvalidPythonPathMessage = 'show-invalid-python-path-message', SetLogLevel = 'set-log-level', SetServerLaunchArgs = 'set-server-launch-args', - SetServerEnvVars = 'set-server-env-vars' + SetServerEnvVars = 'set-server-env-vars', + SetCtrlWBehavior = 'set-ctrl-w-behavior' } // events sent to Renderer process diff --git a/src/main/labview/labview.ts b/src/main/labview/labview.ts index f3fd9751..c6c9c2a9 100644 --- a/src/main/labview/labview.ts +++ b/src/main/labview/labview.ts @@ -4,6 +4,7 @@ import { BrowserView, clipboard, + dialog, Menu, MenuItemConstructorOptions } from 'electron'; @@ -21,8 +22,10 @@ import { } from '../utils'; import { SessionWindow } from '../sessionwindow/sessionwindow'; import { + CtrlWBehavior, FrontEndMode, SettingType, + userSettings, WorkspaceSettings } from '../config/settings'; import { IDisposable } from '../tokens'; @@ -112,6 +115,37 @@ export class LabView implements IDisposable { this._labUIReady = true; }); } + + const ctrlWBehavior = userSettings.getValue(SettingType.ctrlWBehavior); + + if (ctrlWBehavior !== CtrlWBehavior.Close) { + this._view.webContents.on('before-input-event', (event, input) => { + if ( + input.code === 'KeyW' && + ((input.meta && process.platform === 'darwin') || input.control) + ) { + let skipClose = false; + + if (ctrlWBehavior === CtrlWBehavior.Warn) { + const choice = dialog.showMessageBoxSync({ + type: 'warning', + message: 'Do you want to close the session?', + buttons: ['Close session', 'Cancel'], + defaultId: 1, + cancelId: 1 + }); + + skipClose = choice === 1; + } else { + skipClose = true; + } + + if (skipClose) { + event.preventDefault(); + } + } + }); + } } public get view(): BrowserView { diff --git a/src/main/settingsdialog/preload.ts b/src/main/settingsdialog/preload.ts index c62b89fc..af066410 100644 --- a/src/main/settingsdialog/preload.ts +++ b/src/main/settingsdialog/preload.ts @@ -102,6 +102,9 @@ contextBridge.exposeInMainWorld('electronAPI', { }, setServerEnvVars: (serverEnvVars: any) => { ipcRenderer.send(EventTypeMain.SetServerEnvVars, serverEnvVars); + }, + setCtrlWBehavior: (behavior: string) => { + ipcRenderer.send(EventTypeMain.SetCtrlWBehavior, behavior); } }); diff --git a/src/main/settingsdialog/settingsdialog.ts b/src/main/settingsdialog/settingsdialog.ts index b1d85e4a..e9c8717d 100644 --- a/src/main/settingsdialog/settingsdialog.ts +++ b/src/main/settingsdialog/settingsdialog.ts @@ -8,6 +8,7 @@ import * as fs from 'fs'; const semver = require('semver'); import { ThemedWindow } from '../dialog/themedwindow'; import { + CtrlWBehavior, FrontEndMode, KeyValueMap, LogLevel, @@ -40,7 +41,8 @@ export class SettingsDialog { logLevel, serverArgs, overrideDefaultServerArgs, - serverEnvVars + serverEnvVars, + ctrlWBehavior } = options; const installUpdatesAutomaticallyEnabled = process.platform === 'darwin'; const installUpdatesAutomatically = @@ -85,6 +87,8 @@ export class SettingsDialog { } } + const ctrlWLabel = process.platform === 'darwin' ? 'Cmd + W' : 'Ctrl + W'; + const template = `