Browse Source

add middle and right mouse button handling.

pull/1977/head
Dan Walmsley 8 years ago
parent
commit
2f04ceab98
  1. 73
      src/Avalonia.Native.OSX/window.mm
  2. 13
      src/Avalonia.Native/WindowImplBase.cs

73
src/Avalonia.Native.OSX/window.mm

@ -82,6 +82,8 @@ protected:
{ {
ComPtr<WindowBaseImpl> _parent; ComPtr<WindowBaseImpl> _parent;
NSTrackingArea* _area; NSTrackingArea* _area;
bool _isLeftPressed, _isMiddlePressed, _isRightPressed, _isMouseOver;
NSEvent* _lastMouseDownEvent;
} }
-(AvnView*) initWithParent: (WindowBaseImpl*) parent -(AvnView*) initWithParent: (WindowBaseImpl*) parent
@ -161,7 +163,7 @@ protected:
return result; return result;
} }
- (void)mouseMoved:(NSEvent *)event - (void)mouseEvent:(NSEvent *)event withType:(AvnRawMouseEventType) type
{ {
auto localPoint = [self convertPoint:[event locationInWindow] toView:self]; auto localPoint = [self convertPoint:[event locationInWindow] toView:self];
auto avnPoint = [self toAvnPoint:localPoint]; auto avnPoint = [self toAvnPoint:localPoint];
@ -172,10 +174,69 @@ protected:
auto modifiers = [self getModifiers:[event modifierFlags]]; auto modifiers = [self getModifiers:[event modifierFlags]];
[self becomeFirstResponder]; [self becomeFirstResponder];
_parent->BaseEvents->RawMouseEvent(Move, timestamp, modifiers, point, delta); _parent->BaseEvents->RawMouseEvent(type, timestamp, modifiers, point, delta);
[super mouseMoved:event]; [super mouseMoved:event];
} }
- (void)mouseMoved:(NSEvent *)event
{
[self mouseEvent:event withType:Move];
}
- (void)mouseDown:(NSEvent *)event
{
_isLeftPressed = true;
_lastMouseDownEvent = event;
[self mouseEvent:event withType:LeftButtonDown];
_lastMouseDownEvent = nullptr;
[super mouseDown:event];
}
- (void)otherMouseDown:(NSEvent *)event
{
_isMiddlePressed = true;
_lastMouseDownEvent = event;
[self mouseEvent:event withType:MiddleButtonDown];
_lastMouseDownEvent = nullptr;
[super otherMouseDown:event];
}
- (void)rightMouseDown:(NSEvent *)event
{
_isRightPressed = true;
_lastMouseDownEvent = event;
[self mouseEvent:event withType:RightButtonDown];
_lastMouseDownEvent = nullptr;
[super rightMouseDown:event];
}
- (void)mouseUp:(NSEvent *)event
{
_isLeftPressed = false;
[self mouseEvent:event withType:LeftButtonUp];
[super mouseUp:event];
}
- (void)otherMouseUp:(NSEvent *)event
{
_isMiddlePressed = false;
[self mouseEvent:event withType:MiddleButtonUp];
[super otherMouseUp:event];
}
- (void)rightMouseUp:(NSEvent *)event
{
_isRightPressed = false;
[self mouseEvent:event withType:RightButtonUp];
[super rightMouseUp:event];
}
- (AvnInputModifiers)getModifiers:(NSEventModifierFlags)mod - (AvnInputModifiers)getModifiers:(NSEventModifierFlags)mod
{ {
unsigned int rv = 0; unsigned int rv = 0;
@ -189,12 +250,12 @@ protected:
if (mod & NSEventModifierFlagCommand) if (mod & NSEventModifierFlagCommand)
rv |= Windows; rv |= Windows;
/*if (_isLeftPressed) if (_isLeftPressed)
rv |= InputModifiers.LeftMouseButton; rv |= LeftMouseButton;
if (_isMiddlePressed) if (_isMiddlePressed)
rv |= InputModifiers.MiddleMouseButton; rv |= MiddleMouseButton;
if (_isRightPressed) if (_isRightPressed)
rv |= InputModifiers.RightMouseButton;*/ rv |= RightMouseButton;
return (AvnInputModifiers)rv; return (AvnInputModifiers)rv;
} }

13
src/Avalonia.Native/WindowImplBase.cs

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.Platform.Surfaces; using Avalonia.Controls.Platform.Surfaces;
@ -7,6 +7,7 @@ using Avalonia.Input.Raw;
using Avalonia.Native.Interop; using Avalonia.Native.Interop;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.Rendering; using Avalonia.Rendering;
using Avalonia.Threading;
namespace Avalonia.Native namespace Avalonia.Native
{ {
@ -76,11 +77,12 @@ namespace Avalonia.Native
void IAvnWindowBaseEvents.Activated() => _parent.Activated?.Invoke(); void IAvnWindowBaseEvents.Activated() => _parent.Activated?.Invoke();
void IAvnWindowBaseEvents.Deactivated() => _parent.Deactivated?.Invoke(); void IAvnWindowBaseEvents.Deactivated() => _parent.Deactivated?.Invoke();
void IAvnWindowBaseEvents.SoftwareDraw(IntPtr ptr, int stride, int pixelWidth, int pixelHeight, AvnSize logicalSize) void IAvnWindowBaseEvents.SoftwareDraw(IntPtr ptr, int stride, int pixelWidth, int pixelHeight, AvnSize logicalSize)
{ {
Dispatcher.UIThread.RunJobs(DispatcherPriority.Render);
_parent._framebuffer = new SavedFramebuffer _parent._framebuffer = new SavedFramebuffer
{ {
Address = ptr, Address = ptr,
@ -112,7 +114,11 @@ namespace Avalonia.Native
{ {
switch(type) switch(type)
{ {
case AvnRawMouseEventType.Move: case AvnRawMouseEventType.LeaveWindow:
case AvnRawMouseEventType.Wheel:
break;
default:
Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1); Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1);
Input?.Invoke(new RawMouseEventArgs(_mouse, timeStamp, _inputRoot, (RawMouseEventType)type, new Point(point.X, point.Y), (InputModifiers)modifiers)); Input?.Invoke(new RawMouseEventArgs(_mouse, timeStamp, _inputRoot, (RawMouseEventType)type, new Point(point.X, point.Y), (InputModifiers)modifiers));
break; break;
@ -126,6 +132,7 @@ namespace Avalonia.Native
public IRenderer CreateRenderer(IRenderRoot root) public IRenderer CreateRenderer(IRenderRoot root)
{ {
//return new DeferredRenderer(root, AvaloniaLocator.Current.GetService<IRenderLoop>());
return new ImmediateRenderer(root); return new ImmediateRenderer(root);
} }

Loading…
Cancel
Save