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();