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 14666 invoked from network); 21 Dec 2020 14:28:16 -0000 Received: from ewsd.inri.net (107.191.116.128) by inbox.vuxu.org with ESMTPUTF8; 21 Dec 2020 14:28:16 -0000 Received: from mail-wr1-f42.google.com ([209.85.221.42]) by ewsd; Mon Dec 21 09:24:39 -0500 2020 Received: by mail-wr1-f42.google.com with SMTP id w5so11224217wrm.11 for <9front@9front.org>; Mon, 21 Dec 2020 06:24:34 -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=3QMCV9m4YYvy1WyxY0lwjlIotLqcJK1DEhEE23DNPYE=; b=inXQLS+eJcDGUOKfquKrCBbfARo63xBRp6dgwuJq48JLX3At+9SzOX8bFKYOEsrDFz toPaibBy0SllLpLgCBdD3JKOIym048NC62LxhOepSQvoyK7IP6J7tIcL99pHyMy77Fa+ 5AmiLPIlXpsrOwqTbyKO32njZvqCbhA6y0Ut+d6uMT7XyOIgdj2u8T7amgG+PLmUzdkp q1fzB85z0oZTjMkHdwBwSvccdH2H/bAgLBjs8OKBlBl5GgXSGEZ1RT16+DhAZEYD7LYU 9cCU7msXTAr7xykDUH6lkZVQTRPCQLsZ/DYd12WyAGC0vvNb/RA6dbV7LCPdsEh7Q/jw GXag== 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=3QMCV9m4YYvy1WyxY0lwjlIotLqcJK1DEhEE23DNPYE=; b=itllEfex6w6IUJ7NTryfDqKaY7DX6CRLuTczwqi190TJcV9T9QrLhX9mK4F6/ejg0X SEuI9mT9zut6T25hWRbPEJqZoPw8PeLnmyGcoT3pitZ/NeNFD9dmEw3OECs3KQN5Bu9k 7HjZMHuNceAZ8v4vKayPYp8vflDTkyo3xp3X1iubpvpnUqsKEq26EqSB+Am0mvkZEXMT Qup2v8oXpcUPBiTsd0wNnqAQOomYjfW/Te1/+OAx5NCQha92pSgUulGtRPN2a5qk5QcM hErb88XMbfGbPPDuIx58IDoVqNCa3LnjvQpJpFxSWqKshxIHKdhvZQL4i7V16n6zu5a3 eQNg== X-Gm-Message-State: AOAM532rmdbsFj02gv85sRM1N9I+GL/XSAvah7rKQmRSOwD13Rnk9cn4 PLllC0ZdmklKuuUIVo6cTcE= X-Google-Smtp-Source: ABdhPJxSTkuL9vHi2Fs9HsZPETzg3DRmFrgDlz/QcdNutd+r3RH3d5ocp64RJXT+5lDmi+AufP0FxA== X-Received: by 2002:adf:d0c6:: with SMTP id z6mr18904498wrh.10.1608560673677; Mon, 21 Dec 2020 06:24:33 -0800 (PST) Return-Path: Received: from cirno.home ([185.64.155.70]) by smtp.gmail.com with ESMTPSA id m5sm16596916wrz.18.2020.12.21.06.24.32 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 21 Dec 2020 06:24:33 -0800 (PST) From: boehm.igor@gmail.com X-Google-Original-From: igor@gmail.com Message-ID: To: <9front@9front.org>, Igor@gmail.com, Boehm@gmail.com, Date: Mon, 21 Dec 2020 15:24:31 +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: plugin shader grid 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]; }