From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Kai Ma Newsgroups: gmane.emacs.devel Subject: [PATCH] On the nasty "ghost key" problem on NS Date: Fri, 4 Nov 2022 02:07:39 +0800 Message-ID: Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3731.200.110.1.12\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_767EB272-0540-4CF9-BA5A-C813ECCB0534" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="8290"; mail-complaints-to="usenet@ciao.gmane.io" To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Nov 03 19:08:12 2022 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oqedQ-0001wW-DA for ged-emacs-devel@m.gmane-mx.org; Thu, 03 Nov 2022 19:08:12 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oqedD-0006GZ-5y; Thu, 03 Nov 2022 14:07:59 -0400 Original-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 ) id 1oqedB-0006DR-Oc for emacs-devel@gnu.org; Thu, 03 Nov 2022 14:07:57 -0400 Original-Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1oqed9-0001Id-QP for emacs-devel@gnu.org; Thu, 03 Nov 2022 14:07:57 -0400 Original-Received: by mail-pl1-x642.google.com with SMTP id c2so2657763plz.11 for ; Thu, 03 Nov 2022 11:07:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:date:message-id:subject:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=zgG0g3ArIxGO11hKDPRTfnxbjxjDywbh5h9hEm71LOs=; b=jq2QCLc/ogN24n+fEUkGCxJv5rFD7AdsLpeObYNY8mQT2WqAcSWOnGjDNjI3nEd0rT TTozkuUqHwCfxugo6rL28NMCqYaETozm6oSxVy9WN+uaFXdopf5gYyjoi8kNy9SehQeF 9bX3vzvisRskPNbKbXGWiLUZWJ6Bh7o2GU9paGBw/uKLZk2Q+xUMhaNXTBlorN6ffcp4 2zuEVsYj2ld8uEvb5qJPXxYNk9WF+8/9QVRcDqHWd1Hfs0lBXFUQEPJW90cwQUGRjCu7 gsLvPdWif/SXHMjA83L4gEmA4MTO0947Tzlcb7bG5cLVWQBxko6pEHdsw6wl+pPPOR4i MI0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:date:message-id:subject:mime-version:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=zgG0g3ArIxGO11hKDPRTfnxbjxjDywbh5h9hEm71LOs=; b=ihtbss1yzZBhnY3zb0N4k9aDnt2JdRNrt/hV9VJ3jbnUjLrbrQvojzEFtnhNfUaVO6 9y4aPgveCJRDjHbnJ33AOWSdSxmkJ1kEEcmpRupfwfXgKLzqNJ+BSi9wOzvipmvCn7qO RNYLQ8DK8f/Zao944Z/Dc6bIAaUsDnxLTFoU5rt8zImJk2xSZ/teP/zgXivHorj0m9Gm xD0zBRhZqNw9Iizprz5WYeNUtgAqBSKlUQ5clERsLwkJqv8VfOUSQhRN1tlEyaTBypma i3/5ynruJtCWGq421Tuq50WJW0nc3wL4J8AYOqgBEfnqND+MFpaXO1m70irqjKemcwnJ qc1A== X-Gm-Message-State: ACrzQf0lb1E7SQBrDRRP6EJkVDyU5s9GU4eLTOeveZ//S375oMIGS//+ qlRQIleNl9aXZJGMj//qmOxwg3zcdKU+UZ61 X-Google-Smtp-Source: AMsMyM5ErZmv7k9q1yug9q1Z8ynnZYzravbTJ6tg4epEbAVXuq8IWWlhfxid8DpoSg9o2DSSLqgM4Q== X-Received: by 2002:a17:902:f684:b0:187:1d07:7339 with SMTP id l4-20020a170902f68400b001871d077339mr22857979plg.23.1667498873914; Thu, 03 Nov 2022 11:07:53 -0700 (PDT) Original-Received: from smtpclient.apple (n058153105218.netvigator.com. [58.153.105.218]) by smtp.gmail.com with ESMTPSA id 20-20020a631354000000b0046b1dabf9a8sm1027789pgt.70.2022.11.03.11.07.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Nov 2022 11:07:53 -0700 (PDT) X-Mailer: Apple Mail (2.3731.200.110.1.12) Received-SPF: pass client-ip=2607:f8b0:4864:20::642; envelope-from=justksqsf@gmail.com; helo=mail-pl1-x642.google.com X-Spam_score_int: -15 X-Spam_score: -1.6 X-Spam_bar: - X-Spam_report: (-1.6 / 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, FREEMAIL_FROM=0.001, FROM_LOCAL_NOVOWEL=0.5, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: "Emacs-devel" Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:299089 Archived-At: --Apple-Mail=_767EB272-0540-4CF9-BA5A-C813ECCB0534 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hi all, Attached is a one-liner patch to the =E2=80=9Cghost key=E2=80=9D problem = on NS. (The name is made up by me.) I didn=E2=80=99t have luck finding a = bug report (but it did happen to many to-be-liberated Mac users [1-3]), = so I decided to directly send it here. On certain occasions (*), the key event buffer is not cleared to be = empty even if the events have been processed. This results in a nasty = problem: when you press a key, say =E2=80=9Cy=E2=80=9D, a key that is = pressed earlier will be prepended to the current key. There=E2=80=99s no = way to reset the event buffer. This problem is highly unpredictable, making it very hard to reproduce. = A probably quicker way: hack Emacs=E2=80=99 C codebase with corfu-auto = and citre-mode. (*) The root cause is still not clear to me. It=E2=80=99s observed that = sometimes, the [interpretKeyEvents] call seems not to return. (Blocked = inside Cocoa?) And the supposedly matched =E2=80=9Cremove=E2=80=9D is = never called. Now =E2=80=9CnsEvArray=E2=80=9D is left with an earlier = keyDown event, and since =E2=80=9CnsEvArray=E2=80=9D is static, you have = the problem as described above. I guess it may be some Cocoa internal = changes that caused this. This patch is just a workaround, but it improves the current user = experience a bit. Regards Kai [1] https://emacs-china.org/t/emacs-rime-e/20286 [2] https://emacs-china.org/t/emacs/15430 [3] https://emacs-china.org/t/topic/13207 --Apple-Mail=_767EB272-0540-4CF9-BA5A-C813ECCB0534 Content-Disposition: attachment; filename=trace.org Content-Type: application/octet-stream; x-unix-mode=0644; name="trace.org" Content-Transfer-Encoding: 7bit * trace1 #+begin_src fundamental ,*1 #nsEvArray = 0 keyDown: code =6d fnKey =0 flags = 100 mods = 0 keyDown: Begin compose sequence. event added... ,*2 #nsEvArray = 1 2022-11-04 00:27:47.272 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:47.273 emacs[46756:2752417] firstRectForCharRange request 2022-11-04 00:27:47.273 emacs[46756:2752417] insertText 'm' len = 1 event removed... ,*3 #nsEvArray = 0 ,*1 #nsEvArray = 0 keyDown: code =61 fnKey =0 flags = 100 mods = 0 keyDown: Begin compose sequence. event added... ,*2 #nsEvArray = 1 2022-11-04 00:27:47.297 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:47.297 emacs[46756:2752417] firstRectForCharRange request 2022-11-04 00:27:47.298 emacs[46756:2752417] insertText 'a' len = 1 event removed... ,*3 #nsEvArray = 0 ,*1 #nsEvArray = 0 keyDown: code =63 fnKey =0 flags = 100 mods = 0 keyDown: Begin compose sequence. event added... ,*2 #nsEvArray = 1 2022-11-04 00:27:47.727 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:47.727 emacs[46756:2752417] firstRectForCharRange request 2022-11-04 00:27:47.729 emacs[46756:2752417] insertText 'c' len = 1 event removed... ,*3 #nsEvArray = 0 ,*1 #nsEvArray = 0 keyDown: code =73 fnKey =0 flags = 100 mods = 0 keyDown: Begin compose sequence. event added... ,*2 #nsEvArray = 1 2022-11-04 00:27:47.732 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:47.732 emacs[46756:2752417] firstRectForCharRange request 2022-11-04 00:27:48.424 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:48.424 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:48.424 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:48.424 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:48.424 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:48.424 emacs[46756:2752417] selectedRange request ,*1 #nsEvArray = 1 event added... ,*2 #nsEvArray = 2 2022-11-04 00:27:50.028 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:50.028 emacs[46756:2752417] firstRectForCharRange request 2022-11-04 00:27:50.029 emacs[46756:2752417] insertText 's' len = 1 2022-11-04 00:27:50.030 emacs[46756:2752417] selectedRange request 2022-11-04 00:27:50.030 emacs[46756:2752417] firstRectForCharRange request 2022-11-04 00:27:50.030 emacs[46756:2752417] insertText 's' len = 1 event removed... ,*3 #nsEvArray = 1 #+end_src * trace2 #+begin_src fundamental ,*1 #nsEvArray = 0 keyDown: code =73 fnKey =0 flags = 100 mods = 0 keyDown: Begin compose sequence. event added... ,*2 #nsEvArray = 1 2022-11-04 00:08:38.627 emacs[43626:2728428] selectedRange request 2022-11-04 00:08:38.627 emacs[43626:2728428] firstRectForCharRange request 2022-11-04 00:08:38.628 emacs[43626:2728428] insertText 's' len = 1 event removed... ,*3 #nsEvArray = 0 ,*1 #nsEvArray = 0 keyDown: code =65 fnKey =0 flags = 100 mods = 0 keyDown: Begin compose sequence. event added... ,*2 #nsEvArray = 1 2022-11-04 00:08:38.973 emacs[43626:2728428] selectedRange request 2022-11-04 00:08:38.973 emacs[43626:2728428] firstRectForCharRange request 2022-11-04 00:08:38.973 emacs[43626:2728428] insertText 'e' len = 1 event removed... ,*3 #nsEvArray = 0 ,*1 #nsEvArray = 0 keyDown: code =6c fnKey =0 flags = 100 mods = 0 keyDown: Begin compose sequence. event added... ,*2 #nsEvArray = 1 2022-11-04 00:08:38.976 emacs[43626:2728428] selectedRange request 2022-11-04 00:08:38.976 emacs[43626:2728428] firstRectForCharRange request ,*1 #nsEvArray = 1 event added... ,*2 #nsEvArray = 2 2022-11-04 00:08:39.639 emacs[43626:2728428] selectedRange request 2022-11-04 00:08:39.639 emacs[43626:2728428] firstRectForCharRange request 2022-11-04 00:08:39.640 emacs[43626:2728428] insertText 'l' len = 1 2022-11-04 00:08:39.641 emacs[43626:2728428] selectedRange request 2022-11-04 00:08:39.641 emacs[43626:2728428] firstRectForCharRange request 2022-11-04 00:08:39.641 emacs[43626:2728428] insertText 'f' len = 1 event removed... ,*3 #nsEvArray = 1 ,*1 #nsEvArray = 1 keyDown: code =20 fnKey =0 flags = 100 mods = 0 keyDown: Begin compose sequence. event added... ,*2 #nsEvArray = 2 2022-11-04 00:08:40.776 emacs[43626:2728428] selectedRange request 2022-11-04 00:08:40.776 emacs[43626:2728428] firstRectForCharRange request 2022-11-04 00:08:40.776 emacs[43626:2728428] insertText 'l' len = 1 2022-11-04 00:08:40.777 emacs[43626:2728428] selectedRange request 2022-11-04 00:08:40.777 emacs[43626:2728428] firstRectForCharRange request 2022-11-04 00:08:40.778 emacs[43626:2728428] insertText ' ' len = 1 event removed... ,*3 #nsEvArray = 1 #+end_src --Apple-Mail=_767EB272-0540-4CF9-BA5A-C813ECCB0534 Content-Disposition: attachment; filename=fix-ghost-key.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="fix-ghost-key.patch" Content-Transfer-Encoding: 7bit diff --git a/src/nsterm.m b/src/nsterm.m index 17f40dc7e3..0a90e85e15 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -6904,7 +6904,7 @@ In that case we use UCKeyTranslate (ns_get_shifted_character) /* FIXME: Use [NSArray arrayWithObject:theEvent]? */ [nsEvArray addObject: theEvent]; [self interpretKeyEvents: nsEvArray]; - [nsEvArray removeObject: theEvent]; + [nsEvArray removeAllObjects]; } --Apple-Mail=_767EB272-0540-4CF9-BA5A-C813ECCB0534--