From b2b3c44695bfd51930e47a06c78ab2d6531675a5 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Mon, 11 Oct 2021 10:06:43 +0300 Subject: [PATCH] Closing dock tabs with cmd+w on mac (#3849) * Change Close menu item accelerator Signed-off-by: Alex Andreev * Listening global keydown event in Signed-off-by: Alex Andreev * Prevent terminal to fire custom event Signed-off-by: Alex Andreev * Refresh tooltip hint Signed-off-by: Alex Andreev * Make Tab line gray if Dock isn't focused Signed-off-by: Alex Andreev --- src/main/menu.ts | 15 ++++++++---- src/renderer/components/dock/dock-tab.tsx | 3 ++- src/renderer/components/dock/dock.scss | 10 ++++++++ src/renderer/components/dock/dock.tsx | 29 ++++++++++++++++------- src/renderer/components/dock/terminal.ts | 7 +----- 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/main/menu.ts b/src/main/menu.ts index 088f06e06e..8073f7e47c 100644 --- a/src/main/menu.ts +++ b/src/main/menu.ts @@ -147,13 +147,18 @@ export function buildMenu(windowManager: WindowManager) { } } ]), + { type: "separator" }, - { - role: "close", - label: "Close Window" - }, + + ...(isMac ? [ + { + role: "close", + label: "Close Window", + accelerator: "Shift+Cmd+W" + } + ] as MenuItemConstructorOptions[] : []), + ...ignoreOnMac([ - { type: "separator" }, { label: "Exit", accelerator: "Alt+F4", diff --git a/src/renderer/components/dock/dock-tab.tsx b/src/renderer/components/dock/dock-tab.tsx index a42a2dd64b..6bd186579a 100644 --- a/src/renderer/components/dock/dock-tab.tsx +++ b/src/renderer/components/dock/dock-tab.tsx @@ -29,6 +29,7 @@ import { Tab, TabProps } from "../tabs"; import { Icon } from "../icon"; import { Menu, MenuItem } from "../menu"; import { observable, makeObservable } from "mobx"; +import { isMac } from "../../../common/vars"; export interface DockTabProps extends TabProps { moreActions?: React.ReactNode; @@ -94,7 +95,7 @@ export class DockTab extends React.Component { {!pinned && ( )} diff --git a/src/renderer/components/dock/dock.scss b/src/renderer/components/dock/dock.scss index e1cf52e116..ed7dbcdc18 100644 --- a/src/renderer/components/dock/dock.scss +++ b/src/renderer/components/dock/dock.scss @@ -27,6 +27,16 @@ display: flex; flex-direction: column; + &:not(:focus-within) .DockTab.active { + &::after { + color: var(--halfGray); + } + + &:hover::after { + color: var(--line-color-active); + } + } + &.isOpen { &.fullSize { position: fixed; diff --git a/src/renderer/components/dock/dock.tsx b/src/renderer/components/dock/dock.tsx index a8cea06d7b..747fd37a5c 100644 --- a/src/renderer/components/dock/dock.tsx +++ b/src/renderer/components/dock/dock.tsx @@ -46,19 +46,31 @@ interface Props { @observer export class Dock extends React.Component { - onKeydown = (evt: React.KeyboardEvent) => { - const { close, closeTab, selectedTab } = dockStore; + private element = React.createRef(); - if (!selectedTab) return; - const { code, ctrlKey, shiftKey } = evt.nativeEvent; + componentDidMount() { + document.addEventListener("keydown", this.onKeyDown); + } + + componentWillUnmount() { + document.removeEventListener("keydown", this.onKeyDown); + } + + onKeyDown = (evt: KeyboardEvent) => { + const { close, selectedTab, closeTab } = dockStore; + const { code, ctrlKey, metaKey, shiftKey } = evt; + // Determine if user working inside or using any other areas in app + const dockIsFocused = this.element?.current.contains(document.activeElement); + + if (!selectedTab || !dockIsFocused) return; if (shiftKey && code === "Escape") { close(); } - if (ctrlKey && code === "KeyW") { - if (selectedTab.pinned) close(); - else closeTab(selectedTab.id); + if ((ctrlKey && code === "KeyW") || (metaKey && code === "KeyW")) { + closeTab(selectedTab.id); + this.element?.current.focus(); // Avoid loosing focus when closing tab } }; @@ -67,6 +79,7 @@ export class Dock extends React.Component { open(); selectTab(tab.id); + this.element?.current.focus(); }; renderTab(tab: DockTab) { @@ -105,7 +118,7 @@ export class Dock extends React.Component { return (
{ - const { code, ctrlKey, type, metaKey } = evt; + const { code, ctrlKey, metaKey } = evt; // Handle custom hotkey bindings if (ctrlKey) { @@ -248,11 +248,6 @@ export class Terminal { } } - // Pass the event above in DOM for to handle common actions - if (!evt.defaultPrevented) { - this.elem.dispatchEvent(new KeyboardEvent(type, evt)); - } - return true; }; }