From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Newsgroups: gmane.emacs.bugs Subject: bug#45502: [PATCH] Prettier key bindings in NS menu entries Date: Tue, 29 Dec 2020 13:02:21 +0100 Message-ID: <02937096-EAF5-4B74-A1C7-CCE6E64C67E3@acm.org> References: Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.17\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_7CEE20F4-D8CA-4920-ADCD-EC74C0DFDF06" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="20864"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 45502@debbugs.gnu.org, Daniel =?UTF-8?Q?Mart=C3=ADn?= To: Alan Third Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Dec 29 13:06:16 2020 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 1kuDlW-0005GV-CU for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 29 Dec 2020 13:06:14 +0100 Original-Received: from localhost ([::1]:33642 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kuDlV-0002fd-Ap for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 29 Dec 2020 07:06:13 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:49754) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kuDlK-0002fU-JS for bug-gnu-emacs@gnu.org; Tue, 29 Dec 2020 07:06:03 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:54526) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kuDlK-0007PF-CF for bug-gnu-emacs@gnu.org; Tue, 29 Dec 2020 07:06:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1kuDlK-00083j-5U for bug-gnu-emacs@gnu.org; Tue, 29 Dec 2020 07:06:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 29 Dec 2020 12:06:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 45502 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 45502-submit@debbugs.gnu.org id=B45502.160924354430956 (code B ref 45502); Tue, 29 Dec 2020 12:06:02 +0000 Original-Received: (at 45502) by debbugs.gnu.org; 29 Dec 2020 12:05:44 +0000 Original-Received: from localhost ([127.0.0.1]:37839 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kuDl2-00083D-Bx for submit@debbugs.gnu.org; Tue, 29 Dec 2020 07:05:44 -0500 Original-Received: from mail1471c50.megamailservers.eu ([91.136.14.71]:38248 helo=mail102c50.megamailservers.eu) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kuDkw-00082u-Gi for 45502@debbugs.gnu.org; Tue, 29 Dec 2020 07:05:43 -0500 X-Authenticated-User: mattiase@bredband.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu; s=maildub; t=1609243532; bh=8NX2nQ7iiPSEOFdgT/r2htLNq1kHzetfIt7axoQ0YMo=; h=From:Subject:Date:In-Reply-To:Cc:To:References:From; b=AwcFymV3hD20rlgCpRLF4kZuLTJSdaFFBEeEjSm0EiDMHRjVdgpGnt+T02IP508fk SgMGHwnXTCjHd9D55/YhcnBvyPgce8Jn8+MfQ/y2nukzhIr/vFMUFgWh1c9wU1V3zg m0yv2QPLI0hpou11KMTEp1E4xJcQD+wZO7sqMqHg= Feedback-ID: mattiase@acm.or Original-Received: from [192.168.0.4] (c188-150-171-71.bredband.comhem.se [188.150.171.71]) (authenticated bits=0) by mail102c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id 0BTC5T6v009664; Tue, 29 Dec 2020 12:05:31 +0000 In-Reply-To: X-Mailer: Apple Mail (2.3445.104.17) X-CTCH-RefID: str=0001.0A742F19.5FEB1B8C.0005, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0 X-CTCH-VOD: Unknown X-CTCH-Spam: Unknown X-CTCH-Score: 0.000 X-CTCH-Flags: 0 X-CTCH-ScoreCust: 0.000 X-CSC: 0 X-CHA: v=2.3 cv=d6CLNirE c=1 sm=1 tr=0 a=SF+I6pRkHZhrawxbOkkvaA==:117 a=SF+I6pRkHZhrawxbOkkvaA==:17 a=M51BFTxLslgA:10 a=hIj89exaAAAA:8 a=Xgo7r8iyDzcWwRRN-UIA:9 a=QEXdDO2ut3YA:10 a=SBdF89ghQyjUy-zPoN4A:9 a=B2y7HmGcmWMA:10 a=lS9wXHQM5UdnNJ4u63Ry:22 X-Origin-Country: SE 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" Xref: news.gmane.io gmane.emacs.bugs:196923 Archived-At: --Apple-Mail=_7CEE20F4-D8CA-4920-ADCD-EC74C0DFDF06 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 28 dec. 2020 kl. 19.36 skrev Alan Third : > I'm not sure either, but I guess the tabstop thing would look > something like: [...] Actually seems to work! (In your place I would feign a complete lack of = surprise.) Resulting patch attached. 28 dec. 2020 kl. 23.46 skrev Daniel Mart=C3=ADn : > Thanks for the patch! It crashed Emacs when I tried to open the Gnus > menu bar (the Gnus menu bar is an extreme case with lots of bindings). Confirmed, but that is unrelated to my patch. Alan, will you have a = look? > I'm not sure if left-alignment or right-alignment would be better. To > improve visuals, Apple seems to align with respect to the =E2=8C=98 = symbol, but > that doesn't fit Emacs well because there's no single modifier that is > used in almost every keybinding (some use Control, some Meta). Also, > it's not uncommon in Emacs to have keybindings that are a couple of > keymaps deep. Right; it's easy to use either left or right alignment for the bindings. = (I think we all agree that they should be kept in a separate column to = the right of the menu strings in either case.) I'm going to experiment = with translating modifiers and keys to the standard symbols. Not sure = how to deal with modifiers that are unavailable, such as s-k when no = Super modifier is available. It might be a good idea to normalise how key bindings are displayed on = all platforms to some extent. For example, is better written = C- or C-RET, is better as M- or M-DEL = (although not necessarily exactly the same thing, it's a bit muddy). Of course <> are terrible as angle brackets; we typically want =E2=80=B9=E2= =80=BA or =E2=9F=A8=E2=9F=A9 depending on context and purpose. --Apple-Mail=_7CEE20F4-D8CA-4920-ADCD-EC74C0DFDF06 Content-Disposition: attachment; filename=0001-Right-justify-keys-in-NS-menu-entries-bug-45502.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-Right-justify-keys-in-NS-menu-entries-bug-45502.patch" Content-Transfer-Encoding: quoted-printable =46rom=203ad8a068e7743d947377087429b204996c2a650c=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Mon,=2028=20Dec=202020=2015:24:08=20+0100=0A= Subject:=20[PATCH]=20Right-justify=20keys=20in=20NS=20menu=20entries=20= (bug#45502)=0A=0AEach=20menu=20entry=20now=20has=20the=20key=20binding=20= right-aligned,=20as=20an=20attempt=0Ato=20improve=20readability.=20=20= Previously=20the=20keys=20were=20given=20in=20brackets=0Aimmediately=20= following=20the=20menu=20string.=0A=0A*=20src/nsmenu.m=20([EmacsMenu=20= parseKeyEquiv:]):=20Remove.=0A(skipspc):=20New=20helper=20function.=0A= ([EmacsMenu=20addItemWithWidgetValue:]):=20Add=20attributes=20argument.=0A= Use=20attributed=20title=20string.=20=20Don't=20special-case=20Super=20= bindings.=0A([EmacsMenu=20fillWithWidgetValue:]):=20Compute=20maximum=20= width.=20=20Prepare=0Aattributes=20for=20title.=0A---=0A=20src/nsmenu.m=20= |=20103=20++++++++++++++++++++++++++++-----------------------=0A=20= src/nsterm.h=20|=20=20=205=20+--=0A=202=20files=20changed,=2058=20= insertions(+),=2050=20deletions(-)=0A=0Adiff=20--git=20a/src/nsmenu.m=20= b/src/nsmenu.m=0Aindex=2023699627b1..967388f3bb=20100644=0A---=20= a/src/nsmenu.m=0A+++=20b/src/nsmenu.m=0A@@=20-448,33=20+448,16=20@@=20-=20= (BOOL)performKeyEquivalent:=20(NSEvent=20*)theEvent=0A=20}=0A=20=0A=20=0A= -/*=20Parse=20a=20widget_value's=20key=20rep=20(examples:=20's-p',=20= 's-S',=20'(C-x=20C-s)',=20'')=0A-=20=20=20into=20an=20accelerator=20= string.=20=20We=20are=20only=20able=20to=20display=20a=20single=20= character=0A-=20=20=20for=20an=20accelerator,=20together=20with=20an=20= optional=20modifier=20combination.=20=20(Under=0A-=20=20=20Carbon=20more=20= control=20was=20possible,=20but=20in=20Cocoa=20multi-char=20strings=20= passed=20to=0A-=20=20=20NSMenuItem=20get=20ignored.=20=20For=20now=20we=20= try=20to=20display=20a=20super-single=20letter=0A-=20=20=20combo,=20and=20= return=20the=20others=20as=20strings=20to=20be=20appended=20to=20the=20= item=20title.=0A-=20=20=20(This=20is=20signaled=20by=20setting=20= keyEquivModMask=20to=200=20for=20now.)=20*/=0A--(NSString=20= *)parseKeyEquiv:=20(const=20char=20*)key=0A+static=20const=20char=20*=0A= +skipspc=20(const=20char=20*s)=0A=20{=0A-=20=20const=20char=20*tpos=20=3D=20= key;=0A-=20=20keyEquivModMask=20=3D=20NSEventModifierFlagCommand;=0A-=0A= -=20=20if=20(!key=20||=20!*key)=0A-=20=20=20=20return=20@"";=0A-=0A-=20=20= while=20(*tpos=20=3D=3D=20'=20'=20||=20*tpos=20=3D=3D=20'(')=0A-=20=20=20= =20tpos++;=0A-=20=20if=20((*tpos=20=3D=3D=20's')=20&&=20(*(tpos+1)=20=3D=3D= =20'-'))=0A-=20=20=20=20{=0A-=20=20=20=20=20=20return=20[NSString=20= stringWithFormat:=20@"%c",=20tpos[2]];=0A-=20=20=20=20}=0A-=20=20= keyEquivModMask=20=3D=200;=20/*=20signal=20*/=0A-=20=20return=20= [NSString=20stringWithUTF8String:=20tpos];=0A+=20=20while=20(*s=20=3D=3D=20= '=20')=0A+=20=20=20=20s++;=0A+=20=20return=20s;=0A=20}=0A=20=0A-=0A=20-=20= (NSMenuItem=20*)addItemWithWidgetValue:=20(void=20*)wvptr=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=20=20=20= attributes:=20(NSDictionary=20*)attributes=0A=20{=0A=20=20=20NSMenuItem=20= *item;=0A=20=20=20widget_value=20*wv=20=3D=20(widget_value=20*)wvptr;=0A= @@=20-482,36=20+465,28=20@@=20-=20(NSMenuItem=20= *)addItemWithWidgetValue:=20(void=20*)wvptr=0A=20=20=20if=20= (menu_separator_name_p=20(wv->name))=0A=20=20=20=20=20{=0A=20=20=20=20=20= =20=20item=20=3D=20[NSMenuItem=20separatorItem];=0A-=20=20=20=20=20=20= [self=20addItem:=20item];=0A=20=20=20=20=20}=0A=20=20=20else=0A=20=20=20=20= =20{=0A-=20=20=20=20=20=20NSString=20*title,=20*keyEq;=0A-=20=20=20=20=20= =20title=20=3D=20[NSString=20stringWithUTF8String:=20wv->name];=0A+=20=20= =20=20=20=20NSString=20*title=20=3D=20[NSString=20stringWithUTF8String:=20= wv->name];=0A=20=20=20=20=20=20=20if=20(title=20=3D=3D=20nil)=0A=20=20=20= =20=20=20=20=20=20title=20=3D=20@"<=20?=20>";=20=20/*=20(get=20out=20in=20= the=20open=20so=20we=20know=20about=20it)=20*/=0A=20=0A-=20=20=20=20=20=20= keyEq=20=3D=20[self=20parseKeyEquiv:=20wv->key];=0A-#ifdef=20= NS_IMPL_COCOA=0A-=20=20=20=20=20=20/*=20macOS=20mangles=20modifier=20= strings=20longer=20than=20one=20character.=20=20*/=0A-=20=20=20=20=20=20= if=20(keyEquivModMask=20=3D=3D=200)=0A+=20=20=20=20=20=20/*=20Cocoa=20= only=20permits=20a=20single=20key=20(with=20modifiers)=20as=0A+=20=20=20=20= =20=20=20=20=20keyEquivalent,=20so=20we=20stick=20with=20the=20standard=20= Emacs=20notation=0A+=20=20=20=20=20=20=20=20=20for=20all=20key=20= bindings=20for=20the=20sake=20of=20uniformity.=20*/=0A+=20=20=20=20=20=20= if=20(wv->key)=0A=20=20=20=20=20=20=20=20=20{=0A-=20=20=20=20=20=20=20=20= =20=20title=20=3D=20[title=20stringByAppendingFormat:=20@"=20(%@)",=20= keyEq];=0A-=20=20=20=20=20=20=20=20=20=20item=20=3D=20[self=20= addItemWithTitle:=20(NSString=20*)title=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=20=20=20=20=20=20=20=20= action:=20@selector=20(menuDown:)=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=20keyEquivalent:=20@""];=0A+=20=20= =20=20=20=20=20=20=20=20NSString=20*key=20=3D=20[NSString=20= stringWithUTF8String:=20skipspc=20(wv->key)];=0A+=20=20=20=20=20=20=20=20= =20=20title=20=3D=20[title=20stringByAppendingFormat:=20@"\t%@",=20key];=0A= =20=20=20=20=20=20=20=20=20}=0A-=20=20=20=20=20=20else=0A-=20=20=20=20=20= =20=20=20{=0A-#endif=0A-=20=20=20=20=20=20=20=20=20=20item=20=3D=20[self=20= addItemWithTitle:=20(NSString=20*)title=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=20=20=20=20=20=20=20=20= action:=20@selector=20(menuDown:)=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=20keyEquivalent:=20keyEq];=0A= -#ifdef=20NS_IMPL_COCOA=0A-=20=20=20=20=20=20=20=20}=0A-#endif=0A-=20=20=20= =20=20=20[item=20setKeyEquivalentModifierMask:=20keyEquivModMask];=0A=20=0A= +=20=20=20=20=20=20NSAttributedString=20*atitle=20=3D=20= [[NSAttributedString=20alloc]=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=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20initWithString:=20title=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=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20attributes:=20attributes];=0A+=20=20=20=20=20=20item=20= =3D=20[[NSMenuItem=20alloc]=20init];=0A+=20=20=20=20=20=20[item=20= setAction:=20@selector=20(menuDown:)];=0A+=20=20=20=20=20=20[item=20= setAttributedTitle:=20atitle];=0A=20=20=20=20=20=20=20[item=20= setEnabled:=20wv->enabled];=0A=20=0A=20=20=20=20=20=20=20/*=20Draw=20= radio=20buttons=20and=20tickboxes.=20=20*/=0A@@=20-524,6=20+499,7=20@@=20= -=20(NSMenuItem=20*)addItemWithWidgetValue:=20(void=20*)wvptr=0A=20=20=20= =20=20=20=20[item=20setTag:=20(NSInteger)wv->call_data];=0A=20=20=20=20=20= }=0A=20=0A+=20=20[self=20addItem:=20item];=0A=20=20=20return=20item;=0A=20= }=0A=20=0A@@=20-548,15=20+524,48=20@@=20-(void)removeAllItems=0A=20=0A=20= -=20(void)fillWithWidgetValue:=20(void=20*)wvptr=0A=20{=0A-=20=20= widget_value=20*wv=20=3D=20(widget_value=20*)wvptr;=0A+=20=20= widget_value=20*first_wv=20=3D=20(widget_value=20*)wvptr;=0A+=20=20= NSFont=20*menuFont=20=3D=20[NSFont=20menuFontOfSize:0];=0A+=20=20= NSDictionary=20*font_attribs=20=3D=20@{NSFontAttributeName:=20menuFont};=0A= +=20=20CGFloat=20maxNameWidth=20=3D=200;=0A+=20=20CGFloat=20maxKeyWidth=20= =3D=200;=0A+=0A+=20=20/*=20Determine=20the=20maximum=20width=20of=20all=20= menu=20items.=20*/=0A+=20=20for=20(widget_value=20*wv=20=3D=20first_wv;=20= wv=20!=3D=20NULL;=20wv=20=3D=20wv->next)=0A+=20=20=20=20if=20= (!menu_separator_name_p=20(wv->name))=0A+=20=20=20=20=20=20{=0A+=20=20=20= =20=20=20=20=20NSString=20*name=20=3D=20[NSString=20= stringWithUTF8String:=20wv->name];=0A+=20=20=20=20=20=20=20=20NSSize=20= nameSize=20=3D=20[name=20sizeWithAttributes:=20font_attribs];=0A+=20=20=20= =20=20=20=20=20maxNameWidth=20=3D=20MAX(maxNameWidth,=20nameSize.width);=0A= +=20=20=20=20=20=20=20=20if=20(wv->key)=0A+=20=20=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20NSString=20*key=20=3D=20= [NSString=20stringWithUTF8String:=20skipspc=20(wv->key)];=0A+=20=20=20=20= =20=20=20=20=20=20=20=20NSSize=20keySize=20=3D=20[key=20= sizeWithAttributes:=20font_attribs];=0A+=20=20=20=20=20=20=20=20=20=20=20= =20maxKeyWidth=20=3D=20MAX(maxKeyWidth,=20keySize.width);=0A+=20=20=20=20= =20=20=20=20=20=20}=0A+=20=20=20=20=20=20}=0A+=0A+=20=20/*=20Put=20some=20= space=20between=20the=20names=20and=20keys.=20*/=0A+=20=20CGFloat=20= maxWidth=20=3D=20maxNameWidth=20+=20maxKeyWidth=20+=2040;=0A+=0A+=20=20= /*=20Set=20a=20right-aligned=20tab=20stop=20at=20the=20maximum=20width,=20= so=20that=20the=0A+=20=20=20=20=20key=20will=20appear=20immediately=20to=20= the=20left=20of=20it.=20*/=0A+=20=20NSTextTab=20*tab=20=3D=0A+=20=20=20=20= [[NSTextTab=20alloc]=20initWithTextAlignment:=20NSTextAlignmentRight=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=20= =20=20=20=20=20=20=20=20=20=20location:=20maxWidth=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=20=20=20=20=20=20=20= =20=20=20=20=20options:=20@{}];=0A+=20=20NSMutableParagraphStyle=20= *pstyle=20=3D=20[[NSMutableParagraphStyle=20alloc]=20init];=0A+=20=20= [pstyle=20setTabStops:=20@[tab]];=0A+=20=20NSDictionary=20*attributes=20= =3D=20@{NSParagraphStyleAttributeName:=20pstyle};=0A=20=0A=20=20=20/*=20= clear=20existing=20contents=20*/=0A=20=20=20[self=20removeAllItems];=0A=20= =0A=20=20=20/*=20add=20new=20contents=20*/=0A-=20=20for=20(;=20wv=20!=3D=20= NULL;=20wv=20=3D=20wv->next)=0A+=20=20for=20(widget_value=20*wv=20=3D=20= first_wv;=20wv=20!=3D=20NULL;=20wv=20=3D=20wv->next)=0A=20=20=20=20=20{=0A= -=20=20=20=20=20=20NSMenuItem=20*item=20=3D=20[self=20= addItemWithWidgetValue:=20wv];=0A+=20=20=20=20=20=20NSMenuItem=20*item=20= =3D=20[self=20addItemWithWidgetValue:=20wv=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=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20attributes:=20attributes];=0A=20=0A=20=20=20=20= =20=20=20if=20(wv->contents)=0A=20=20=20=20=20=20=20=20=20{=0Adiff=20= --git=20a/src/nsterm.h=20b/src/nsterm.h=0Aindex=20b7b4d3b047..f1d5acde2e=20= 100644=0A---=20a/src/nsterm.h=0A+++=20b/src/nsterm.h=0A@@=20-515,13=20= +515,12=20@@=20#define=20NS_DRAW_TO_BUFFER=201=0A=20=0A=20@interface=20= EmacsMenu=20:=20NSMenu=20=20=0A=20{=0A-=20=20unsigned=20= long=20keyEquivModMask;=0A=20=20=20BOOL=20needsUpdate;=0A=20}=0A=20=0A=20= -=20(void)menuNeedsUpdate:=20(NSMenu=20*)menu;=20/*=20(delegate=20= method)=20*/=0A--=20(NSString=20*)parseKeyEquiv:=20(const=20char=20= *)key;=0A--=20(NSMenuItem=20*)addItemWithWidgetValue:=20(void=20*)wvptr;=0A= +-=20(NSMenuItem=20*)addItemWithWidgetValue:=20(void=20*)wvptr=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=20=20=20= attributes:=20(NSDictionary=20*)attributes;=0A=20-=20= (void)fillWithWidgetValue:=20(void=20*)wvptr;=0A=20-=20(EmacsMenu=20= *)addSubmenuWithTitle:=20(const=20char=20*)title;=0A=20-=20(void)=20= removeAllItems;=0A--=20=0A2.21.1=20(Apple=20Git-122.3)=0A=0A= --Apple-Mail=_7CEE20F4-D8CA-4920-ADCD-EC74C0DFDF06--