mirror of
https://github.com/wez/wezterm.git
synced 2024-09-20 19:27:22 +03:00
basic plumbing for mouse input on macos
This commit is contained in:
parent
57992c0570
commit
5f7d2f5ccc
@ -97,9 +97,11 @@ bitflags! {
|
|||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct MouseButtons: u8 {
|
pub struct MouseButtons: u8 {
|
||||||
const NONE = 0;
|
const NONE = 0;
|
||||||
const LEFT = 1<<1;
|
const LEFT = 1<<0;
|
||||||
const RIGHT = 1<<2;
|
const RIGHT = 1<<1;
|
||||||
const MIDDLE = 1<<3;
|
const MIDDLE = 1<<2;
|
||||||
|
const X1 = 1<<3;
|
||||||
|
const X2 = 1<<4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
use super::nsstring;
|
use super::nsstring;
|
||||||
use crate::bitmaps::Image;
|
use crate::bitmaps::Image;
|
||||||
use crate::os::macos::bitmap::BitmapRef;
|
use crate::os::macos::bitmap::BitmapRef;
|
||||||
use crate::{BitmapImage, Color, Dimensions, Operator, PaintContext, WindowCallbacks};
|
use crate::{
|
||||||
|
BitmapImage, Color, Dimensions, Modifiers, MouseButtons, MouseEvent, MouseEventKind,
|
||||||
|
MousePress, Operator, PaintContext, WindowCallbacks,
|
||||||
|
};
|
||||||
use cocoa::appkit::{
|
use cocoa::appkit::{
|
||||||
NSApplicationActivateIgnoringOtherApps, NSBackingStoreBuffered, NSRunningApplication, NSView,
|
NSApplicationActivateIgnoringOtherApps, NSBackingStoreBuffered, NSEvent, NSEventModifierFlags,
|
||||||
NSViewHeightSizable, NSViewWidthSizable, NSWindow, NSWindowStyleMask,
|
NSRunningApplication, NSView, NSViewHeightSizable, NSViewWidthSizable, NSWindow,
|
||||||
|
NSWindowStyleMask,
|
||||||
};
|
};
|
||||||
use cocoa::base::*;
|
use cocoa::base::*;
|
||||||
use cocoa::foundation::{NSPoint, NSRect, NSSize};
|
use cocoa::foundation::{NSPoint, NSRect, NSSize};
|
||||||
@ -173,6 +177,46 @@ impl<'a> PaintContext for MacGraphicsContext<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn decode_mouse_buttons(mask: u64) -> MouseButtons {
|
||||||
|
let mut buttons = MouseButtons::NONE;
|
||||||
|
|
||||||
|
if (mask & (1 << 0)) != 0 {
|
||||||
|
buttons |= MouseButtons::LEFT;
|
||||||
|
}
|
||||||
|
if (mask & (1 << 1)) != 0 {
|
||||||
|
buttons |= MouseButtons::RIGHT;
|
||||||
|
}
|
||||||
|
if (mask & (1 << 2)) != 0 {
|
||||||
|
buttons |= MouseButtons::MIDDLE;
|
||||||
|
}
|
||||||
|
if (mask & (1 << 3)) != 0 {
|
||||||
|
buttons |= MouseButtons::X1;
|
||||||
|
}
|
||||||
|
if (mask & (1 << 4)) != 0 {
|
||||||
|
buttons |= MouseButtons::X2;
|
||||||
|
}
|
||||||
|
buttons
|
||||||
|
}
|
||||||
|
|
||||||
|
fn key_modifiers(flags: NSEventModifierFlags) -> Modifiers {
|
||||||
|
let mut mods = Modifiers::NONE;
|
||||||
|
|
||||||
|
if flags.contains(NSEventModifierFlags::NSShiftKeyMask) {
|
||||||
|
mods |= Modifiers::SHIFT;
|
||||||
|
}
|
||||||
|
if flags.contains(NSEventModifierFlags::NSAlternateKeyMask) {
|
||||||
|
mods |= Modifiers::ALT;
|
||||||
|
}
|
||||||
|
if flags.contains(NSEventModifierFlags::NSControlKeyMask) {
|
||||||
|
mods |= Modifiers::CTRL;
|
||||||
|
}
|
||||||
|
if flags.contains(NSEventModifierFlags::NSCommandKeyMask) {
|
||||||
|
mods |= Modifiers::SUPER;
|
||||||
|
}
|
||||||
|
|
||||||
|
mods
|
||||||
|
}
|
||||||
|
|
||||||
impl WindowView {
|
impl WindowView {
|
||||||
fn view_id(&self) -> id {
|
fn view_id(&self) -> id {
|
||||||
let inner = self.inner.borrow_mut();
|
let inner = self.inner.borrow_mut();
|
||||||
@ -213,6 +257,10 @@ impl WindowView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" fn accepts_first_responder(_this: &mut Object, _sel: Sel) -> BOOL {
|
||||||
|
YES
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" fn window_should_close(this: &mut Object, _sel: Sel, _id: id) -> BOOL {
|
extern "C" fn window_should_close(this: &mut Object, _sel: Sel, _id: id) -> BOOL {
|
||||||
eprintln!("window_should_close");
|
eprintln!("window_should_close");
|
||||||
|
|
||||||
@ -247,6 +295,49 @@ impl WindowView {
|
|||||||
Self::drop_inner(this);
|
Self::drop_inner(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn mouse_common(this: &mut Object, nsevent: id, kind: MouseEventKind) {
|
||||||
|
let view = this as id;
|
||||||
|
let coords;
|
||||||
|
let mouse_buttons;
|
||||||
|
let modifiers;
|
||||||
|
unsafe {
|
||||||
|
coords = NSView::convertPoint_fromView_(view, nsevent.locationInWindow(), nil);
|
||||||
|
mouse_buttons = decode_mouse_buttons(NSEvent::pressedMouseButtons(nsevent));
|
||||||
|
modifiers = key_modifiers(nsevent.modifierFlags());
|
||||||
|
}
|
||||||
|
let event = MouseEvent {
|
||||||
|
kind,
|
||||||
|
x: coords.x.max(0.0) as u16,
|
||||||
|
y: coords.y.max(0.0) as u16,
|
||||||
|
mouse_buttons,
|
||||||
|
modifiers,
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(myself) = Self::get_this(this) {
|
||||||
|
eprintln!("{:?}", event);
|
||||||
|
// myself.inner.borrow_mut().callbacks.mouse_event(&event, &window);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" fn mouse_up(this: &mut Object, _sel: Sel, nsevent: id) {
|
||||||
|
Self::mouse_common(this, nsevent, MouseEventKind::Release(MousePress::Left));
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" fn mouse_down(this: &mut Object, _sel: Sel, nsevent: id) {
|
||||||
|
Self::mouse_common(this, nsevent, MouseEventKind::Press(MousePress::Left));
|
||||||
|
}
|
||||||
|
extern "C" fn right_mouse_up(this: &mut Object, _sel: Sel, nsevent: id) {
|
||||||
|
Self::mouse_common(this, nsevent, MouseEventKind::Release(MousePress::Right));
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" fn right_mouse_down(this: &mut Object, _sel: Sel, nsevent: id) {
|
||||||
|
Self::mouse_common(this, nsevent, MouseEventKind::Press(MousePress::Right));
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" fn mouse_moved_or_dragged(this: &mut Object, _sel: Sel, nsevent: id) {
|
||||||
|
Self::mouse_common(this, nsevent, MouseEventKind::Move);
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" fn did_resize(this: &mut Object, _sel: Sel, notification: id) {
|
extern "C" fn did_resize(this: &mut Object, _sel: Sel, notification: id) {
|
||||||
let frame = unsafe { NSView::frame(this as *mut _) };
|
let frame = unsafe { NSView::frame(this as *mut _) };
|
||||||
let width = frame.size.width;
|
let width = frame.size.width;
|
||||||
@ -357,6 +448,40 @@ impl WindowView {
|
|||||||
sel!(windowDidResize:),
|
sel!(windowDidResize:),
|
||||||
Self::did_resize as extern "C" fn(&mut Object, Sel, id),
|
Self::did_resize as extern "C" fn(&mut Object, Sel, id),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
cls.add_method(
|
||||||
|
sel!(mouseMoved:),
|
||||||
|
Self::mouse_moved_or_dragged as extern "C" fn(&mut Object, Sel, id),
|
||||||
|
);
|
||||||
|
cls.add_method(
|
||||||
|
sel!(mouseDragged:),
|
||||||
|
Self::mouse_moved_or_dragged as extern "C" fn(&mut Object, Sel, id),
|
||||||
|
);
|
||||||
|
cls.add_method(
|
||||||
|
sel!(rightMouseDragged:),
|
||||||
|
Self::mouse_moved_or_dragged as extern "C" fn(&mut Object, Sel, id),
|
||||||
|
);
|
||||||
|
cls.add_method(
|
||||||
|
sel!(mouseDown:),
|
||||||
|
Self::mouse_down as extern "C" fn(&mut Object, Sel, id),
|
||||||
|
);
|
||||||
|
cls.add_method(
|
||||||
|
sel!(mouseUp:),
|
||||||
|
Self::mouse_up as extern "C" fn(&mut Object, Sel, id),
|
||||||
|
);
|
||||||
|
cls.add_method(
|
||||||
|
sel!(rightMouseDown:),
|
||||||
|
Self::right_mouse_down as extern "C" fn(&mut Object, Sel, id),
|
||||||
|
);
|
||||||
|
cls.add_method(
|
||||||
|
sel!(rightMouseUp:),
|
||||||
|
Self::right_mouse_up as extern "C" fn(&mut Object, Sel, id),
|
||||||
|
);
|
||||||
|
|
||||||
|
cls.add_method(
|
||||||
|
sel!(acceptsFirstResponder),
|
||||||
|
Self::accepts_first_responder as extern "C" fn(&mut Object, Sel) -> BOOL,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
cls.register()
|
cls.register()
|
||||||
|
Loading…
Reference in New Issue
Block a user