[vlc-commits] windowed mac plugin: draft for mouse event handling
Felix Paul Kühne
git at videolan.org
Wed Jan 2 13:29:11 CET 2013
npapi-vlc | branch: master | Felix Paul Kühne <fkuehne at videolan.org> | Wed Jan 2 13:29:01 2013 +0100| [3e3894e1c1091034d2b606af190b67321663c8ab] | committer: Felix Paul Kühne
windowed mac plugin: draft for mouse event handling
> http://git.videolan.org/gitweb.cgi/npapi-vlc.git/?a=commit;h=3e3894e1c1091034d2b606af190b67321663c8ab
---
npapi/vlcplugin_mac.mm | 93 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 93 insertions(+)
diff --git a/npapi/vlcplugin_mac.mm b/npapi/vlcplugin_mac.mm
index be6343a..eb5d843 100644
--- a/npapi/vlcplugin_mac.mm
+++ b/npapi/vlcplugin_mac.mm
@@ -45,8 +45,15 @@
CGImageRef _sliderTrackCenter;
CGImageRef _knob;
+
+ BOOL _wasPlayingBeforeMouseDown;
+ BOOL _isScrubbing;
+ CGFloat _mouseDownXDelta;
}
- (BOOL)_isPlaying;
+- (void)handleMouseDown:(CGPoint)point;
+- (void)handleMouseUp:(CGPoint)point;
+- (void)handleMouseDragged:(CGPoint)point;
@end
@@ -155,9 +162,33 @@ bool VlcPluginMac::handle_event(void *event)
if (cocoaEvent->data.mouse.clickCount >= 2)
VlcPluginMac::toggle_fullscreen();
+ CGPoint point = CGPointMake(cocoaEvent->data.mouse.pluginX,
+ // Flip the y coordinate
+ npwindow.height - cocoaEvent->data.mouse.pluginY);
+ [controllerLayer handleMouseDown:[rootLayer convertPoint:point toLayer:controllerLayer]];
+
return true;
}
case NPCocoaEventMouseUp:
+ {
+ CGPoint point = CGPointMake(cocoaEvent->data.mouse.pluginX,
+ // Flip the y coordinate
+ npwindow.height - cocoaEvent->data.mouse.pluginY);
+
+ [controllerLayer handleMouseUp:[rootLayer convertPoint:point toLayer:controllerLayer]];
+
+ return true;
+ }
+ case NPCocoaEventMouseDragged:
+ {
+ CGPoint point = CGPointMake(cocoaEvent->data.mouse.pluginX,
+ // Flip the y coordinate
+ npwindow.height - cocoaEvent->data.mouse.pluginY);
+
+ [controllerLayer handleMouseDragged:[rootLayer convertPoint:point toLayer:controllerLayer]];
+
+ return true;
+ }
case NPCocoaEventKeyUp:
case NPCocoaEventKeyDown:
case NPCocoaEventFocusChanged:
@@ -415,5 +446,67 @@ static CGImageRef createImageNamed(NSString *name)
[self _drawSliderInContext:cgContext];
}
+#pragma mark -
+#pragma mark event handling
+
+- (void)_setNewTimeForThumbCenterX:(CGFloat)centerX
+{
+ CGRect innerRect = [self _innerSliderRect];
+
+ CGFloat fraction = (centerX - CGRectGetMinX(innerRect)) / CGRectGetWidth(innerRect);
+ if (fraction > 1.0)
+ fraction = 1.0;
+ else if (fraction < 0.0)
+ fraction = 0.0;
+
+ printf("duration needed\n");
+
+ [self setNeedsDisplay];
+}
+
+- (void)handleMouseDown:(CGPoint)point
+{
+ if (CGRectContainsPoint([self _sliderRect], point)) {
+ _wasPlayingBeforeMouseDown = [self _isPlaying];
+ _isScrubbing = YES;
+
+ printf("should pause\n");
+
+ if (CGRectContainsPoint([self _sliderThumbRect], point))
+ _mouseDownXDelta = point.x - CGRectGetMidX([self _sliderThumbRect]);
+ else {
+ [self _setNewTimeForThumbCenterX:point.x];
+ _mouseDownXDelta = 0;
+ }
+ }
+}
+
+- (void)handleMouseUp:(CGPoint)point
+{
+ if (_isScrubbing) {
+ _isScrubbing = NO;
+ _mouseDownXDelta = 0;
+
+ if (_wasPlayingBeforeMouseDown)
+ printf("start to play\n");
+ return;
+ }
+
+ if (CGRectContainsPoint([self _playPauseButtonRect], point)) {
+ printf("toggle play/pause\n");
+ return;
+ }
+}
+
+- (void)handleMouseDragged:(CGPoint)point
+{
+ if (!_isScrubbing)
+ return;
+
+ point.x -= _mouseDownXDelta;
+
+ [self _setNewTimeForThumbCenterX:point.x];
+}
+
@end
More information about the vlc-commits
mailing list