unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Alan Mackenzie <acm@muc.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 29272@debbugs.gnu.org
Subject: bug#29272: 26.0.90; "C-h k C-mouse-3" followed by menu selection asks for more keys
Date: Sun, 19 Nov 2017 16:19:43 +0000	[thread overview]
Message-ID: <20171119161943.GA9922@ACM> (raw)
In-Reply-To: <83r2svg72w.fsf@gnu.org>

Hello, Eli.

On Sat, Nov 18, 2017 at 13:27:35 +0200, Eli Zaretskii wrote:
> > Date: Tue, 14 Nov 2017 20:54:49 +0000
> > Cc: 29272@debbugs.gnu.org
> > From: Alan Mackenzie <acm@muc.de>

> > The following patch attempts to catch and filter out obtrusive events.
> > Could you try it out, please, even though it's not perfect (see below).
> > It's based on the emacs-26 branch:

> Thanks, this seems to fix the problem.  I take it that you've verified
> it doesn't re-introduce the original bug?

> > However, the problem is that in C-h k  C-mouse-3
> > <select-something-from-the-menus>, we get a spurious "translation"
> > message in *Help*, looking something like:

> >     <C-down-mouse-3> <file> <new-file> (translated from <mouse-1> <new-file>) at
> >     that spot runs the command find-file (found in global-map), which is an
> >     interactive compiled Lisp function in `files.el'.

> > That was from a Linux tty session using gpm.  In X, I got the message

> >     .... (translated from <C-down-mouse-3> <C-down-mouse-3> ....)

> I only see this in a text-mode frame (in my case it's "<mouse-1>
> <indent-pp-sexp>").  On GUI frame, there's no "translation".

Not on an X-Windows frame - X seems to handle all the mouse-movement and
intermediate click events itself.  On a linux tty with GPM, you do indeed
see these intermediate events.

> > .  I don't believe this glitch has to do with my patch - I think it's
> > been there for some while, but this bug has prevented it being seen
> > before.

> I think you are right, as I see the same problem in Emacs 24.5.

> In any case, this is a much more minor bug than the one I reported, so
> please install your changes on the release branch.  Bonus points if
> you can find where does the "translation" come from.

I claim my prize.  :-)

The following patch (which absolutely requires the patch to bug #29349
"read_key_sequence is only partially recursive.  This is a bug." to work)
fixes the above glitch on Linux tty (and possibly on other platforms).
It works by disregarding the "intermediate" events in UNTRANSLATED when
comparing the processed key sequence with the UNTRANSLATED string of
events:



diff --git a/lisp/help.el b/lisp/help.el
index 212e3679da..f5192e1902 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -583,14 +583,66 @@ where-is
 	  (princ string)))))
   nil)
 
+(defun help--equivalent-sequence-p (key untranslated)
+  "Is KEY a (possibly translated) version of UNTRANSLATED?
+If so return t, otherwise return nil.
+
+KEY is a key sequence, either a string or a vector.  UNTRANSLATED
+is a vector of events which gave rise to KEY, typically the output from
+`this-single-command-raw-keys'.
+
+The idea here is that for menu structure key sequences,
+UNTRANSLATED in certain environments contains things like
+<mouse-movement> and intermediate mouse button presses.  These
+will be disregarded in the comparison between KEY and
+UNTRANSLATED."
+  (let* ((len-key (length key))
+	 (len-unt (length untranslated))
+	 (key-idx 0)
+	 (unt-idx 0)
+	 key-elt unt-elt mods)
+    (cond
+     ((and (stringp key)
+	   (eq len-key len-unt))
+      (while (and (< key-idx len-key)
+		  (eq (aref key key-idx)
+		      (aref untranslated key-idx)))
+	(setq key-idx (1+ key-idx)))
+      (eq key-idx len-key))
+     ((vectorp key)
+      ;; In this while go round one elt of `key' each time round
+      (while
+	  (and (< key-idx len-key)
+	       (< unt-idx len-unt)
+	       (progn
+		 (setq key-elt (aref key key-idx))
+		 ;; In this while, skip an intermediate mouse click, etc.
+		 ;; from `untranslated' each time round.
+		 (while
+		     (and
+		      (< unt-idx len-unt)
+		      (progn
+			(setq unt-elt (aref untranslated unt-idx))
+			(not (eq unt-elt key-elt)))
+		      (progn
+			(setq mods (event-modifiers unt-elt))
+			(or (eq (car-safe unt-elt) 'mouse-movement)
+			    (cl-intersection '(click double triple drag down)
+					     mods))))
+		   (setq unt-idx (1+ unt-idx)))
+		 (eq unt-elt key-elt)))
+	(setq key-idx (1+ key-idx)
+	      unt-idx (1+ unt-idx)))
+      (eq key-idx len-key)))))
+
 (defun help-key-description (key untranslated)
   (let ((string (key-description key)))
     (if (or (not untranslated)
 	    (and (eq (aref untranslated 0) ?\e) (not (eq (aref key 0) ?\e))))
 	string
-      (let ((otherstring (key-description untranslated)))
-	(if (equal string otherstring)
-	    string
+      (if (help--equivalent-sequence-p key untranslated)
+          string
+        (let ((otherstring (key-description untranslated)))
 	  (format "%s (translated from %s)" string otherstring))))))
 
 (defun help--analyze-key (key untranslated)



> Thanks.

-- 
Alan Mackenzie (Nuremberg, Germany).





  parent reply	other threads:[~2017-11-19 16:19 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-12 11:23 bug#29272: 26.0.90; "C-h k C-mouse-3" followed by menu selection asks for more keys Eli Zaretskii
2017-11-12 12:38 ` Eli Zaretskii
2017-11-12 13:24   ` Alan Mackenzie
2017-11-14 20:54   ` Alan Mackenzie
2017-11-18 11:27     ` Eli Zaretskii
2017-11-18 15:15       ` Alan Mackenzie
2017-11-19 16:19       ` Alan Mackenzie [this message]
2017-11-19 17:04         ` Eli Zaretskii
2017-11-19 17:44           ` Eli Zaretskii
2017-11-19 17:54           ` Alan Mackenzie
2017-11-19 18:17         ` Eli Zaretskii
2017-11-19 20:26           ` Alan Mackenzie
2017-11-29  0:50     ` Noam Postavsky
2017-11-29  3:38       ` Eli Zaretskii
2017-11-29  8:39         ` martin rudalics
2017-11-29 13:19           ` Noam Postavsky
2017-11-29 17:53             ` Eli Zaretskii
2017-11-30  7:22             ` martin rudalics
2017-11-29 17:55           ` Eli Zaretskii
2017-11-29 18:37           ` Alan Mackenzie
2017-11-29 18:56             ` Eli Zaretskii
2017-12-01 16:57               ` Alan Mackenzie
2017-12-01 19:18                 ` Drew Adams
2017-12-01 19:43                   ` Eli Zaretskii
2017-11-30  7:22             ` martin rudalics
     [not found] <<83shdjn3ju.fsf@gnu.org>
     [not found] ` <<83mv3rn02t.fsf@gnu.org>
     [not found]   ` <<20171114205449.GA8025@ACM>
     [not found]     ` <<87fu8xnc17.fsf@users.sourceforge.net>
     [not found]       ` <<83h8td4uw5.fsf@gnu.org>
     [not found]         ` <<5A1E724A.5030507@gmx.at>
     [not found]           ` <<20171129183717.GA8914@ACM>
     [not found]             ` <<83609s52xt.fsf@gnu.org>
     [not found]               ` <<20171201165740.GE3840@ACM>
     [not found]                 ` <<1c4abffb-e975-41b1-a368-29518bc3b360@default>
     [not found]                   ` <<83y3mm1bfu.fsf@gnu.org>
2017-12-01 21:12                     ` Drew Adams
2017-12-02  8:13                       ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171119161943.GA9922@ACM \
    --to=acm@muc.de \
    --cc=29272@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).