summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefano Pigozzi <stefano.pigozzi@gmail.com>2013-06-22 10:42:50 +0200
committerStefano Pigozzi <stefano.pigozzi@gmail.com>2013-07-20 11:44:06 +0200
commit891e09266970a65ce0d47b923c1ad4139712e6ea (patch)
tree4c381f2647d40d148f0f209f605f8a704157712a
parentd0b129971a934bf499c478ea52fcd6051713ae19 (diff)
downloadmpv-891e09266970a65ce0d47b923c1ad4139712e6ea.tar.bz2
mpv-891e09266970a65ce0d47b923c1ad4139712e6ea.tar.xz
cocoa_common: implement conditional video dragging
This was more roundabout than expected, since it looks like the framework caches isMovabileByWindowBackground so in mpv's case it's needed to set it with setMovableByWindowBackground.
-rw-r--r--video/out/cocoa_common.m44
1 files changed, 30 insertions, 14 deletions
diff --git a/video/out/cocoa_common.m b/video/out/cocoa_common.m
index bfa5c768b2..5fc70d0c66 100644
--- a/video/out/cocoa_common.m
+++ b/video/out/cocoa_common.m
@@ -31,6 +31,7 @@
#include "vo.h"
#include "aspect.h"
+#include "core/input/input.h"
#include "talloc.h"
#include "core/mp_msg.h"
@@ -52,6 +53,7 @@
@interface GLMPlayerOpenGLView : NSView
@property(nonatomic, assign) struct vo *videoOutput;
+- (void)recalcDraggableState;
- (BOOL)containsCurrentMouseLocation;
- (void)mouseEvent:(NSEvent *)theEvent;
@property(nonatomic, assign, getter=hasMouseDown) BOOL mouseDown;
@@ -399,6 +401,7 @@ static void update_window(struct vo *vo)
}
}
+ [s->view recalcDraggableState];
cocoa_set_window_title(vo, vo_get_window_title(vo));
vo_cocoa_fullscreen(vo);
@@ -691,6 +694,8 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
vo_cocoa_set_cursor_visibility(self.videoOutput, true);
}
+ [s->view recalcDraggableState];
+
// Change window size if the core attempted to change it while we were in
// fullscreen. For example config() might have been called as a result of
// a new file changing the window size.
@@ -714,15 +719,6 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
return NO;
}
-- (BOOL)isMovableByWindowBackground
-{
- if (self.videoOutput) {
- return !self.videoOutput->opts->fullscreen;
- } else {
- return YES;
- }
-}
-
- (void)normalSize { [self mulSize:1.0f]; }
- (void)halfSize { [self mulSize:0.5f];}
@@ -811,13 +807,19 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
- (BOOL)becomeFirstResponder { return YES; }
- (BOOL)resignFirstResponder { return YES; }
-- (NSPoint) mouseLocation
+- (NSPoint)mouseLocation
{
- NSPoint mLoc = [NSEvent mouseLocation];
- NSPoint wLoc = [self.window convertScreenToBase:mLoc];
+ NSPoint wLoc = [self.window mouseLocationOutsideOfEventStream];
return [self convertPoint:wLoc fromView:nil];
}
+- (NSPoint)mouseLocationUpperLeft
+{
+ NSPoint loc = [self mouseLocation];
+ loc.y = - loc.y + [self bounds].size.height;
+ return loc;
+}
+
- (BOOL)containsCurrentMouseLocation
{
NSRect vF = [[self.window screen] visibleFrame];
@@ -829,12 +831,26 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
return CGRectContainsPoint(clippedBounds, [self mouseLocation]);
}
+- (void)recalcDraggableState
+{
+ struct vo *vo = self.videoOutput;
+ BOOL movable = NO;
+
+ if (!vo->opts->fullscreen) {
+ NSPoint loc = [self mouseLocationUpperLeft];
+ movable = !mp_input_test_dragging(vo->input_ctx, loc.x, loc.y);
+ }
+
+ [self.window setMovableByWindowBackground:movable];
+}
+
+
- (void)signalMouseMovement:(NSEvent *)event
{
if ([self containsCurrentMouseLocation]) {
- NSPoint loc = [self mouseLocation];
- loc.y = - loc.y + [self bounds].size.height;
+ NSPoint loc = [self mouseLocationUpperLeft];
vo_mouse_movement(self.videoOutput, loc.x, loc.y);
+ [self recalcDraggableState];
}
}