Subject: bug#37592: closed (Re: bug#37592: Using tabs in EWW)

From: [email-masked] (GNU bug Tracking System)
Date: Sun, 06 Oct 2019 21:12:02 +0000

Your bug report

#37592: Using tabs in EWW

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
37592: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=37592
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#37592: Using tabs in EWW
From: Juri Linkov <[email-masked]>
To: Lars Ingebrigtsen <[email-masked]>
Cc: Eli Zaretskii <[email-masked]>, [email-masked]
Date: Mon, 07 Oct 2019 00:08:33 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

>> I agree, let's try this heuristics to open new tabs
>> when tab-bar-mode is enabled:
>
> Looks good to me, too.

I also updated the Info documentation on opening tabs by 'C-u RET'.
but can't find a suitable place to describe using tabs on clicking
with the Ctrl key, because currently the EWW documentation has
no mentions of mouse commands.

Subject: Using tabs in EWW
From: Juri Linkov <[email-masked]>
To: [email-masked]
Date: Wed, 02 Oct 2019 23:31:17 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

Severity: wishlist
Tags: patch

Like <C-mouse-1> in web browsers opens links in a new tab,
the attached patch does the same for EWW.

The change that implements support for tabs in EWW is just 3 lines:

    (when eww-browse-url-new-window-is-tab
      (let ((tab-bar-new-tab-choice t))
        (tab-new)))

Everything else is replicating the existing code:

1. A new defcustom eww-browse-url-new-window-is-tab is a copy
   of existing browse-url-firefox-new-window-is-tab

2. The docstring for eww-browse-url is copied from browse-url-firefox

3. The code for shr-browse-url is copied from browse-url-at-point

diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index fb495a9858..a39f8b87cc 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -876,9 +876,32 @@ eww-mode
   (buffer-disable-undo)
   (setq buffer-read-only t))
 
+(defcustom eww-browse-url-new-window-is-tab nil
+  "Whether to open up new windows in a tab or a new buffer.
+If non-nil, then open the URL in a new tab rather than a new buffer if
+`eww-browse-url' is asked to open it in a new window."
+  :version "27.1"
+  :group 'eww
+  :type 'boolean)
+
 ;;;###autoload
 (defun eww-browse-url (url &optional new-window)
+  "Ask the EWW browser to load URL.
+
+Interactively, if the variable `browse-url-new-window-flag' is non-nil,
+loads the document in a new buffer tab on the window tab-line.  A non-nil
+prefix argument reverses the effect of `browse-url-new-window-flag'.
+
+If `eww-browse-url-new-window-is-tab' is non-nil, then
+whenever a document would otherwise be loaded in a new buffer, it
+is loaded in a new tab in the tab-bar on an existing frame.
+
+Non-interactively, this uses the optional second argument NEW-WINDOW
+instead of `browse-url-new-window-flag'."
   (when new-window
+    (when eww-browse-url-new-window-is-tab
+      (let ((tab-bar-new-tab-choice t))
+        (tab-new)))
     (pop-to-buffer-same-window
      (generate-new-buffer
       (format "*eww-%s*" (url-host (url-generic-parse-url
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index ef236bf7c4..390be4deff 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -201,6 +201,7 @@ shr-map
     (define-key map [?\M-\t] 'shr-previous-link)
     (define-key map [follow-link] 'mouse-face)
     (define-key map [mouse-2] 'shr-browse-url)
+    (define-key map [C-down-mouse-1] 'shr-mouse-browse-url-new-window)
     (define-key map "I" 'shr-insert-image)
     (define-key map "w" 'shr-maybe-probe-and-copy-url)
     (define-key map "u" 'shr-maybe-probe-and-copy-url)
@@ -967,7 +968,13 @@ shr-mouse-browse-url
   (mouse-set-point ev)
   (shr-browse-url))
 
-(defun shr-browse-url (&optional external mouse-event)
+(defun shr-mouse-browse-url-new-window (ev)
+  "Browse the URL under the mouse cursor in a new window."
+  (interactive "e")
+  (mouse-set-point ev)
+  (shr-browse-url nil nil t))
+
+(defun shr-browse-url (&optional external mouse-event new-window)
   "Browse the URL at point using `browse-url'.
 If EXTERNAL is non-nil (interactively, the prefix argument), browse
 the URL using `browse-url-secondary-browser-function'.
@@ -987,7 +994,9 @@ shr-browse-url
           (progn
 	    (funcall browse-url-secondary-browser-function url)
             (shr--blink-link))
-	(browse-url url))))))
+	(browse-url url (if new-window
+			    (not browse-url-new-window-flag)
+			  browse-url-new-window-flag)))))))
 
 (defun shr-save-contents (directory)
   "Save the contents from URL in a file."