From 0ab7cda4d5f8e0cfe0d1776e17a6066b15c2f5c8 Mon Sep 17 00:00:00 2001 From: Mauro Balades Date: Sun, 11 Aug 2024 13:37:44 +0200 Subject: [PATCH] refactor: Update ZenKeyboardShortcuts to include split view and workspace actions This commit updates the ZenKeyboardShortcuts module to include new actions for split view and workspace management. It adds shortcuts for toggling between grid, vertical, and horizontal split views, as well as closing split views. Additionally, it introduces a shortcut for changing workspaces. The changes also include the addition of default shortcuts for the new actions and the initialization of shortcuts only on the browser page. Refactor other modules: - Remove unnecessary console.log statement in ZenThemeBuilder - Disable Firefox shortcuts in ZenKeyboardShortcuts - Remove redundant code in ZenViewSplitter Refactor ZenProfileDialogUI: - Improve profiles list and profile creation Refactor ZenWorkspaces.mjs: - Remove unnecessary code Refactor ZenViewSplitter.mjs: - Activate docShell for tab - Remove redundant code --- .gitattributes | 5 ++- src/ZenKeyboardShortcuts.mjs | 87 +++++++++++++++++++++++++++++++++--- src/ZenViewSplitter.mjs | 23 +++++++++- src/ZenWorkspaces.mjs | 11 ++++- 4 files changed, 117 insertions(+), 9 deletions(-) diff --git a/.gitattributes b/.gitattributes index 40b88b3..4876450 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,4 @@ -*.mjs linguist-language=TypeScript \ No newline at end of file +*.mjs linguist-language=TypeScript + +*-c.patch linguist-language=C++ +*-cpp.patch linguist-language=C++ \ No newline at end of file diff --git a/src/ZenKeyboardShortcuts.mjs b/src/ZenKeyboardShortcuts.mjs index edb8922..4493994 100644 --- a/src/ZenKeyboardShortcuts.mjs +++ b/src/ZenKeyboardShortcuts.mjs @@ -3,6 +3,15 @@ const kZKSActions = { // Note: If they start with "command:", it means that "command=" will be added to the key element, // otherwise "oncommand=" will be added. + // Split view actions + zenSplitViewGrid: ["gZenViewSplitter.toggleShortcut('grid')", "zen-split-view-grid", "split-view-action"], + zenSplitViewVertical: ["gZenViewSplitter.toggleShortcut('hsplit')", "zen-split-view-vertical", "split-view-action"], + zenSplitViewHorizontal: ["gZenViewSplitter.toggleShortcut('vsplit')", "zen-split-view-horizontal", "split-view-action"], + zenSplitViewClose: ["gZenViewSplitter.toggleShortcut('unsplit')", "zen-split-view-close", "split-view-action"], + + // Workspace actions + zenChangeWorkspace: ["ZenWorkspaces.changeWorkspaceShortcut()", "zen-change-workspace", "workspace-action"], + // manage actions openNewTab: ["command:cmd_newNavigatorTabNoEvent","open-new-tab", "tab-action"], closeTab: ["command:cmd_close", "close-tab", "tab-action"], @@ -91,6 +100,25 @@ const kZKSActions = { zenToggleWebPanels: ["gZenBrowserManagerSidebar.toggle()", "zen-toggle-web-panels", "sidebar-action"], }; +const kZenDefaultShortcuts = { + // Split view actions + zenSplitViewGrid: "Ctrl+Alt+G", + zenSplitViewVertical: "Ctrl+Alt+V", + zenSplitViewHorizontal: "Ctrl+Alt+H", + zenSplitViewClose: "Ctrl+Alt+U", + + // Workspace actions + zenChangeWorkspace: "Ctrl+Shift+E", + + // Compact mode actions + zenToggleCompactMode: "Ctrl+Alt+C", + zenToggleCompactModeSidebar: "Ctrl+Alt+S", + zenToggleCompactModeToolbar: "Ctrl+Alt+T", + + // manage actions + zenToggleWebPanels: "Ctrl+Shift+P", +}; + // Section: ZenKeyboardShortcuts const kZKSStorageKey = "zen.keyboard.shortcuts"; @@ -107,17 +135,35 @@ const kZKSKeyCodeMap = { F10: "VK_F10", F11: "VK_F11", F12: "VK_F12", + TAB: "VK_TAB", + ENTER: "VK_RETURN", + ESCAPE: "VK_ESCAPE", + SPACE: "VK_SPACE", + ARROWLEFT: "VK_LEFT", + ARROWRIGHT: "VK_RIGHT", + ARROWUP: "VK_UP", + ARROWDOWN: "VK_DOWN", + DELETE: "VK_DELETE", + BACKSPACE: "VK_BACK", }; var gZenKeyboardShortcuts = { init() { + if (!Services.prefs.getBoolPref("zen.keyboard.shortcuts.enabled")) { + return; + } this._initShortcuts(); }, get _savedShortcuts() { if (!this.__savedShortcuts) { try { - this.__savedShortcuts = JSON.parse(Services.prefs.getStringPref(kZKSStorageKey)); + const data = Services.prefs.getStringPref(kZKSStorageKey); + if (data.length == 0) { + this._startUpShortcuts(); + return this._savedShortcuts; + } + this.__savedShortcuts = JSON.parse(data); } catch (e) { console.error("Zen CKS: Error parsing saved shortcuts", e); this.__savedShortcuts = {}; @@ -126,13 +172,46 @@ var gZenKeyboardShortcuts = { return this.__savedShortcuts; }, + _startUpShortcuts() { + this.__savedShortcuts = {}; + this._addDefaultShortcuts(); + this._saveShortcuts(); + }, + + _saveShortcuts() { + Services.prefs.setStringPref(kZKSStorageKey, JSON.stringify(this._savedShortcuts)); + }, + + _parseDefaultShortcut(shortcut) { + let ctrl = shortcut.includes("Ctrl+"); + let alt = shortcut.includes("Alt+"); + let shift = shortcut.includes("Shift+"); + let meta = shortcut.includes("Meta+"); + let key = shortcut.replace(/Ctrl\+|Alt\+|Shift\+|Meta\+/g, ""); + if (["Tab", "Enter", "Escape", "Space", "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(key)) { + return { ctrl, alt, shift, meta, key: undefined, keycode: key }; + } + let isKeyCode = key.length > 1; + return { ctrl, alt, shift, meta, + key: isKeyCode ? undefined : key, + keycode: isKeyCode ? key : undefined }; + }, + + _addDefaultShortcuts() { + for (let action in kZenDefaultShortcuts) { + if (!this._savedShortcuts[action]) { + this._savedShortcuts[action] = this._parseDefaultShortcut(kZenDefaultShortcuts[action]); + } + } + }, + setShortcut(id, shortcut) { if (!shortcut) { delete this._savedShortcuts[id]; } else if (this.isValidShortcut(shortcut)) { this._savedShortcuts[id] = shortcut; } - Services.prefs.setStringPref(kZKSStorageKey, JSON.stringify(this._savedShortcuts)); + this._saveShortcuts(); }, _initShortcuts() { @@ -279,7 +358,3 @@ var gZenKeyboardShortcuts = { return str; }, }; - -gZenKeyboardShortcuts.init(); - -// Section: gZenKeyboardShortcutsFunctions diff --git a/src/ZenViewSplitter.mjs b/src/ZenViewSplitter.mjs index 72bcc80..30f2016 100644 --- a/src/ZenViewSplitter.mjs +++ b/src/ZenViewSplitter.mjs @@ -422,7 +422,6 @@ var gZenViewSplitter = new class { // see browser-custom-elements.js's patch tab.linkedBrowser.zenModeActive = active; try { - console.info(tab.linkedBrowser); tab.linkedBrowser.docShellIsActive = active; } catch (e) { console.error(e); @@ -574,4 +573,26 @@ var gZenViewSplitter = new class { targetWindow.gBrowser.selectedTab = tab; return tab; } + + toggleShortcut(gridType) { + if (gridType === "unsplit" && this.currentView >= 0) { + this.unsplitCurrentView(); + return; + } + if (this.currentView >= 0) { + this._data[this.currentView].gridType = gridType; + this.updateSplitView(window.gBrowser.selectedTab); + } + const tabs = gBrowser.tabs; + if (tabs.length < 2) { + return; + } + let nextTabIndex = tabs.indexOf(gBrowser.selectedTab) + 1; + if (nextTabIndex >= tabs.length) { + nextTabIndex = 0; + } else if (nextTabIndex < 0) { + nextTabIndex = tabs.length - 1; + } + this.splitTabs([gBrowser.selectedTab, tabs[nextTabIndex]]); + } } \ No newline at end of file diff --git a/src/ZenWorkspaces.mjs b/src/ZenWorkspaces.mjs index efc4351..5ef0a68 100644 --- a/src/ZenWorkspaces.mjs +++ b/src/ZenWorkspaces.mjs @@ -421,7 +421,16 @@ var ZenWorkspaces = { async contextDelete() { await this.removeWorkspace(this._contextMenuId); - } + }, + + async changeWorkspaceShortcut() { + // Cycle through workspaces + let workspaces = await this._workspaces(); + let activeWorkspace = workspaces.workspaces.find(workspace => workspace.used); + let workspaceIndex = workspaces.workspaces.indexOf(activeWorkspace); + let nextWorkspace = workspaces.workspaces[workspaceIndex + 1] || workspaces.workspaces[0]; + this.changeWorkspace(nextWorkspace); + }, }; ZenWorkspaces.init();