From 7d7e52e2f5d099091930cd6ac68b36c0e16d4cf0 Mon Sep 17 00:00:00 2001 From: Ramon Mi Date: Sat, 28 Mar 2026 17:13:15 +0800 Subject: [PATCH 1/2] fix: respect explicit open-in-tab/window prefs for note and attachments - Introduce `_getOpenInNewWindow` to distinguish between note and reader preferences - Add `forceOpenInWindow` logic to locateMenu and zoteroPane - Ensure explicit menu selections override default preferences and alternate behavior toggles - Fix visibility logic for context menu options based on current locate mode --- chrome/content/zotero/locateMenu.js | 22 ++++++++++++++++++---- chrome/content/zotero/zoteroPane.js | 26 +++++++++++++++++++++----- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/chrome/content/zotero/locateMenu.js b/chrome/content/zotero/locateMenu.js index 35aa69fb69..e9bef8f54c 100644 --- a/chrome/content/zotero/locateMenu.js +++ b/chrome/content/zotero/locateMenu.js @@ -377,6 +377,11 @@ var Zotero_LocateMenu = new function () { function ViewItem(alternateWindowBehavior) { this._viewItemType = "mixed"; this._numItems = 0; + let _getOpenInNewWindow = function (viewItemType) { + return Zotero.Prefs.get( + viewItemType === "note" ? "openNoteInNewWindow" : "openReaderInNewWindow" + ); + }; Object.defineProperty(this, "className", { get() { switch (this._viewItemType) { @@ -407,7 +412,7 @@ var Zotero_LocateMenu = new function () { openIn = "external"; } else { - let openInNewWindow = Zotero.Prefs.get("openReaderInNewWindow"); + let openInNewWindow = _getOpenInNewWindow(this._viewItemType); if (alternateWindowBehavior) { openInNewWindow = !openInNewWindow; } @@ -432,8 +437,12 @@ var Zotero_LocateMenu = new function () { && alternateWindowBehavior) { return false; } - if ((locateMode === "tab" && !alternateWindowBehavior) - || (locateMode === "window" && alternateWindowBehavior)) { + let openInWindow = _getOpenInNewWindow(usableItem.isNote() ? "note" : usableItem.attachmentReaderType); + if (alternateWindowBehavior) { + openInWindow = !openInWindow; + } + if ((locateMode === "tab" && !openInWindow) + || (locateMode === "window" && openInWindow)) { // Don't show option if it would open in the same type of the current context return false; } @@ -473,10 +482,15 @@ var Zotero_LocateMenu = new function () { if (usableItem) usableItems.push(usableItem); } + let forceOpenInWindow; + let openIn = this.l10nArgs.openIn; + forceOpenInWindow = { window: true, tab: false }[openIn]; + ZoteroPane.viewItems(usableItems, event, { noLocateOnMissing: false, - forceAlternateWindowBehavior: alternateWindowBehavior + forceAlternateWindowBehavior: alternateWindowBehavior, + forceOpenInWindow, }); }; diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js index 35135497f2..a1645795ff 100644 --- a/chrome/content/zotero/zoteroPane.js +++ b/chrome/content/zotero/zoteroPane.js @@ -5018,7 +5018,17 @@ var ZoteroPane = new function () { if (!this.collectionsView.editable) { continue; } - let openInWindow = event?.shiftKey || options.forceAlternateWindowBehavior; + let openInWindow; + if (typeof options.forceOpenInWindow === 'boolean') { + openInWindow = options.forceOpenInWindow; + } + else { + openInWindow = Zotero.Prefs.get('openNoteInNewWindow'); + let useAlternateWindowBehavior = event?.shiftKey || options.forceAlternateWindowBehavior; + if (useAlternateWindowBehavior) { + openInWindow = !openInWindow; + } + } ZoteroPane.openNote(item.id, { openInWindow }); } else if (item.isAttachment()) { @@ -5064,10 +5074,16 @@ var ZoteroPane = new function () { await item.saveTx(); } - let openInWindow = Zotero.Prefs.get('openReaderInNewWindow'); - let useAlternateWindowBehavior = event?.shiftKey || extraData?.forceAlternateWindowBehavior; - if (useAlternateWindowBehavior) { - openInWindow = !openInWindow; + let openInWindow; + if (typeof extraData?.forceOpenInWindow === 'boolean') { + openInWindow = extraData.forceOpenInWindow; + } + else { + openInWindow = Zotero.Prefs.get('openReaderInNewWindow'); + let useAlternateWindowBehavior = event?.shiftKey || extraData?.forceAlternateWindowBehavior; + if (useAlternateWindowBehavior) { + openInWindow = !openInWindow; + } } await Zotero.FileHandlers.open(item, { location: extraData?.location, From 76493762b345f376562d5f2bdc79c9f231b308fb Mon Sep 17 00:00:00 2001 From: Ramon Mi Date: Wed, 6 May 2026 16:51:37 +0800 Subject: [PATCH 2/2] refactor: refine code logic --- chrome/content/zotero/locateMenu.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/chrome/content/zotero/locateMenu.js b/chrome/content/zotero/locateMenu.js index e9bef8f54c..7e28c87009 100644 --- a/chrome/content/zotero/locateMenu.js +++ b/chrome/content/zotero/locateMenu.js @@ -483,8 +483,16 @@ var Zotero_LocateMenu = new function () { } let forceOpenInWindow; - let openIn = this.l10nArgs.openIn; - forceOpenInWindow = { window: true, tab: false }[openIn]; + if (this._viewItemType !== "mixed" && Zotero.Prefs.get(`fileHandler.${this._viewItemType}`)) { + // Use external handler; keep forceOpenInWindow undefined + } + else { + let openInNewWindow = _getOpenInNewWindow(this._viewItemType); + if (alternateWindowBehavior) { + openInNewWindow = !openInNewWindow; + } + forceOpenInWindow = openInNewWindow; + } ZoteroPane.viewItems(usableItems, event, {