From: boehm.igor@gmail.com
To: <9front@9front.org>
Subject: [9front] drawterm/gui-cocoa/screen.m: mouse button emulation a la plan9port
Date: Mon, 21 Dec 2020 16:05:03 +0100 [thread overview]
Message-ID: <79796855E365982566CE9384962A99CE@gmail.com> (raw)
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]; }
next reply other threads:[~2020-12-21 15:08 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-21 15:05 boehm.igor [this message]
-- strict thread matches above, loose matches on Subject: below --
2020-12-21 14:24 boehm.igor
2021-06-17 6:21 ` unobe
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
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=79796855E365982566CE9384962A99CE@gmail.com \
--to=boehm.igor@gmail.com \
--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).