From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 19646 invoked from network); 21 Dec 2020 15:08:33 -0000 Received: from ewsd.inri.net (107.191.116.128) by inbox.vuxu.org with ESMTPUTF8; 21 Dec 2020 15:08:33 -0000 Received: from mail-wr1-f53.google.com ([209.85.221.53]) by ewsd; Mon Dec 21 10:05:12 -0500 2020 Received: by mail-wr1-f53.google.com with SMTP id d13so11339019wrc.13 for <9front@9front.org>; Mon, 21 Dec 2020 07:05:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:message-id:to:subject:date:mime-version :content-transfer-encoding; bh=mbsNul8Bz7ma7VR/9lGWz1WM6r5bZgqp/5hmQ57wKJY=; b=MuC+uzrIbPqOCVM8u8g93aHRe6UG1ZTFlTaouoLE7cu+Q7Mbzy4mGoTwRBc3gDe+P1 sW+DtnR5uLiYAa21AT9BApiHo0j44PZ5YN9DgLRY9mp2dKs0emSCNNLbbT1DoAM61+9N 3I1O9Ba12D7CQF6s+iK4aNCQt+nMKHdHp9wYKdRzbCaQqD5sV/6xAe+Ns2fgZvmtv1D+ 2QjajH1vWh1UhtRQrzyRCgqG3PTTwfMnT+l/Fj631flMFZDXhB8Y3dS0W9ZQ3D4ryGrd ovwUXBBZP4LSN6m1CmVx6tnIOOGfo3mCbez22G9U3mfEvWpmpxjR08aJ/PgxYN58YVyC yr/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:to:subject:date:mime-version :content-transfer-encoding; bh=mbsNul8Bz7ma7VR/9lGWz1WM6r5bZgqp/5hmQ57wKJY=; b=oIVxTzeMT3NEUL5VYAdGk4WefxEr4+0nwggnh5EbaxrhnyUODd0mqEa7P5iWIOT1gL HmJrhOX/LV1uguk2EXG8clJSsiP1PFV+ROG/kUKIRPOAO6Mtfz1CboaKnP+aQsR/Gbhq BUWZtVAxW7LP+FdFT5bCnOIQLCRCU40G49sqeXWJVz6TwEQAJhmhoaWiAjNzKKr6tscc Y+E4VEt8DBK5DH3fLZ40WPMKEEhS6RYNlAGSWO0wLiSiIZcv0xMJr0T6lRc0IJNHp3zA XqoBlvMpPj7GeZJetVg/RntNiFmvlFNLjxiANbtQC5z6EZoe9OZiiCEfwnwz07cEqLYC j0Rg== X-Gm-Message-State: AOAM531rho2h8DWQ80P74TvSS2wwUdzWPheI3JiCXw5EE4gGRHs0f+GW NE+KRWbheiiCmrPcnAuUoca5EK1AXzk= X-Google-Smtp-Source: ABdhPJwOWyHNAaBEUokjK8DdgcR/eOpuFyUogdtIbUFWFB0hO28eRnGF/ZBjxzkOBdnsDh5On2I4uw== X-Received: by 2002:a5d:43ce:: with SMTP id v14mr19118790wrr.342.1608563106969; Mon, 21 Dec 2020 07:05:06 -0800 (PST) Return-Path: Received: from cirno.home ([185.64.155.70]) by smtp.gmail.com with ESMTPSA id k6sm23148708wmf.25.2020.12.21.07.05.04 for <9front@9front.org> (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 21 Dec 2020 07:05:05 -0800 (PST) From: boehm.igor@gmail.com X-Google-Original-From: igor@gmail.com Message-ID: <79796855E365982566CE9384962A99CE@gmail.com> To: <9front@9front.org> Date: Mon, 21 Dec 2020 16:05:03 +0100 MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: shared structured full-stack JSON firewall-based strategy Subject: [9front] drawterm/gui-cocoa/screen.m: mouse button emulation a la plan9port Reply-To: 9front@9front.org Precedence: bulk Dear all, Inline is a patch that eases the use of drawterm on mac laptops that lack mouse buttons. For consistency reasons it behaves the same as on plan9port, namely like this: "For systems without a three button mouse, the keyboard modifier keys can be used to modify the effect of the main mouse button. On Mac systems, the option key changes the main button to button 2, and the Command key changes it to button 3. Pressing the key after the button is held down adds the button to form a chord, so that for example on Macs selecting text with the trackpad button and then typing Option without letting go of the button will cause a 1-2 chord, cutting the selection. These changes were inspired by rsc's plan9port." If you prefer to view this diff on GitHub here is a link: https://github.com/1g0rb0hm/drawterm/commit/6cc968737b0ba5476516b698d8a539d5a2b26b62 If this is not the right place to propose drawterm patches or if changes should be made please let me know. Cheers, Igor diff -r 1f70be1f0305 gui-cocoa/screen.m --- a/gui-cocoa/screen.m Wed Nov 18 23:01:01 2020 +0100 +++ b/gui-cocoa/screen.m Mon Dec 21 15:12:23 2020 +0100 @@ -364,43 +364,76 @@ kbdkey(m, 0); } +- (void)sendmouse:(NSUInteger)b +{ + NSPoint p; + Point q; + + p = [self.window mouseLocationOutsideOfEventStream]; + q.x = p.x; + q.y = p.y; + if(!ptinrect(q, gscreen->clipr)) return; + absmousetrack(p.x, self.frame.size.height - p.y, b, ticks()); +} + - (void)flagsChanged:(NSEvent*)event { - static NSEventModifierFlags y; - NSEventModifierFlags x; + static NSEventModifierFlags omod; + NSEventModifierFlags m; + NSUInteger b; - x = [event modifierFlags]; - if((x & ~y & NSEventModifierFlagShift) != 0) - kbdkey(Kshift, 1); - if((x & ~y & NSEventModifierFlagControl) != 0) - kbdkey(Kctl, 1); - if((x & ~y & NSEventModifierFlagOption) != 0) - kbdkey(Kalt, 1); - if((x & ~y & NSEventModifierFlagCapsLock) != 0) - kbdkey(Kcaps, 1); - if((~x & y & NSEventModifierFlagShift) != 0) - kbdkey(Kshift, 0); - if((~x & y & NSEventModifierFlagControl) != 0) - kbdkey(Kctl, 0); - if((~x & y & NSEventModifierFlagOption) != 0) - kbdkey(Kalt, 0); - if((x & ~y & NSEventModifierFlagCapsLock) != 0) - kbdkey(Kcaps, 0); - y = x; + m = [event modifierFlags]; + b = [NSEvent pressedMouseButtons]; + b = b & ~6 | b << 1 & 4 | b >> 1 & 2; + if(b){ + if(m & ~omod & NSEventModifierFlagControl) + b |= 1; + if(m & ~omod & NSEventModifierFlagOption) + b |= 2; + if(m & ~omod & NSEventModifierFlagCommand) + b |= 4; + [self sendmouse:b]; + }else{ + if((m & ~omod & NSEventModifierFlagShift) != 0) + kbdkey(Kshift, 1); + if((m & ~omod & NSEventModifierFlagControl) != 0) + kbdkey(Kctl, 1); + if((m & ~omod & NSEventModifierFlagOption) != 0) + kbdkey(Kalt, 1); + if((m & ~omod & NSEventModifierFlagCapsLock) != 0) + kbdkey(Kcaps, 1); + if((~m & omod & NSEventModifierFlagShift) != 0) + kbdkey(Kshift, 0); + if((~m & omod & NSEventModifierFlagControl) != 0) + kbdkey(Kctl, 0); + if((~m & omod & NSEventModifierFlagOption) != 0) + kbdkey(Kalt, 0); + if((m & ~omod & NSEventModifierFlagCapsLock) != 0) + kbdkey(Kcaps, 0); + } + omod = m; } - (void)mouseevent:(NSEvent*)event { - NSPoint p; - Point q; - NSUInteger u; + NSUInteger b; + NSEventModifierFlags m; - p = [self.window mouseLocationOutsideOfEventStream]; - u = [NSEvent pressedMouseButtons]; - q.x = p.x; - q.y = p.y; - if(!ptinrect(q, gscreen->clipr)) return; - u = u & ~6 | u << 1 & 4 | u >> 1 & 2; - absmousetrack(p.x, self.frame.size.height - p.y, u, ticks()); + b = [NSEvent pressedMouseButtons]; + b = b & ~6 | b << 1 & 4 | b >> 1 & 2; + if(b==1){ + m = [event modifierFlags]; + if(m & NSEventModifierFlagOption) + b=2; + else if(m & NSEventModifierFlagCommand) + b=4; + else if(m & NSEventModifierFlagControl) + b=8; + }else if(b==4){ + m = [event modifierFlags]; + if(m & NSEventModifierFlagCommand) + b=8; + } + [self sendmouse:b]; } - (void) mouseDown:(NSEvent*)event { [self mouseevent:event]; }