From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.bugs Subject: bug#5809: 23.1.94; cross-reference by anchor yields in accurate position Date: Mon, 05 Apr 2010 19:50:52 +0300 Organization: JURTA Message-ID: <87bpdxdes3.fsf@mail.jurta.org> References: <837hoszubi.fsf@gnu.org> <87hbnwy2un.fsf@mail.jurta.org> <83y6h8xz8a.fsf@gnu.org> <8739zf5bif.fsf@mail.jurta.org> <83y6h7vy6p.fsf@gnu.org> <87y6h7uitd.fsf@mail.jurta.org> <83wrwqx6r2.fsf@gnu.org> <83vdcax5hu.fsf@gnu.org> <87d3yi85sv.fsf@mail.jurta.org> <87eiix5u1a.fsf@mail.jurta.org> <878w94dxf2.fsf@mail.jurta.org> <87eiiuwz6g.fsf@mail.jurta.org> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: dough.gmane.org 1270489861 12063 80.91.229.12 (5 Apr 2010 17:51:01 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Mon, 5 Apr 2010 17:51:01 +0000 (UTC) Cc: 5809@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Apr 05 19:50:59 2010 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1NyqRs-0006Ao-3A for geb-bug-gnu-emacs@m.gmane.org; Mon, 05 Apr 2010 19:50:58 +0200 Original-Received: from localhost ([127.0.0.1]:42358 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NyqRr-0007Xo-5Z for geb-bug-gnu-emacs@m.gmane.org; Mon, 05 Apr 2010 13:50:55 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Nyq3x-0008Ov-Tf for bug-gnu-emacs@gnu.org; Mon, 05 Apr 2010 13:26:14 -0400 Original-Received: from [140.186.70.92] (port=43031 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Nyq3s-0008MC-Fd for bug-gnu-emacs@gnu.org; Mon, 05 Apr 2010 13:26:13 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Nyq3n-0008Te-PX for bug-gnu-emacs@gnu.org; Mon, 05 Apr 2010 13:26:08 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:58496) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Nyq3m-0008TV-1z for bug-gnu-emacs@gnu.org; Mon, 05 Apr 2010 13:26:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1Nypde-000160-ES; Mon, 05 Apr 2010 12:59:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Juri Linkov Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-To: owner@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 05 Apr 2010 16:59:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 5809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 5809-submit@debbugs.gnu.org id=B5809.12704866844201 (code B ref 5809); Mon, 05 Apr 2010 16:59:02 +0000 Original-Received: (at 5809) by debbugs.gnu.org; 5 Apr 2010 16:58:04 +0000 Original-Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Nypci-00015i-6E for submit@debbugs.gnu.org; Mon, 05 Apr 2010 12:58:04 -0400 Original-Received: from smtp-out2.starman.ee ([85.253.0.4] helo=mx2.starman.ee) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Nypcg-000157-C5 for 5809@debbugs.gnu.org; Mon, 05 Apr 2010 12:58:03 -0400 X-Virus-Scanned: by Amavisd-New at mx2.starman.ee Original-Received: from mail.starman.ee (82.131.96.80.cable.starman.ee [82.131.96.80]) by mx2.starman.ee (Postfix) with ESMTP id B77DA3F40EC; Mon, 5 Apr 2010 19:57:48 +0300 (EEST) In-Reply-To: (Stefan Monnier's message of "Sun, 04 Apr 2010 22:06:31 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (x86_64-pc-linux-gnu) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Mon, 05 Apr 2010 12:59:02 -0400 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:35953 Archived-At: >> We could change the background color of the overlay's after-string >> to look like the header line (grey background) so users will expect >> that only mouse clicks should work on grey areas. > > I'd rather not change this part of the visual appearance, but maybe it's > just my personal preference. I think this decision should be taken > with the understanding that we will want to install a real-fix in > Emacs-24 so that we can click with the keyboard and copy&paste > the breadcrumbs and that we won't want to revert the visual appearance > at that point (people get used to visual appearances). I think both types of navigation links (breadcrumbs and up/next/prev) should be treated equally. If we'll implement clicking with the keyboard and copy&paste in Emacs-24, it would be natural to apply this to the up/next/prev links as well and change their visual appearance. Or maybe to leave breadcrumbs and navigation links in the (multi-line?) header line will be better because they don't scroll and stay on top. In any case, it's important that the visual appearance should match the user's expectation. When the visual appearance of breadcrumbs is the same as for the rest text of the Info buffer, users will be tempted to use the keyboard on breadcrumbs. > If we want to use this header-line appearance, couldn't we use something > like font-lock-append-text-property rather than apply `header-line' > bit-by-bit (and worse yet: in different ways for different parts). Done in the patch below. >> @@ -4260,7 +4288,10 @@ (defun Info-fontify-node () >> ;; that is in the header, if it is just part. >> (cond >> ((> Info-breadcrumbs-depth 0) >> - (put-text-property (point-min) (1+ header-end) 'invisible t)) >> + (put-text-property (point-min) (1+ header-end) 'invisible t) >> + (overlay-put >> + (make-overlay header-end (1+ header-end)) >> + 'after-string (Info-breadcrumbs))) >> ((not (bobp)) >> ;; Hide the punctuation at the end, too. >> (skip-chars-backward " \t,") > > Why is the `overlay-put' at a different place than the > former Info-insert-breadcrumbs? The overlay doesn't correctly interact with the `invisible' text property. However, we can put 'invisible on the overlay instead of the text property: (let ((ov (make-overlay (point-min) (1+ header-end)))) (overlay-put ov 'invisible t) (overlay-put ov 'after-string (Info-breadcrumbs)) (overlay-put ov 'evaporate t)) > PS: the rest of the patch looks OK, so if you can fix the above > feel free to install it. I'll give this patch more testing before installing: === modified file 'lisp/info.el' --- lisp/info.el 2010-03-03 19:23:20 +0000 +++ lisp/info.el 2010-04-05 16:48:03 +0000 @@ -1053,8 +1053,8 @@ (defun Info-find-node-2 (filename nodena (Info-select-node) (goto-char (point-min)) (forward-line 1) ; skip header line - (when (> Info-breadcrumbs-depth 0) ; skip breadcrumbs line - (forward-line 1)) + ;; (when (> Info-breadcrumbs-depth 0) ; skip breadcrumbs line + ;; (forward-line 1)) (cond (anchorpos (let ((new-history (list Info-current-file @@ -3551,6 +3551,19 @@ (defun Info-try-follow-nearest-node (&op ((setq node (Info-get-token (point) "Prev: " "Prev: \\([^,\n\t]*\\)")) (Info-goto-node node fork))) node)) + +(defun Info-mouse-follow-link (click) + "Follow a link under point." + (interactive "e") + (let* ((position (event-start click)) + (posn-string (and position (posn-string position))) + (string (car-safe posn-string)) + (string-pos (cdr-safe posn-string)) + (link-args (and string string-pos + (get-text-property string-pos 'link-args string)))) + (when link-args + (Info-goto-node link-args)))) + (defvar Info-mode-map (let ((map (make-keymap))) @@ -4141,11 +4154,22 @@ (defvar Info-up-link-keymap keymap) "Keymap to put on the Up link in the text or the header line.") -(defun Info-insert-breadcrumbs () +(defvar Info-link-keymap + (let ((keymap (make-sparse-keymap))) + (define-key keymap [header-line mouse-1] 'Info-mouse-follow-link) + (define-key keymap [header-line mouse-2] 'Info-mouse-follow-link) + (define-key keymap [header-line down-mouse-1] 'ignore) + (define-key keymap [mouse-2] 'Info-mouse-follow-link) + (define-key keymap [follow-link] 'mouse-face) + keymap) + "Keymap to put on the link in the text or the header line.") + +(defun Info-breadcrumbs () (let ((nodes (Info-toc-nodes Info-current-file)) (node Info-current-node) (crumbs ()) - (depth Info-breadcrumbs-depth)) + (depth Info-breadcrumbs-depth) + line) ;; Get ancestors from the cached parent-children node info (while (and (not (equal "Top" node)) (> depth 0)) @@ -4172,15 +4196,26 @@ (defun Info-insert-breadcrumbs () (file-name-nondirectory Info-current-file) ;; Some legacy code can still use a symbol. Info-current-file))))) - (insert (if (bolp) "" " > ") - (cond - ((null node) "...") - ((equal node Info-current-node) - ;; No point linking to ourselves. - (propertize text 'font-lock-face 'info-header-node)) - (t - (concat "*Note " text "::")))))) - (insert "\n")))) + (setq line (concat + line + (if (null line) "" " > ") + (cond + ((null node) "...") + ((equal node Info-current-node) + ;; No point linking to ourselves. + (propertize text 'font-lock-face 'info-header-node)) + (t + (propertize text + 'mouse-face 'highlight + 'font-lock-face 'info-header-xref + 'help-echo "mouse-2: Go to node" + 'keymap Info-link-keymap + 'link-args text) + )))))) + (setq line (concat line "\n"))) + (font-lock-append-text-property 0 (length line) + 'font-lock-face 'header-line line) + line)) (defun Info-fontify-node () "Fontify the node." @@ -4227,8 +4262,8 @@ (defun Info-fontify-node () ((string-equal (downcase tag) "next") Info-next-link-keymap) ((string-equal (downcase tag) "up" ) Info-up-link-keymap)))))) - (when (> Info-breadcrumbs-depth 0) - (Info-insert-breadcrumbs)) + ;; (when (> Info-breadcrumbs-depth 0) + ;; (insert (Info-breadcrumbs))) ;; Treat header line. (when Info-use-header-line @@ -4260,7 +4295,10 @@ (defun Info-fontify-node () ;; that is in the header, if it is just part. (cond ((> Info-breadcrumbs-depth 0) - (put-text-property (point-min) (1+ header-end) 'invisible t)) + (let ((ov (make-overlay (point-min) (1+ header-end)))) + (overlay-put ov 'invisible t) + (overlay-put ov 'after-string (Info-breadcrumbs)) + (overlay-put ov 'evaporate t))) ((not (bobp)) ;; Hide the punctuation at the end, too. (skip-chars-backward " \t,") -- Juri Linkov http://www.jurta.org/emacs/