From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Alan Third Newsgroups: gmane.emacs.devel Subject: Re: Emacs 26 MacOS bugs Date: Sat, 10 Feb 2018 01:47:11 +0000 Message-ID: <20180210014711.GA31157@breton.holly.idiocy.org> References: <20180206190518.f43jsoughhlsi22y@adversary.org> <20180206222722.5uf43fd56p44dk5z@adversary.org> <20180207004331.q4cll6nyldse2bin@adversary.org> <20180207021301.zpvpexdkewztqxo4@adversary.org> <20180207225505.GB1066@breton.holly.idiocy.org> <20180209163512.bgoqgj2ayyv4vvyq@adversary.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="mP3DRpeJDSE+ciuQ" Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1518227142 25471 195.159.176.226 (10 Feb 2018 01:45:42 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 10 Feb 2018 01:45:42 +0000 (UTC) User-Agent: Mutt/1.9.3 (2018-01-21) Cc: Philipp Stephani , Emacs developers , Noam Postavsky To: Ben McGinnes Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Feb 10 02:45:38 2018 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ekKEG-0005Qs-14 for ged-emacs-devel@m.gmane.org; Sat, 10 Feb 2018 02:45:24 +0100 Original-Received: from localhost ([::1]:38831 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ekKGH-0001Ci-IK for ged-emacs-devel@m.gmane.org; Fri, 09 Feb 2018 20:47:29 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:55316) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ekKG5-0001BA-Js for emacs-devel@gnu.org; Fri, 09 Feb 2018 20:47:18 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ekKG4-0006YL-AE for emacs-devel@gnu.org; Fri, 09 Feb 2018 20:47:17 -0500 Original-Received: from mail-wr0-x234.google.com ([2a00:1450:400c:c0c::234]:42214) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ekKG3-0006XX-U8 for emacs-devel@gnu.org; Fri, 09 Feb 2018 20:47:16 -0500 Original-Received: by mail-wr0-x234.google.com with SMTP id 41so9951321wrc.9 for ; Fri, 09 Feb 2018 17:47:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=3JvKrE0IF2fO8j8jT6mIvege/refKmRcDkkRjiy7R5I=; b=WTKvB8Wy1XJ9Xs0E45KJt7ILwtcIwIqtkJN7wHOROxl+d4lBN/hMSmLO5uSX0IgPh3 8vKvLfQ0yRUTS0iCQ8YKr9cD78Ac383oxuTrtIg66OQYYVirLiLdd9loMbAX7oVi9cJW heAF5wX11Et4UOHsj33jNhR914VTZCJUIR0c/y+wO4ltDxZM2lghpO2N3k3foznq0x00 1Nu7i/wN7woej5sOcKeckMB4OIDF9nZq5dArE60qxhVm7ZYvrV8HYOEVxvM5IFWxvQXB //+uSHIT5z03Q7BAlImMhSvR1/oYxgyecOcHGd4tMXLm2z9Itd0F9Gnlm9g309RjQe6P q2ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-disposition :content-transfer-encoding:in-reply-to:user-agent; bh=3JvKrE0IF2fO8j8jT6mIvege/refKmRcDkkRjiy7R5I=; b=uXigFfI5GPUNc3fR6pZeHNsEDCyljlDo8fzqQhV25I9xHHro4CiS57rTRJpcL4xPhq WhTKjD+Dheay1ZX6aUqnZrFzBmjzR8rzQgRZQGFYSxBoWqid5MQLuR3Uy1Rwx0AVgBNa 6tR/aHRJWASoYlVv4ANUOIhCpTYSRScjeWK/htk7iQPXSoJG4VaYeMM47XptL7c3sPCo ftyltr5bPrU6im6FH+VDdF254LtMi5X8ztI+bCCxKNsKePL14AogyTd6Ddjh790I3Duc CLi+tCGKk9UsNm6HOwQdRLFVTiLk7yHjlN0imZVuLnLmV3u/DCfCeaWS4AMXvxET4G95 6RCw== X-Gm-Message-State: APf1xPB0sebBzKDCzgYZUZrpOmlwq74UOEThaWDXDEtIBlLvQ/ndSKK/ AfZCgK49GtC3URfB7edCMvc= X-Google-Smtp-Source: AH8x227J2EdkpHRABKRCeW24HIlelLh8nfgBG9dgarAEzBWcWFBTy+Ald1bpVu7OGdSivntfXPH/yQ== X-Received: by 10.223.144.33 with SMTP id h30mr1975742wrh.193.1518227234542; Fri, 09 Feb 2018 17:47:14 -0800 (PST) Original-Received: from breton.holly.idiocy.org (ip6-2001-08b0-03f8-8129-d127-2850-73d2-f1ea.holly.idiocy.org. [2001:8b0:3f8:8129:d127:2850:73d2:f1ea]) by smtp.gmail.com with ESMTPSA id r189sm485944wmd.39.2018.02.09.17.47.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 09 Feb 2018 17:47:13 -0800 (PST) Content-Disposition: inline In-Reply-To: <20180209163512.bgoqgj2ayyv4vvyq@adversary.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::234 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:222643 Archived-At: --mP3DRpeJDSE+ciuQ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Sat, Feb 10, 2018 at 03:35:12AM +1100, Ben McGinnes wrote: > > Can you please try the attached patch? > > Yeah, I'll have to try it in a couple of days or so, I'm on the road > at the moment. Please ignore that last patch and test the one attached to this email. I discovered a whole other range of problems when I tried building against GNUstep. -- Alan Third --mP3DRpeJDSE+ciuQ Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="v2-0001-Fix-modifier-keys-on-NS-port.patch" Content-Transfer-Encoding: 8bit >From 776cd862aa7686e3e72db190c2116b0bf946ca7e Mon Sep 17 00:00:00 2001 From: Alan Third Date: Wed, 7 Feb 2018 22:39:17 +0000 Subject: [PATCH v2] Fix modifier keys on NS port * src/nsterm.m (EV_MODIFIERS_OPTION): (EV_MODIFIERS_CONTROL): (EV_MODIFIERS_COMMAND): New macros. (ev_modifiers_helper): New function. (EV_MODIFIERS2): Use new helper function. (EmacsView::keyDown): Remove duplicate functionality and handle fn key correctly. --- src/nsterm.m | 94 +++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 36 deletions(-) diff --git a/src/nsterm.m b/src/nsterm.m index b7f5a32c09..f017d8d152 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -352,31 +352,56 @@ - (NSColor *)colorUsingDefaultColorSpace #define NSRightCommandKeyMask (0x000010 | NSEventModifierFlagCommand) #define NSLeftAlternateKeyMask (0x000020 | NSEventModifierFlagOption) #define NSRightAlternateKeyMask (0x000040 | NSEventModifierFlagOption) -#define EV_MODIFIERS2(flags) \ - (((flags & NSEventModifierFlagHelp) ? \ - hyper_modifier : 0) \ - | (!EQ (ns_right_alternate_modifier, Qleft) && \ - ((flags & NSRightAlternateKeyMask) \ - == NSRightAlternateKeyMask) ? \ - parse_solitary_modifier (ns_right_alternate_modifier) : 0) \ - | ((flags & NSEventModifierFlagOption) ? \ - parse_solitary_modifier (ns_alternate_modifier) : 0) \ - | ((flags & NSEventModifierFlagShift) ? \ - shift_modifier : 0) \ - | (!EQ (ns_right_control_modifier, Qleft) && \ - ((flags & NSRightControlKeyMask) \ - == NSRightControlKeyMask) ? \ - parse_solitary_modifier (ns_right_control_modifier) : 0) \ - | ((flags & NSEventModifierFlagControl) ? \ - parse_solitary_modifier (ns_control_modifier) : 0) \ - | ((flags & NS_FUNCTION_KEY_MASK) ? \ - parse_solitary_modifier (ns_function_modifier) : 0) \ - | (!EQ (ns_right_command_modifier, Qleft) && \ - ((flags & NSRightCommandKeyMask) \ - == NSRightCommandKeyMask) ? \ - parse_solitary_modifier (ns_right_command_modifier) : 0) \ - | ((flags & NSEventModifierFlagCommand) ? \ - parse_solitary_modifier (ns_command_modifier):0)) + +static unsigned int +ev_modifiers_helper (unsigned int flags, unsigned int left_mask, + unsigned int right_mask, unsigned int either_mask, + Lisp_Object left_modifier, Lisp_Object right_modifier) +{ + unsigned int modifiers = 0; + + if (flags & either_mask) + { + BOOL left_key = (flags & left_mask) == left_mask; + BOOL right_key = (flags & right_mask) == right_mask + && ! EQ (right_modifier, Qleft); + + if (right_key) + modifiers |= parse_solitary_modifier (right_modifier); + + /* GNUstep (and possibly macOS in certain circumstances) doesn't + differentiate between the left and right keys, so if we can't + identify which key it is, we use the left key setting. */ + if (left_key || ! right_key) + modifiers |= parse_solitary_modifier (left_modifier); + } + + return modifiers; +} + +#define EV_MODIFIERS2(flags) \ + (((flags & NSEventModifierFlagHelp) ? \ + hyper_modifier : 0) \ + | ((flags & NSEventModifierFlagShift) ? \ + shift_modifier : 0) \ + | ((flags & NS_FUNCTION_KEY_MASK) ? \ + parse_solitary_modifier (ns_function_modifier) : 0) \ + | ev_modifiers_helper (flags, NSLeftControlKeyMask, \ + NSRightControlKeyMask, \ + NSEventModifierFlagControl, \ + ns_control_modifier, \ + ns_right_control_modifier) \ + | ev_modifiers_helper (flags, NSLeftCommandKeyMask, \ + NSRightCommandKeyMask, \ + NSEventModifierFlagCommand, \ + ns_command_modifier, \ + ns_right_command_modifier) \ + | ev_modifiers_helper (flags, NSLeftAlternateKeyMask, \ + NSRightAlternateKeyMask, \ + NSEventModifierFlagOption, \ + ns_alternate_modifier, \ + ns_right_alternate_modifier)) + #define EV_MODIFIERS(e) EV_MODIFIERS2 ([e modifierFlags]) #define EV_UDMODIFIERS(e) \ @@ -6130,15 +6155,6 @@ flag set (this is probably a bug in the OS). code = fnKeysym; } - /* are there modifiers? */ - emacs_event->modifiers = 0; - - if (flags & NSEventModifierFlagHelp) - emacs_event->modifiers |= hyper_modifier; - - if (flags & NSEventModifierFlagShift) - emacs_event->modifiers |= shift_modifier; - /* The ⌘ and ⌥ modifiers can be either shift-like (for alternate character input) or control-like (as command prefix). If we have only shift-like modifiers, then we should use the @@ -6155,8 +6171,14 @@ untranslated characters (returned by the modifier keys, which returns 0 for shift-like modifiers. Therefore its return value is the set of control-like modifiers. */ - unsigned int control_modifiers = EV_MODIFIERS2 (flags); - emacs_event->modifiers |= control_modifiers; + emacs_event->modifiers = EV_MODIFIERS2 (flags); + + /* Function keys (such as the F-keys, arrow keys, etc.) behave + as though the fn key has been pressed even when it hasn't. + We need to unset the fn modifier if one of these keys is + pressed. FIXME: Avoid setting it in the first place. */ + if (fnKeysym && (flags & NS_FUNCTION_KEY_MASK)) + emacs_event->modifiers ^= parse_solitary_modifier (ns_function_modifier); if (NS_KEYLOG) fprintf (stderr, "keyDown: code =%x\tfnKey =%x\tflags = %x\tmods = %x\n", -- 2.16.1 --mP3DRpeJDSE+ciuQ--