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.bugs Subject: bug#72555: 30.0.60; [PATCH] NS: support passing key events to the system Date: Sat, 10 Aug 2024 13:47:48 +0200 Message-ID: Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3774.600.62\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_AC80F4A8-D3D0-4BBF-AD7F-89A85F8DF0CC" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="35182"; mail-complaints-to="usenet@ciao.gmane.io" To: 72555@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Aug 10 13:48:57 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1sckae-0008z1-Oh for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 10 Aug 2024 13:48:56 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sckaI-0007kR-N3; Sat, 10 Aug 2024 07:48:34 -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 1sckaH-0007gJ-HJ for bug-gnu-emacs@gnu.org; Sat, 10 Aug 2024 07:48:33 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sckaH-0007Wq-8U for bug-gnu-emacs@gnu.org; Sat, 10 Aug 2024 07:48:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=Date:Mime-Version:From:To:Subject; bh=g7jP+HIucZFBe0+jNiU6Eq3ImuGHeTXw2iB0mS3iLt4=; b=s/nwyt35ecm2NVcbhq1yJpwi3ghYUSjOq7DMllDrz/g7+4su99BE5FQA678968mzCsnjTarsfRbZLKVQLUwCkwu3doGYXA+rR3/SM8i6zTSdkoPaqmKQZQpVeiMTRP2cMm/zDdCF1WVAjEeBNt4Eqk3NchUU2Fl8t/anotXTHmT8UIEDT7f/Lz/qRcBnGPGH7fmABoL6Fr44hi2qUdPyLXqc/fiemMe7RL2y5fvFxn4onynHCweVHytf8mZH3k1f+CE5/GKwLsDnq6LigMo1cMr8lvgddOuqrbwz2Kf5d1qE82CvVSoTRWelgWeTWAH3ieLpayG5f/tlv9rntRJ1gw==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1sckak-0003bG-Dy for bug-gnu-emacs@gnu.org; Sat, 10 Aug 2024 07:49:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Kai Ma Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 10 Aug 2024 11:49:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 72555 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: "Bug reports for GNU Emacs, the Swiss army knife of text editors" Original-Received: via spool by submit@debbugs.gnu.org id=B.172329051713806 (code B ref -1); Sat, 10 Aug 2024 11:49:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 10 Aug 2024 11:48:37 +0000 Original-Received: from localhost ([127.0.0.1]:39134 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sckaK-0003aa-VX for submit@debbugs.gnu.org; Sat, 10 Aug 2024 07:48:37 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:35150) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sckaJ-0003aS-2v for submit@debbugs.gnu.org; Sat, 10 Aug 2024 07:48:35 -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 1sckZp-0005hM-JM for bug-gnu-emacs@gnu.org; Sat, 10 Aug 2024 07:48:05 -0400 Original-Received: from mail-wm1-x344.google.com ([2a00:1450:4864:20::344]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sckZn-0007UH-TK for bug-gnu-emacs@gnu.org; Sat, 10 Aug 2024 07:48:05 -0400 Original-Received: by mail-wm1-x344.google.com with SMTP id 5b1f17b1804b1-42122ac2f38so16496715e9.1 for ; Sat, 10 Aug 2024 04:48:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723290480; x=1723895280; darn=gnu.org; h=to:date:message-id:subject:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=g7jP+HIucZFBe0+jNiU6Eq3ImuGHeTXw2iB0mS3iLt4=; b=KlZs/QJfqDhDMz3e9ix/DRk+K+ttMkFiHcJfSE11BGuTvbe8VZHjsut5csXZlkzyaP ozi8JjJnmJdJd48EoDXct1/CpnEHcPZzBoEGzwJuL+xBOpN0J2B58Vx9CQKMIu52thin q2ofgPCjNZ/usQjg5m6OaMJBaiQjrxj5CjNj1lZq47/S4MV6xlEv7Z8cEXe70bSdyXqF X58BHPwA+N+41x1H/Mmx6Yks9L6jNYd//1dYpTKqMvkOr7+tXFhmEn/70iooIoJzWlwX RiJy27RA176pypmusIom1X99rcBh7aYgOworMkdzh14e5F7RTABu0lKv+Tc3lANDWefs H8qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723290480; x=1723895280; h=to:date:message-id:subject:mime-version:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=g7jP+HIucZFBe0+jNiU6Eq3ImuGHeTXw2iB0mS3iLt4=; b=ftK/60VlCrpALy2HHsYuwVqCoDT0OpulqbktWJXkabEnyILzswtwzvnWea/sMfgvFN sMJNjsVpFtB+etyaP/zwhhqBUEHorqYvlaw3Gpdmx5bLh4JSF6aynNRhMuKEaysHsuhO V5AVH6NxW/7+aOTb6HipkpQuGtT9XD1JzXWCi2XkVoX/K3zYOter6Hd63SwGySg9WZXu /ZeZiNdwd+FBusqno0+DrRkA3iux4lYBsqSk0KFT9Sg7Lu237h0OKS+5XvTrOXHtGCBv LrqPH41S/wrK/FfXCBc6cMpdXsKKqc+v9s1wnq/MprkYSOcMdS5XNVr0lFvVNFjxfaFi Q/uA== X-Gm-Message-State: AOJu0Yy3CeTWNjB906IB5R/hMThtRVB73auPeMNBYF8SDSsMCft/McPy IZF3GoL0yJMHPMvCZ5jfPhOq4unPS4lJ5OSytxfWUiHY6Hv+KRf9OfQb8mhO X-Google-Smtp-Source: AGHT+IHjsQNDKUeYxHAVTbNRndnVjath4sAp+g7uBplKn5nTajFfIT1P46vJfzRByVjuk9Cfoqahww== X-Received: by 2002:a05:600c:458c:b0:424:8be4:f2c with SMTP id 5b1f17b1804b1-429c3abe633mr36302225e9.2.1723290479949; Sat, 10 Aug 2024 04:47:59 -0700 (PDT) Original-Received: from smtpclient.apple ([2a02:2454:8758:c800:44b0:ad6c:55c6:dc74]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4290c72d4c9sm114207925e9.8.2024.08.10.04.47.59 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 10 Aug 2024 04:47:59 -0700 (PDT) X-Mailer: Apple Mail (2.3774.600.62) Received-SPF: pass client-ip=2a00:1450:4864:20::344; envelope-from=justksqsf@gmail.com; helo=mail-wm1-x344.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: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list 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: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:289996 Archived-At: --Apple-Mail=_AC80F4A8-D3D0-4BBF-AD7F-89A85F8DF0CC Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii The attached patch adds ns-pass-keys-to-system and makes Emacs to send the key events to the system input manager when it's set. This can correct a number of problems that are hard to work around due to the current key handling logic of Emacs NSport. (1) The keydown event of Shift+Enter is never sent to the system input method. This causes an annoying problem for system input methods: if you press Shift+Enter in Emacs (that is three events: Shift down, Shift+Enter down, Shift up), the input method only sees Shift down and up. However, many input methods interprets a click of Shift differently (mostly toggling ASCII mode), and this causes unwanted behavior. (This was reported as #38293 in 2019.) This can only be fixed by Emacs, because to input methods, Shift+Enter is indistinguishable from a single Shift. (2) The input method may define some special keys and Emacs cannot make use of them. (3) Some system level shortcuts never work in Emacs. For example, Rectangle (think of it as a third-party window manager in macOS) will not receive any requests from Emacs windows. The fix is mostly modeled after Mitsuharu's Mac port, with a few adjustments for NS port. I've been using it for some time and there are no more defects known to me, so I decide it's time to send it to you. Regards, Kai --Apple-Mail=_AC80F4A8-D3D0-4BBF-AD7F-89A85F8DF0CC Content-Disposition: attachment; filename=0001-NS-Pass-key-events-to-system-first.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-NS-Pass-key-events-to-system-first.patch" Content-Transfer-Encoding: quoted-printable =46rom=206e0a8ac127ce5da7fb50aca2fe63819719d2740f=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Kai=20Ma=20=0ADate:=20= Sun,=2011=20Jun=202023=2014:29:25=20+0800=0ASubject:=20[PATCH]=20NS:=20= Pass=20key=20events=20to=20system=20first.=0A=0A*=20src/nsterm.h=20= (@interface=20EmacsView):=20Add=20keyEventsInterpreted=20and=0A= rawKeyEvent.=0A*=20src/nsterm.m=20(syms_of_nsterm):=20Add=20= ns-pass-keys-to-system.=0A([EmacsView=20keyDown]):=20Interpret=20key=20= events=20first=20if=0Ans-pass-keys-to-system=20is=20set.=0A([EmacsView=20= insertText]):=20Adjust.=0A([EmacsView=20doCommandBySelector]):=20Adjust.=0A= ([EmacsView=20markedRange]):=20Adjust.=0A([EmacsView=20selectedRange]):=20= Adjust.=0A---=0A=20src/nsterm.h=20|=20=202=20++=0A=20src/nsterm.m=20|=20= 44=20++++++++++++++++++++++++++++++++++++++++----=0A=202=20files=20= changed,=2042=20insertions(+),=204=20deletions(-)=0A=0Adiff=20--git=20= a/src/nsterm.h=20b/src/nsterm.h=0Aindex=20480f9febe5d..0ee01696f2c=20= 100644=0A---=20a/src/nsterm.h=0A+++=20b/src/nsterm.h=0A@@=20-481,6=20= +481,8=20@@=20#define=20NSTRACE_UNSILENCE()=0A=20=20=20int=20= maximized_width,=20maximized_height;=0A=20=20=20EmacsWindow=20= *nonfs_window;=0A=20=20=20BOOL=20fs_is_native;=0A+=20=20BOOL=20= keyEventsInterpreted;=0A+=20=20NSEvent=20*rawKeyEvent;=0A=20@public=0A=20= =20=20struct=20frame=20*emacsframe;=0A=20=20=20int=20= scrollbarsNeedingUpdate;=0Adiff=20--git=20a/src/nsterm.m=20= b/src/nsterm.m=0Aindex=209978ff6433e..e3c78822bb4=20100644=0A---=20= a/src/nsterm.m=0A+++=20b/src/nsterm.m=0A@@=20-6993,6=20+6993,8=20@@=20-=20= (void)keyDown:=20(NSEvent=20*)theEvent=0A=20=0A=20=20=20NSTRACE=20= ("[EmacsView=20keyDown:]");=0A=20=0A+=20=20rawKeyEvent=20=3D=20theEvent;=0A= +=0A=20=20=20/*=20Rhapsody=20and=20macOS=20give=20up=20and=20down=20= events=20for=20the=20arrow=20keys.=20=20*/=0A=20=20=20if=20([theEvent=20= type]=20!=3D=20NSEventTypeKeyDown)=0A=20=20=20=20=20return;=0A@@=20= -7096,12=20+7098,23=20@@=20In=20that=20case=20we=20use=20UCKeyTranslate=20= (ns_get_shifted_character)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20code,=20fnKeysym,=20flags,=20emacs_event->modifiers);=0A=20= #endif=0A=20=0A-=20=20=20=20=20=20/*=20If=20it=20was=20a=20function=20= key=20or=20had=20control-like=20modifiers,=20pass=0A-=20=20=20=20=20=20=20= =20=20it=20directly=20to=20Emacs.=20=20*/=0A+=20=20=20=20=20=20/*=20It=20= was=20a=20function=20key=20or=20had=20control-like=20modifiers.=20=20*/=0A= =20=20=20=20=20=20=20if=20(fnKeysym=20||=20(emacs_event->modifiers=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20= (emacs_event->modifiers=20!=3D=20shift_modifier)=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20[[theEvent=20= charactersIgnoringModifiers]=20length]=20>=200))=0A=20=20=20=20=20=20=20=20= =20{=0A+=20=20=20=20=20=20=20=20=20=20/*=20Before=20passing=20it=20to=20= Emacs,=20check=20if=20there=20is=20a=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20system-level=20interpretation.=20=20*/=0A+=20=20=20=20=20=20=20=20=20= =20if=20(ns_pass_keys_to_system)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20keyEventsInterpreted=20=3D=20= YES;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20[self=20= interpretKeyEvents:=20@[theEvent]];=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20if=20(keyEventsInterpreted)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20return;=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20= =20=20=20=20=20=20=20=20/*=20Pass=20it=20directly=20to=20Emacs.=20=20*/=0A= +=0A=20=20=20=20=20=20=20=20=20=20=20emacs_event->kind=20=3D=20= NON_ASCII_KEYSTROKE_EVENT;=0A=20=20=20=20=20=20=20=20=20=20=20/*=20= FIXME:=20What=20are=20the=20next=20four=20lines=20supposed=20to=20do?=20=20= */=0A=20=20=20=20=20=20=20=20=20=20=20if=20(code=20<=200x20)=0A@@=20= -7172,6=20+7185,15=20@@=20In=20that=20case=20we=20use=20UCKeyTranslate=20= (ns_get_shifted_character)=0A=20-=20(void)=20insertText:=20(id)=20string=0A= =20=20=20=20replacementRange:=20(NSRange)=20replacementRange=0A=20{=0A+=20= =20/*=20Don't=20interpret=20modified=20events=20(except=20Shift=20and=20= NumericPad).=20=20*/=0A+=20=20NSEventModifierFlags=20flags=20=3D=20= rawKeyEvent.modifierFlags=0A+=20=20=20=20&=20= NSEventModifierFlagDeviceIndependentFlagsMask;=0A+=20=20if=20(flags=20&=20= ~(NSEventModifierFlagShift=20|=20NSEventModifierFlagNumericPad))=0A+=20=20= =20=20{=0A+=20=20=20=20=20=20keyEventsInterpreted=20=3D=20NO;=0A+=20=20=20= =20=20=20return;=0A+=20=20=20=20}=0A+=0A=20=20=20if=20([string=20= isKindOfClass:[NSAttributedString=20class]])=0A=20=20=20=20=20string=20=3D= =20[string=20string];=0A=20=20=20[self=20unmarkText];=0A@@=20-7337,6=20= +7359,7=20@@=20-=20(NSRange)markedRange=0A=20=20=20=20=20?=20NSMakeRange=20= (0,=20[workingText=20length])=20:=20NSMakeRange=20(NSNotFound,=200);=0A=20= =20=20if=20(NS_KEYLOG)=0A=20=20=20=20=20NSLog=20(@"markedRange=20= request");=0A+=20=20keyEventsInterpreted=20=3D=20NO;=0A=20=20=20return=20= rng;=0A=20}=0A=20=0A@@=20-7440,9=20+7463,17=20@@=20-=20= (void)doCommandBySelector:=20(SEL)aSelector=0A=20=20=20if=20(NS_KEYLOG)=0A= =20=20=20=20=20NSLog=20(@"doCommandBySelector:=20%@",=20= NSStringFromSelector=20(aSelector));=0A=20=0A-=20=20processingCompose=20= =3D=20NO;=0A-=20=20if=20(aSelector=20=3D=3D=20@selector=20= (deleteBackward:))=0A+=20=20/*=20Either=20this=20is=20a=20function=20= key,=20or=20is=20a=20delete=20event=20when=0A+=20=20=20=20=20composition=20= is=20active.=20=20*/=0A+=0A+=20=20if=20(processingCompose=20=3D=3D=20NO)=0A= =20=20=20=20=20{=0A+=20=20=20=20=20=20/*=20The=20key=20event=20was=20not=20= interpreted=20by=20interpretKeyEvents:.=20=20*/=0A+=20=20=20=20=20=20= keyEventsInterpreted=20=3D=20NO;=0A+=20=20=20=20}=0A+=20=20else=20if=20= (aSelector=20=3D=3D=20@selector=20(deleteBackward:))=0A+=20=20=20=20{=0A= +=20=20=20=20=20=20processingCompose=20=3D=20NO;=0A=20=20=20=20=20=20=20= /*=20Happens=20when=20user=20backspaces=20over=20an=20ongoing=20= composition:=0A=20=20=20=20=20=20=20=20=20=20throw=20a=20'delete'=20into=20= the=20event=20queue.=20=20*/=0A=20=20=20=20=20=20=20if=20(!emacs_event)=0A= @@=20-11351,6=20+11382,11=20@@=20Convert=20an=20X=20font=20name=20(XLFD)=20= to=20an=20NS=20font=20name.=0A=20If=20`none',=20the=20key=20is=20ignored=20= by=20Emacs=20and=20retains=20its=20standard=20meaning.=20=20*/);=0A=20=20= =20ns_function_modifier=20=3D=20Qnone;=0A=20=0A+=20=20DEFVAR_BOOL=20= ("ns-pass-keys-to-system",=20ns_pass_keys_to_system,=0A+=20=20=20=20doc:=20= /*=20If=20non-nil,=20pass=20all=20key=20events=20to=20the=20system=20= input=20manager=0A+before=20they=20are=20passed=20to=20Emacs.=20=20*/);=0A= +=20=20ns_pass_keys_to_system=20=3D=20YES;=0A+=0A=20=20=20DEFVAR_LISP=20= ("ns-antialias-text",=20ns_antialias_text,=0A=20=20=20=20=20doc:=20/*=20= Non-nil=20(the=20default)=20means=20to=20render=20text=20antialiased.=20=20= */);=0A=20=20=20ns_antialias_text=20=3D=20Qt;=0A--=20=0A2.39.3=20(Apple=20= Git-146)=0A=0A= --Apple-Mail=_AC80F4A8-D3D0-4BBF-AD7F-89A85F8DF0CC--