GNU bug report logs - #76669
read_key_sequence discards events without attempting remapping

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: Daniel Colascione <dancol@HIDDEN>; dated Sat, 1 Mar 2025 23:36:02 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 76669 <at> debbugs.gnu.org:


Received: (at 76669) by debbugs.gnu.org; 2 Mar 2025 18:14:52 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 02 13:14:52 2025
Received: from localhost ([127.0.0.1]:34864 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tonpz-00065r-0D
	for submit <at> debbugs.gnu.org; Sun, 02 Mar 2025 13:14:51 -0500
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:34611)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <monnier@HIDDEN>)
 id 1tonpw-00065I-6Z
 for 76669 <at> debbugs.gnu.org; Sun, 02 Mar 2025 13:14:48 -0500
Received: from pmg3.iro.umontreal.ca (localhost [127.0.0.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id E17BA44163E;
 Sun,  2 Mar 2025 13:14:40 -0500 (EST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1740939279;
 bh=aEHd3AYx3YHRvPdQ27VxqihVjsCglRGfA01ry1fHaxY=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=XNQwZmTgiCidFMCnFKtjAfkbtRgakgMpLUj51x89woO9rvmfIVToQbc4mGy0XxxRD
 WxhwlMePAqPOnxSLRrrd1My2TX7pIN/tl9Ythmr7gRTvYw61o2HsXI76soIKXxTu0k
 lje1ZQiFP5y8TP7mzJ9G2K+IcAscIbrXvV8NGP0uqT9xGYTsdlGXCS4jp4A8aFcECV
 GvSPS+ykUjVpLH4dvDesNWjINoq6SVB8v3w5VLhXqsLEx9AFB9B+vAdO1K4oNZhfVs
 sSqq+eSaBmj3GP1lSuGG4VmeP/OZHVDIkJ3Wq+PHcWo+p2pVZC9M12AWpInEk5sGLD
 6DuQ13V7NgZSA==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id 8642D44102E;
 Sun,  2 Mar 2025 13:14:39 -0500 (EST)
Received: from alfajor (unknown [104.247.242.5])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 56FEB12037B;
 Sun,  2 Mar 2025 13:14:39 -0500 (EST)
From: Stefan Monnier <monnier@HIDDEN>
To: Daniel Colascione <dancol@HIDDEN>
Subject: Re: bug#76669: read_key_sequence discards events without attempting
 remapping
In-Reply-To: <m1r03f5p69.fsf@HIDDEN>
Message-ID: <jwv34fv5n5h.fsf-monnier+emacs@HIDDEN>
References: <m1o6ykiat8.fsf@HIDDEN> <86r03gnfo8.fsf@HIDDEN>
 <m1h64b7w4l.fsf@HIDDEN> <jwv5xkr7cnd.fsf-monnier+emacs@HIDDEN>
 <m1r03f5p69.fsf@HIDDEN>
Date: Sun, 02 Mar 2025 13:14:38 -0500
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL -0.367 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 76669
Cc: Eli Zaretskii <eliz@HIDDEN>, 76669 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

[...]
>> FWIW, I have several times wished the `function-key-map`-style "remap if
>> there's no binding" was applied repeatedly.
[...]
> No --- I meant we'd have the remapping code *do* the dropping.
> Apply the remapping in a loop until we reach a fixed point.

That's what I meant by "applied repeatedly", yes.
`function-key-map` is *defined* as not being applied again after itself,
so we'd need to introduce a new keymap (or equivalent).

> Remapping phases:
>
> 1. [s-down-mouse-1 s-mouse-1]
> 2. [down-mouse-1 mouse-1]
> 3. [mouse-1]

[ Of course, there are other remapping steps and orders possible.  =F0=9F=
=99=81 ]

>> In my wildest dreams, `read_key_sequence` has an `input-fallback-map`
>> which is applied repeatedly, and keymaps can be functions so that they
>> can do things like remap anything that looks like `FOO-mouse-1` to
>> `FOO-mouse-2` (without having to list the hundreds of possible FOO) or
>> remap anything that looks like `down-FOO` to `FOO`.
>> Then `read_key_sequence` doesn't treat shift and `down` specially,
>> instead that can be moved out to `input-fallback-map`.
> Keymap entries can already be functions, and I think the function entry
> would work with the fallback finding t too.

Indeed, we have things which cover various parts (there are also those
`:filter` functions in `menu-item`s), but not well enough to be usable
in practice.

> There's no good way to compose such functions, though --- not without
> just clobbering them with add-function and such.  Child keymap
> fallback entries will shadow those of the parents.

Maybe we only need this flexibility for key remapping and not for normal
keymaps, so we could have a "sequence of remapping thingies" where each
thingy can be a keymap or a function so we don't add any special
functionality to keymaps?

>> But, yeah, that still leaves open the question of whether we should drop
>> `shift` before we drop `down` or the reverse, and whether the
>> `FOO-mouse-1` to `FOO-mouse-2` remapping should happen before or after
>> dropping `down`.  The only "principled" way to solve this problem,
>> AFAICT, would be to consider those remapping and returning all the
>> possibilities (as a set of possible keysequences) and then when we do
>> the corresponding key lookup, we'd have to decide what to do if there's
>> more than one binding for those keysequences.
>
> If we're going to fix this, we might as well move read-key-sequence to
> Lisp, where it's easier to express the right algorithm.

That could be nice, yes.  Tho some of the complexity is not just in the
fact that it's written in C but in the details of the semantics
(especially the various remapping keymaps and their interactions, as
well as their interaction with the decision of when exactly to stop
waiting for more input).

>   (cl-loop
>     with want-lookahead =3D nil
>     for keymap in all-keymaps
>     for binding =3D (keymap-try-get-binding keymap candidate-keys)
>     if (eq binding :want-lookahead)
>     do (setf want-lookahead :want-lookahead)
>     else if binding return binding
>     finally return want-lookahead))

I think this can be replaced with just

    (lookup-key all-keymaps candidate-keys)

where `integerp` tells us if we "want-lookahead".


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#76669; Package emacs. Full text available.

Message received at 76669 <at> debbugs.gnu.org:


Received: (at 76669) by debbugs.gnu.org; 2 Mar 2025 17:16:13 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 02 12:16:13 2025
Received: from localhost ([127.0.0.1]:34199 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tomvF-0000Ky-29
	for submit <at> debbugs.gnu.org; Sun, 02 Mar 2025 12:16:13 -0500
Received: from dancol.org ([2600:3c01:e000:3d8::1]:36784)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <dancol@HIDDEN>) id 1tomv8-0000KC-Iy
 for 76669 <at> debbugs.gnu.org; Sun, 02 Mar 2025 12:16:10 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dancol.org; 
 s=x;
 h=Content-Type:MIME-Version:Message-ID:Date:References:In-Reply-To:
 Subject:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding:Content-ID:
 Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc
 :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:
 List-Post:List-Owner:List-Archive;
 bh=HrxUkJ5njbEDe6CK6c2lBHUj9qIbXQcOnlcv7boK/WA=; b=CughJvvJlCG5tQ8WPVWEX+/TcZ
 930lCBsAIbby5A0nilpQnv8iheseJEfb1mjdjjRNTQMfkjrEl8Pm4IQ4rwc5biKWCAX3YUqCYScYm
 HrYp9/BbOQGzSedgLnZdDAiGsq9bdzIDhDSQpraRoccIXPsYUH4JqBTS73bM32bO+PUoDDisbOrRl
 2/KGkSQKb/nJqkKLpXcTZLIhOq8xrITwcpwb8I2SNPCZyuiVCz3pEYCh7nd83PXwNf+2IhhKiIH6R
 lAjs8I6qcbdtFf+tcfX8gzhbHRnjmznBV5xYC6aDKTpRNDeXV6CrrHtBH2NnDSy161Ke5Da1zzpGJ
 3Rohr39Q==;
Received: from dancol by dancol.org with local (Exim 4.96)
 (envelope-from <dancol@HIDDEN>) id 1tomut-001cr3-0L;
 Sun, 02 Mar 2025 12:15:51 -0500
From: Daniel Colascione <dancol@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>
Subject: Re: bug#76669: read_key_sequence discards events without attempting
 remapping
In-Reply-To: <jwv5xkr7cnd.fsf-monnier+emacs@HIDDEN>
References: <m1o6ykiat8.fsf@HIDDEN> <86r03gnfo8.fsf@HIDDEN>
 <m1h64b7w4l.fsf@HIDDEN> <jwv5xkr7cnd.fsf-monnier+emacs@HIDDEN>
User-Agent: mu4e 1.12.8; emacs 31.0.50
Date: Sun, 02 Mar 2025 12:15:58 -0500
Message-ID: <m1r03f5p69.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.0 (/)
X-Debbugs-Envelope-To: 76669
Cc: Eli Zaretskii <eliz@HIDDEN>, 76669 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Stefan Monnier <monnier@HIDDEN> writes:

>>>> Suppose we want to use local-function-key-map to translate
>>>> s-<down-mouse-3> to <down-mouse-3>.  If we don't have a concrete binding
>>>> for s-<down-mouse-3>, we never attempt to translate it: instead,
>>>> read_key_sequence discards the down event and skips right to
>>>> s-<mouse-3>, which we *can* translate.
>
> Hmm... to be honest, I'm surprised that this is what happens, because my
> recollection of the code was that dropping down/double/drag (and shift)
> is done "as late as possible".
>
> Maybe this is just a bug?
>
>>> I think it's ambiguous which one should come first: the discarding of
>>> 'down' modifier or translation via that map.  The ELisp manual says:
>
> Given that translation is "customizable" it's desirable to go through
> translation before deciding to drop `down`, but it's also desirable to
> go through translation after dropping `down`.
>
> FWIW, I have several times wished the `function-key-map`-style "remap if
> there's no binding" was applied repeatedly.
>
>> Wouldn't it be simpler and more powerful to get the modifier-munging
>> stuff out of the main read_key_sequence loop and implement the down
>> event dropping in access_keymap_keyremap?
>
> That would prevent applying remapping after the `down` thingy
> was dropped.

No --- I meant we'd have the remapping code *do* the dropping.
Apply the remapping in a loop until we reach a fixed point.

Remapping phases:

1. [s-down-mouse-1 s-mouse-1]
2. [down-mouse-1 mouse-1]
3. [mouse-1]

> In my wildest dreams, `read_key_sequence` has an `input-fallback-map`
> which is applied repeatedly, and keymaps can be functions so that they
> can do things like remap anything that looks like `FOO-mouse-1` to
> `FOO-mouse-2` (without having to list the hundreds of possible FOO) or
> remap anything that looks like `down-FOO` to `FOO`.
> Then `read_key_sequence` doesn't treat shift and `down` specially,
> instead that can be moved out to `input-fallback-map`.

Keymap entries can already be functions, and I think the function entry
would work with the fallback finding t too.  There's no good way to
compose such functions, though --- not without just clobbering them with
add-function and such.  Child keymap fallback entries will shadow those
of the parents.

> But, yeah, that still leaves open the question of whether we should drop
> `shift` before we drop `down` or the reverse, and whether the
> `FOO-mouse-1` to `FOO-mouse-2` remapping should happen before or after
> dropping `down`.  The only "principled" way to solve this problem,
> AFAICT, would be to consider those remapping and returning all the
> possibilities (as a set of possible keysequences) and then when we do
> the corresponding key lookup, we'd have to decide what to do if there's
> more than one binding for those keysequences.

If we're going to fix this, we might as well move read-key-sequence to
Lisp, where it's easier to express the right algorithm.

We can model the raw input event stream as a lazy infinite sequence with
lookahead.  The access-keymap operation would do another physical event
read if it wanted lookahead and we didn't have the physical event yet.

We can model key remapping with recursion, yes?  A remapping keymap
would just recursively try the whole key mapping sequence with its
new binding.

Here's a sketch.  (Real code would have much better style.)

(defvar all-keymaps ...)  ; global-map local-map function-key-map etc.

(def-defstruct candidate-keys
   ;; (- (length keys) nr-committed) is the
  ;; amount of lookahead we have
  (keys :type vector)
  (nr-committed :type integer))

(defun try-match-key-sequence (candidate-keys)
  ;; Go through all our keymaps.  If any of them returns
  ;; a concrete binding, use it immediately.  Otherwise,
  ;; return :want-lookahead if any keymap wants more lookahead.
  (cl-loop
    with want-lookahead = nil
    for keymap in all-keymaps
    for binding = (keymap-try-get-binding keymap candidate-keys)
    if (eq binding :want-lookahead)
    do (setf want-lookahead :want-lookahead)
    else if binding return binding
    finally return want-lookahead))

(defun keymap-try-get-binding (keymap candidate-keys)
  ;; See whether keymap has a binding for candidate-keys
  ;; If definitely no binding, return nil.  If we're not
  ;; sure and need to see more input (e.g. because
  ;; the committed part of candidate-keys names a non-empty prefix map)
  ;; returns :want-lookahead.
  (pcase (access-keymap keymap candidate-keys)
    (':want-lookahead  ; need more input
      :want-lookahead)
    (`(:remap ,translated-candidate-keys)
      ;; just retry the whole matching step with the
      ;; new candidate keys
      (try-match-key-sequence translated-candidate-keys))
    (r r)))

(defun read-key-sequence (...)
  ;; Match the shortest bound sequence.
  ;; Leave any remaining lookahead in
  ;; raw-event-queue to get picked up next time.
  (cl-loop
    with raw-event-queue = ()
    for nr-keys upfrom 0
    for binding = (cl-loop
      for maybe-binding = (try-match-key-sequence
        (make-candidate-keys
          :keys raw-event-queue
          :nr nr-keys))
      while (eq maybe-binding :want-lookahead)
      ;; Yes, I know appendf doesn't exist
      do (appendf raw-event-queue (read-char))
      finally return maybe-binding)
    until binding
    finally return (progn
      ;; Put any unconsumed readahead in the queue for the next
      ;; event.  BINDING here is (translated-keys . command) or
      ;; something like that
      (setf unread-command-events (seq-subseq raw-event-queue nr-keys))
      (setf this-command-keys (car binding))  ; translated
      (cdr binding)))
 




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#76669; Package emacs. Full text available.

Message received at 76669 <at> debbugs.gnu.org:


Received: (at 76669) by debbugs.gnu.org; 2 Mar 2025 14:23:51 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 02 09:23:51 2025
Received: from localhost ([127.0.0.1]:56489 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tokER-0001KO-Cx
	for submit <at> debbugs.gnu.org; Sun, 02 Mar 2025 09:23:51 -0500
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:39683)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <monnier@HIDDEN>)
 id 1tokEO-0001JX-UR
 for 76669 <at> debbugs.gnu.org; Sun, 02 Mar 2025 09:23:49 -0500
Received: from pmg3.iro.umontreal.ca (localhost [127.0.0.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id A5CA44409D8;
 Sun,  2 Mar 2025 09:23:42 -0500 (EST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1740925421;
 bh=Da+Dj3qHNIEAp0a1facqBnWFqDWfLWPN7keQPpoEPxE=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=Qfmb3Fli0l0QZ3mFP5xqWLQ2VKS2ApwSfVSKV+Hp8y0suxfGQcLJ45cQr2OHaeAS2
 HdRzzgHMlREy0N5fu13BdQcOqLq2PtrtGk1dadoFy5GFGTE+1JEXAUessWzcaedpaW
 hPDaUhCNJxfpLA3s0ySUuYzDVY3jiaVQ/i9oIjkBla/j2DnM8Jbkcq1jKzAymwT03v
 5snjOb7+K6KYUbx5LgGFds6GDQ/g3kD/Nyfmdz+HFfBROO/fnPJnmWq7Ak9oJH83sM
 nrSxzqT2+YU2EumkkIa1v89d0Ras2BCUoGQ5NJN8M2H+5AiPVi8k5GX66OsTJbLC6F
 NIP+YYfyVg7Fw==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id 189334406CB;
 Sun,  2 Mar 2025 09:23:41 -0500 (EST)
Received: from alfajor (unknown [104.247.242.5])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id D9B68120602;
 Sun,  2 Mar 2025 09:23:40 -0500 (EST)
From: Stefan Monnier <monnier@HIDDEN>
To: Daniel Colascione <dancol@HIDDEN>
Subject: Re: bug#76669: read_key_sequence discards events without attempting
 remapping
In-Reply-To: <m1h64b7w4l.fsf@HIDDEN>
Message-ID: <jwv5xkr7cnd.fsf-monnier+emacs@HIDDEN>
References: <m1o6ykiat8.fsf@HIDDEN> <86r03gnfo8.fsf@HIDDEN>
 <m1h64b7w4l.fsf@HIDDEN>
Date: Sun, 02 Mar 2025 09:23:39 -0500
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL -0.376 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 76669
Cc: Eli Zaretskii <eliz@HIDDEN>, 76669 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

>>> Suppose we want to use local-function-key-map to translate
>>> s-<down-mouse-3> to <down-mouse-3>.  If we don't have a concrete binding
>>> for s-<down-mouse-3>, we never attempt to translate it: instead,
>>> read_key_sequence discards the down event and skips right to
>>> s-<mouse-3>, which we *can* translate.

Hmm... to be honest, I'm surprised that this is what happens, because my
recollection of the code was that dropping down/double/drag (and shift)
is done "as late as possible".

Maybe this is just a bug?

>> I think it's ambiguous which one should come first: the discarding of
>> 'down' modifier or translation via that map.  The ELisp manual says:

Given that translation is "customizable" it's desirable to go through
translation before deciding to drop `down`, but it's also desirable to
go through translation after dropping `down`.

FWIW, I have several times wished the `function-key-map`-style "remap if
there's no binding" was applied repeatedly.

> Wouldn't it be simpler and more powerful to get the modifier-munging
> stuff out of the main read_key_sequence loop and implement the down
> event dropping in access_keymap_keyremap?

That would prevent applying remapping after the `down` thingy
was dropped.

In my wildest dreams, `read_key_sequence` has an `input-fallback-map`
which is applied repeatedly, and keymaps can be functions so that they
can do things like remap anything that looks like `FOO-mouse-1` to
`FOO-mouse-2` (without having to list the hundreds of possible FOO) or
remap anything that looks like `down-FOO` to `FOO`.
Then `read_key_sequence` doesn't treat shift and `down` specially,
instead that can be moved out to `input-fallback-map`.

But, yeah, that still leaves open the question of whether we should drop
`shift` before we drop `down` or the reverse, and whether the
`FOO-mouse-1` to `FOO-mouse-2` remapping should happen before or after
dropping `down`.  The only "principled" way to solve this problem,
AFAICT, would be to consider those remapping and returning all the
possibilities (as a set of possible keysequences) and then when we do
the corresponding key lookup, we'd have to decide what to do if there's
more than one binding for those keysequences.


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#76669; Package emacs. Full text available.

Message received at 76669 <at> debbugs.gnu.org:


Received: (at 76669) by debbugs.gnu.org; 2 Mar 2025 07:02:59 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 02 02:02:59 2025
Received: from localhost ([127.0.0.1]:51796 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1todLn-00064h-1t
	for submit <at> debbugs.gnu.org; Sun, 02 Mar 2025 02:02:59 -0500
Received: from dancol.org ([2600:3c01:e000:3d8::1]:53888)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <dancol@HIDDEN>) id 1todLk-00064V-GU
 for 76669 <at> debbugs.gnu.org; Sun, 02 Mar 2025 02:02:57 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dancol.org; 
 s=x;
 h=Content-Transfer-Encoding:Content-Type:MIME-Version:Message-ID:Date:
 References:In-Reply-To:Subject:Cc:To:From:Sender:Reply-To:Content-ID:
 Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc
 :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:
 List-Post:List-Owner:List-Archive;
 bh=ccImzbIR0cngdx0tK9BE3LGai3GlTHxOFqhW6bbZSt0=; b=NEVWfmIIuGh/svzfjY1b6sdbDT
 XRqY7VX3GVAAd4DaFjInGv5GWeqZMsRMm66R4RFGimXPLoDiLXvt7HHg7mnPzumMLJDwsnt5jlFlu
 KWPVg5+hr9Cfa/lvVkE3ZN8lt+HXrCoCxIXxVLbFvMca3xYFy61PI7M1Rly9E3u05JCALYd8m7ekR
 OS0/OpttNOhPWCyGFo9l/+1J0Fdmpq5l4sxDC3g8JSnp/UbFryRQLOYIYRaZAz0GpIqdLDKt1O/zW
 JAP0sBFbvbDox1f49LzMrFXc1HjpPgBLrS4yLActOt2wNlhyRfnFv2a/IeMmDMCHdQ3Ony1pzWqCD
 QCD8ulpQ==;
Received: from dancol by dancol.org with local (Exim 4.96)
 (envelope-from <dancol@HIDDEN>) id 1todLX-001ZSd-1j;
 Sun, 02 Mar 2025 02:02:43 -0500
From: Daniel Colascione <dancol@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#76669: read_key_sequence discards events without attempting
 remapping
In-Reply-To: <86r03gnfo8.fsf@HIDDEN>
References: <m1o6ykiat8.fsf@HIDDEN> <86r03gnfo8.fsf@HIDDEN>
User-Agent: mu4e 1.12.8; emacs 31.0.50
Date: Sun, 02 Mar 2025 02:02:50 -0500
Message-ID: <m1h64b7w4l.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: -0.0 (/)
X-Debbugs-Envelope-To: 76669
Cc: Stefan Monnier <monnier@HIDDEN>, 76669 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Eli Zaretskii <eliz@HIDDEN> writes:

>> From: Daniel Colascione <dancol@HIDDEN>
>> Date: Sat, 01 Mar 2025 18:35:31 -0500
>>=20
>> Suppose we want to use local-function-key-map to translate
>> s-<down-mouse-3> to <down-mouse-3>.  If we don't have a concrete binding
>> for s-<down-mouse-3>, we never attempt to translate it: instead,
>> read_key_sequence discards the down event and skips right to
>> s-<mouse-3>, which we *can* translate.
>
> I think it's ambiguous which one should come first: the discarding of
> 'down' modifier or translation via that map.  The ELisp manual says:
>
>      The function =E2=80=98read-key-sequence=E2=80=99 ignores any button-=
down events that
>   don't have command bindings; therefore, the Emacs command loop ignores
>   them too.  This means that you need not worry about defining button-down
>   events unless you want them to do something.  The usual reason to define
>   a button-down event is so that you can track mouse motion (by reading
>   motion events) until the button is released.  *Note Motion Events::.
>
> And also:
>
>      If an input character is upper-case (or has the shift modifier) and
>   has no key binding, but its lower-case equivalent has one, then
>   =E2=80=98read-key-sequence=E2=80=99 converts the character to lower cas=
e.  (This
>   behavior can be disabled by setting the
>   =E2=80=98translate-upper-case-key-bindings=E2=80=99 user option to =E2=
=80=98nil=E2=80=99.)  Note that
>   =E2=80=98lookup-key=E2=80=99 does not perform case conversion in this w=
ay.
>
>      When reading input results in such a =E2=80=9Cshift-translation=E2=
=80=9D, Emacs sets
>   the variable =E2=80=98this-command-keys-shift-translated=E2=80=99 to a =
non-=E2=80=98nil=E2=80=99 value.
>   Lisp programs can examine this variable if they need to modify their
>   behavior when invoked by shift-translated keys.  For example, the
>   function =E2=80=98handle-shift-selection=E2=80=99 examines the value of=
 this variable to
>   determine how to activate or deactivate the region (*note
>   handle-shift-selection: The Mark.).
>
>      The function =E2=80=98read-key-sequence=E2=80=99 also transforms som=
e mouse events.
>   It converts unbound drag events into click events, and discards unbound
>   button-down events entirely.  It also reshuffles focus events and
>   miscellaneous window events so that they never appear in a key sequence
>   with any other events.
>
> Adding Stefan to the discussion.

Ambiguity aside, it's useful to translate down-mouse and other
discardable events like other events.  Consider trying to make a
local-function-key-map that translates super-modified mouse events to
unmodified mouse events without overriding explicit super-modified
bindings.  This translation can't translate s-down-mouse-1 to
down-mouse-1 unless there's a binding for down-mouse-1 (which defeats
the purpose of a translation).

Wouldn't it be simpler and more powerful to get the modifier-munging
stuff out of the main read_key_sequence loop and implement the down
event dropping in access_keymap_keyremap?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#76669; Package emacs. Full text available.

Message received at 76669 <at> debbugs.gnu.org:


Received: (at 76669) by debbugs.gnu.org; 2 Mar 2025 05:51:49 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 02 00:51:49 2025
Received: from localhost ([127.0.0.1]:50972 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tocEu-000799-NN
	for submit <at> debbugs.gnu.org; Sun, 02 Mar 2025 00:51:49 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:48794)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1tocEq-00078P-NP
 for 76669 <at> debbugs.gnu.org; Sun, 02 Mar 2025 00:51:47 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1tocEk-0005W9-4W; Sun, 02 Mar 2025 00:51:38 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=/rupg5h4nk1ueogr+u2aY2kj5G+FWJXOBq/k4e92vnI=; b=fHxxsl2xECinS38Aj3np
 k0922c2v82002uHZ9TbRdDA/fmslDiN46ARTkbe9C4S94fgKA3Yh4u+QomXNCbXJrmUgcusduJtl6
 /MbbRZb/pt9cC7ZsBz1KHZeZNlnqrYPR+ga9p22S+4EB7SHk31s+6nzkCRcUEaOp3riqJsoFc/ypi
 XcP+bgwlZLKDluX9TwmKrqmSz40n62S2mz1imdKnPxB4WlCY6WZwPErM3LGIPa54pEmOXJrQ4F6vq
 Fqpb6xvUmK11/brjEGxtcpvv8lvGgKwHXF1ccA16FKEi2du8LsHGDr0qJsWyyXCwL6bEPRlVcIVx+
 Sfo3xDfMslxZAg==;
Date: Sun, 02 Mar 2025 07:51:35 +0200
Message-Id: <86r03gnfo8.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Daniel Colascione <dancol@HIDDEN>,
 Stefan Monnier <monnier@HIDDEN>
In-Reply-To: <m1o6ykiat8.fsf@HIDDEN> (message from Daniel Colascione on
 Sat, 01 Mar 2025 18:35:31 -0500)
Subject: Re: bug#76669: read_key_sequence discards events without attempting
 remapping
References: <m1o6ykiat8.fsf@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -0.0 (/)
X-Debbugs-Envelope-To: 76669
Cc: 76669 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Daniel Colascione <dancol@HIDDEN>
> Date: Sat, 01 Mar 2025 18:35:31 -0500
> 
> Suppose we want to use local-function-key-map to translate
> s-<down-mouse-3> to <down-mouse-3>.  If we don't have a concrete binding
> for s-<down-mouse-3>, we never attempt to translate it: instead,
> read_key_sequence discards the down event and skips right to
> s-<mouse-3>, which we *can* translate.

I think it's ambiguous which one should come first: the discarding of
'down' modifier or translation via that map.  The ELisp manual says:

     The function ‘read-key-sequence’ ignores any button-down events that
  don't have command bindings; therefore, the Emacs command loop ignores
  them too.  This means that you need not worry about defining button-down
  events unless you want them to do something.  The usual reason to define
  a button-down event is so that you can track mouse motion (by reading
  motion events) until the button is released.  *Note Motion Events::.

And also:

     If an input character is upper-case (or has the shift modifier) and
  has no key binding, but its lower-case equivalent has one, then
  ‘read-key-sequence’ converts the character to lower case.  (This
  behavior can be disabled by setting the
  ‘translate-upper-case-key-bindings’ user option to ‘nil’.)  Note that
  ‘lookup-key’ does not perform case conversion in this way.

     When reading input results in such a “shift-translation”, Emacs sets
  the variable ‘this-command-keys-shift-translated’ to a non-‘nil’ value.
  Lisp programs can examine this variable if they need to modify their
  behavior when invoked by shift-translated keys.  For example, the
  function ‘handle-shift-selection’ examines the value of this variable to
  determine how to activate or deactivate the region (*note
  handle-shift-selection: The Mark.).

     The function ‘read-key-sequence’ also transforms some mouse events.
  It converts unbound drag events into click events, and discards unbound
  button-down events entirely.  It also reshuffles focus events and
  miscellaneous window events so that they never appear in a key sequence
  with any other events.

Adding Stefan to the discussion.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#76669; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 1 Mar 2025 23:35:52 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 01 18:35:52 2025
Received: from localhost ([127.0.0.1]:46616 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1toWN6-0003NY-Cb
	for submit <at> debbugs.gnu.org; Sat, 01 Mar 2025 18:35:52 -0500
Received: from lists.gnu.org ([2001:470:142::17]:35380)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <dancol@HIDDEN>) id 1toWN1-0003MO-JY
 for submit <at> debbugs.gnu.org; Sat, 01 Mar 2025 18:35:50 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <dancol@HIDDEN>) id 1toWMs-0000gq-I7
 for bug-gnu-emacs@HIDDEN; Sat, 01 Mar 2025 18:35:40 -0500
Received: from dancol.org ([2600:3c01:e000:3d8::1])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <dancol@HIDDEN>) id 1toWMq-0007uH-Lg
 for bug-gnu-emacs@HIDDEN; Sat, 01 Mar 2025 18:35:38 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dancol.org; 
 s=x;
 h=Content-Type:MIME-Version:Message-ID:Date:Subject:To:From:Sender:
 Reply-To:Cc:Content-Transfer-Encoding:Content-ID:Content-Description:
 Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:
 In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:
 List-Post:List-Owner:List-Archive;
 bh=jSHDkTM7bZzYAYPA6kz5B26MUxsRs4Of9hbQGP2AnBY=; b=KB4YMNl7lcAyDdVKrbDjQOY1+9
 pKlCtefmTtjqa/Fnj79ZG4rOWB+wYbo0Mzj2hu3YOdAZ+jmW9MW25U/ZTOIX2FnALvh/DJF15cFpa
 FW7+M7RrsuSWSa9Ag6C8VXb+wIgVFh+jiFUWVLKB8J6ZjyHwe0GoxH6Z3ZpjRLpyplY/SKM7SufVO
 cnG863IBNIz8ifMeL2AG2E2s5r1MhxFs79/VCvFwToihCrrvGx2fS8quRnsGh3pKkTv9VlvYjnAnq
 qL3Q0Imj5xp+bQW9cWrucL4lopKUw7ixxjU+d5JRBvzJHgCE8FkCCAOZO64ZFH5NffrjWLdf7vPuJ
 /CF+oB2A==;
Received: from dancol by dancol.org with local (Exim 4.96)
 (envelope-from <dancol@HIDDEN>) id 1toWMe-001WYc-12
 for bug-gnu-emacs@HIDDEN; Sat, 01 Mar 2025 18:35:24 -0500
From: Daniel Colascione <dancol@HIDDEN>
To: bug-gnu-emacs@HIDDEN
Subject: read_key_sequence discards events without attempting remapping
User-Agent: mu4e 1.12.8; emacs 31.0.50
Date: Sat, 01 Mar 2025 18:35:31 -0500
Message-ID: <m1o6ykiat8.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
Received-SPF: pass client-ip=2600:3c01:e000:3d8::1;
 envelope-from=dancol@HIDDEN; helo=dancol.org
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_PASS=-0.001,
 SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 0.9 (/)
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.1 (/)

Suppose we want to use local-function-key-map to translate
s-<down-mouse-3> to <down-mouse-3>.  If we don't have a concrete binding
for s-<down-mouse-3>, we never attempt to translate it: instead,
read_key_sequence discards the down event and skips right to
s-<mouse-3>, which we *can* translate.




Acknowledgement sent to Daniel Colascione <dancol@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#76669; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Sun, 2 Mar 2025 18:15:01 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.