9front - general discussion about 9front
 help / color / mirror / Atom feed
From: unobe@cpan.org
To: 9front@9front.org
Subject: Re: [9front] drawterm/gui-cocoa/screen.m: mouse button emulation a la plan9port
Date: Wed, 16 Jun 2021 23:21:56 -0700	[thread overview]
Message-ID: <30B545776E29A4E640E836E519922FB9@smtp.pobox.com> (raw)
In-Reply-To: <CF0FFBAA5E36D9EF3EE5FEA80492EDE6@gmail.com>

Did this patch request get lost? Or was there an issue with it?

Quoth boehm.igor@gmail.com:
> 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]; }
> 
> 
> 


  reply	other threads:[~2021-06-17  6:31 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-21 14:24 boehm.igor
2021-06-17  6:21 ` unobe [this message]
2021-06-17  7:35   ` igor
2021-06-17 13:01     ` Eric Lynema
2021-06-17  7:40   ` cinap_lenrek
2021-06-17  7:50     ` unobe
2020-12-21 15:05 boehm.igor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=30B545776E29A4E640E836E519922FB9@smtp.pobox.com \
    --to=unobe@cpan.org \
    --cc=9front@9front.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).