cocoa: allow mouse events to bubble up with no-input-cursor

Previously we didn't report events to the core, but still prevented the events
to travel on the responder chain.
This commit is contained in:
Stefano Pigozzi 2014-10-17 19:15:17 +02:00
parent 49b6fa8779
commit eb902efb04
4 changed files with 115 additions and 24 deletions

View File

@ -93,6 +93,7 @@ static void wakeup(void *);
// for testing!
check_error(mpv_set_option_string(mpv, "input-media-keys", "yes"));
check_error(mpv_set_option_string(mpv, "input-cursor", "no"));
check_error(mpv_set_option_string(mpv, "input-vo-keyboard", "yes"));
// request important errors

View File

@ -31,6 +31,8 @@
- (BOOL)hasDock:(NSScreen*)screen;
- (BOOL)hasMenubar:(NSScreen*)screen;
- (int)mpvButtonNumber:(NSEvent*)event;
- (void)mouseDownEvent:(NSEvent *)event;
- (void)mouseUpEvent:(NSEvent *)event;
@end
@implementation MpvEventsView
@ -94,7 +96,11 @@
- (void)updateTrackingAreas
{
if (self.tracker) [self removeTrackingArea:self.tracker];
if (self.tracker)
[self removeTrackingArea:self.tracker];
if (![self.adapter mouseEnabled])
return;
NSTrackingAreaOptions trackingOptions =
NSTrackingEnabledDuringMouseDrag |
@ -127,9 +133,18 @@
return CGRectContainsPoint(clippedBounds, pt);
}
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent { return YES; }
- (BOOL)acceptsFirstResponder { return YES; }
- (BOOL)becomeFirstResponder { return YES; }
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
return [self.adapter mouseEnabled];
}
- (BOOL)acceptsFirstResponder {
return [self.adapter keyboardEnabled] || [self.adapter mouseEnabled];
}
- (BOOL)becomeFirstResponder {
return [self.adapter keyboardEnabled] || [self.adapter mouseEnabled];
}
- (BOOL)resignFirstResponder { return YES; }
- (void)keyDown:(NSEvent *)event {
@ -147,12 +162,16 @@
- (void)mouseEntered:(NSEvent *)event
{
// do nothing!
[super mouseEntered:event];
}
- (void)mouseExited:(NSEvent *)event
{
[self.adapter putKey:MP_KEY_MOUSE_LEAVE withModifiers:0];
if ([self.adapter mouseEnabled]) {
[self.adapter putKey:MP_KEY_MOUSE_LEAVE withModifiers:0];
} else {
[super mouseExited:event];
}
}
- (void)setFrameSize:(NSSize)size
@ -183,14 +202,75 @@
[self.adapter signalMouseMovement:p];
}
- (void)mouseMoved:(NSEvent *)event { [self signalMouseMovement:event]; }
- (void)mouseDragged:(NSEvent *)event { [self signalMouseMovement:event]; }
- (void)mouseDown:(NSEvent *)evt { [self mouseDownEvent:evt]; }
- (void)mouseUp:(NSEvent *)evt { [self mouseUpEvent:evt]; }
- (void)rightMouseDown:(NSEvent *)evt { [self mouseDownEvent:evt]; }
- (void)rightMouseUp:(NSEvent *)evt { [self mouseUpEvent:evt]; }
- (void)otherMouseDown:(NSEvent *)evt { [self mouseDownEvent:evt]; }
- (void)otherMouseUp:(NSEvent *)evt { [self mouseUpEvent:evt]; }
- (void)mouseMoved:(NSEvent *)event
{
if ([self.adapter mouseEnabled]) {
[self signalMouseMovement:event];
} else {
[super mouseMoved:event];
}
}
- (void)mouseDragged:(NSEvent *)event
{
if ([self.adapter mouseEnabled]) {
[self signalMouseMovement:event];
} else {
[super mouseDragged:event];
}
}
- (void)mouseDown:(NSEvent *)event
{
if ([self.adapter mouseEnabled]) {
[self mouseDownEvent:event];
} else {
[super mouseDown:event];
}
}
- (void)mouseUp:(NSEvent *)event
{
if ([self.adapter mouseEnabled]) {
[self mouseUpEvent:event];
} else {
[super mouseUp:event];
}
}
- (void)rightMouseDown:(NSEvent *)event
{
if ([self.adapter mouseEnabled]) {
[self mouseDownEvent:event];
} else {
[super rightMouseUp:event];
}
}
- (void)rightMouseUp:(NSEvent *)event
{
if ([self.adapter mouseEnabled]) {
[self mouseUpEvent:event];
} else {
[super rightMouseUp:event];
}
}
- (void)otherMouseDown:(NSEvent *)event
{
if ([self.adapter mouseEnabled]) {
[self mouseDownEvent:event];
} else {
[super otherMouseDown:event];
}
}
- (void)otherMouseUp:(NSEvent *)event
{
if ([self.adapter mouseEnabled]) {
[self mouseUpEvent:event];
} else {
[super otherMouseUp:event];
}
}
- (void)preciseScroll:(NSEvent *)event
{
@ -210,6 +290,11 @@
- (void)scrollWheel:(NSEvent *)event
{
if (![self.adapter mouseEnabled]) {
[super scrollWheel:event];
return;
}
if ([event hasPreciseScrollingDeltas]) {
[self preciseScroll:event];
} else {

View File

@ -31,6 +31,8 @@
- (void)didChangeWindowedScreenProfile:(NSScreen *)screen;
- (BOOL)isInFullScreenMode;
- (BOOL)keyboardEnabled;
- (BOOL)mouseEnabled;
- (NSScreen *)fsScreen;
@property(nonatomic, assign) struct vo *vout;
@end

View File

@ -693,6 +693,14 @@ void *vo_cocoa_cgl_pixel_format(struct vo *vo)
vo_cocoa_set_current_context(self.vout, false);
}
- (BOOL)keyboardEnabled {
return !!mp_input_vo_keyboard_enabled(self.vout->input_ctx);
}
- (BOOL)mouseEnabled {
return !!mp_input_mouse_enabled(self.vout->input_ctx);
}
- (void)setNeedsResize {
struct vo_cocoa_state *s = self.vout->cocoa;
s->pending_events |= VO_EVENT_RESIZE;
@ -710,28 +718,23 @@ void *vo_cocoa_cgl_pixel_format(struct vo *vo)
}
- (void)signalMouseMovement:(NSPoint)point {
if (mp_input_mouse_enabled(self.vout->input_ctx)) {
mp_input_set_mouse_pos(self.vout->input_ctx, point.x, point.y);
[self recalcMovableByWindowBackground:point];
}
mp_input_set_mouse_pos(self.vout->input_ctx, point.x, point.y);
[self recalcMovableByWindowBackground:point];
}
- (void)putKeyEvent:(NSEvent*)event
{
if (mp_input_vo_keyboard_enabled(self.vout->input_ctx))
cocoa_put_key_event(event);
cocoa_put_key_event(event);
}
- (void)putKey:(int)mpkey withModifiers:(int)modifiers
{
if (mp_input_vo_keyboard_enabled(self.vout->input_ctx))
cocoa_put_key_with_modifiers(mpkey, modifiers);
cocoa_put_key_with_modifiers(mpkey, modifiers);
}
- (void)putAxis:(int)mpkey delta:(float)delta;
{
if (mp_input_mouse_enabled(self.vout->input_ctx))
mp_input_put_axis(self.vout->input_ctx, mpkey, delta);
mp_input_put_axis(self.vout->input_ctx, mpkey, delta);
}
- (void)putCommand:(char*)cmd