[vlc-commits] macosx: rework communication between vout provider, library window and fspanel

Felix Paul Kühne git at videolan.org
Mon Apr 15 19:48:58 CEST 2019


vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Mon Apr 15 19:45:57 2019 +0200| [a3f831632a920220d0625c13467d6dcf81538877] | committer: Felix Paul Kühne

macosx: rework communication between vout provider, library window and fspanel

This prevents frequent calls across multiple hierarchy levels and internalizes state knowledge.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a3f831632a920220d0625c13467d6dcf81538877
---

 modules/gui/macosx/library/VLCLibraryWindow.h      |  9 ++----
 modules/gui/macosx/library/VLCLibraryWindow.m      | 33 ++++++++++++++--------
 modules/gui/macosx/main/VLCMain.h                  |  2 --
 modules/gui/macosx/main/VLCMain.m                  | 20 +++++--------
 .../windows/mainwindow/VLCMainWindowControlsBar.m  |  1 -
 .../macosx/windows/video/VLCFSPanelController.h    |  8 ++++--
 .../macosx/windows/video/VLCFSPanelController.m    | 16 +++++++----
 .../macosx/windows/video/VLCVideoOutputProvider.m  |  9 +-----
 .../macosx/windows/video/VLCVideoWindowCommon.h    |  3 ++
 .../macosx/windows/video/VLCVideoWindowCommon.m    | 31 ++++++++++++--------
 modules/gui/macosx/windows/video/VLCVoutView.m     |  6 ++--
 11 files changed, 73 insertions(+), 65 deletions(-)

diff --git a/modules/gui/macosx/library/VLCLibraryWindow.h b/modules/gui/macosx/library/VLCLibraryWindow.h
index 6667a6fa06..52e30edbb3 100644
--- a/modules/gui/macosx/library/VLCLibraryWindow.h
+++ b/modules/gui/macosx/library/VLCLibraryWindow.h
@@ -24,8 +24,6 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
- at class VLCFSPanelController;
-
 @interface VLCLibraryWindowController : NSWindowController
 
 - (instancetype)initWithLibraryWindow;
@@ -40,12 +38,9 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property (readonly) BOOL nativeFullscreenMode;
 @property (readwrite) BOOL nonembedded;
- at property (readonly) VLCFSPanelController* fspanel;
 
-- (void)showFullscreenController;
-- (void)changePlaylistState:(int)event;
-- (void)videoplayWillBeStarted;
-- (void)setVideoplayEnabled;
+- (void)videoPlaybackWillBeStarted;
+- (void)toggleVideoPlaybackAppearance;
 
 - (IBAction)playlistDoubleClickAction:(id)sender;
 
diff --git a/modules/gui/macosx/library/VLCLibraryWindow.m b/modules/gui/macosx/library/VLCLibraryWindow.m
index 9ad5953fec..3fadea55a3 100644
--- a/modules/gui/macosx/library/VLCLibraryWindow.m
+++ b/modules/gui/macosx/library/VLCLibraryWindow.m
@@ -45,6 +45,8 @@ static NSString *VLCLibraryCellIdentifier = @"VLCLibraryCellIdentifier";
     VLCLibraryDataSource *_libraryDataSource;
 
     NSRect _windowFrameBeforePlayback;
+
+    VLCFSPanelController *_fspanel;
 }
 @end
 
@@ -52,6 +54,12 @@ static NSString *VLCLibraryCellIdentifier = @"VLCLibraryCellIdentifier";
 
 - (void)awakeFromNib
 {
+    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
+    [notificationCenter addObserver:self
+                           selector:@selector(shouldShowFullscreenController:)
+                               name:VLCVideoWindowShouldShowFullscreenController
+                             object:nil];
+
     _fspanel = [[VLCFSPanelController alloc] init];
     [_fspanel showWindow:self];
 
@@ -81,6 +89,11 @@ static NSString *VLCLibraryCellIdentifier = @"VLCLibraryCellIdentifier";
     [_libraryCollectionView reloadData];
 }
 
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
 - (void)segmentedControlAction
 {
 }
@@ -94,17 +107,13 @@ static NSString *VLCLibraryCellIdentifier = @"VLCLibraryCellIdentifier";
     [[[VLCMain sharedInstance] playlistController] playItemAtIndex:selectedRow];
 }
 
-- (void)changePlaylistState:(int)event
-{
-}
-
-- (void)videoplayWillBeStarted
+- (void)videoPlaybackWillBeStarted
 {
     if (!self.fullscreen)
         _windowFrameBeforePlayback = [self frame];
 }
 
-- (void)setVideoplayEnabled
+- (void)toggleVideoPlaybackAppearance
 {
     BOOL b_videoPlayback = [[VLCMain sharedInstance] activeVideoPlayback];
 
@@ -137,10 +146,10 @@ static NSString *VLCLibraryCellIdentifier = @"VLCLibraryCellIdentifier";
     if (self.nativeFullscreenMode) {
         if ([self hasActiveVideo] && [self fullscreen] && b_videoPlayback) {
             [self hideControlsBar];
-            [self.fspanel setActive];
+            [_fspanel shouldBecomeActive:nil];
         } else {
             [self showControlsBar];
-            [self.fspanel setNonActive];
+            [_fspanel shouldBecomeInactive:nil];
         }
     }
 }
@@ -148,14 +157,14 @@ static NSString *VLCLibraryCellIdentifier = @"VLCLibraryCellIdentifier";
 #pragma mark -
 #pragma mark Fullscreen support
 
-- (void)showFullscreenController
+- (void)shouldShowFullscreenController:(NSNotification *)aNotification
 {
     id currentWindow = [NSApp keyWindow];
     if ([currentWindow respondsToSelector:@selector(hasActiveVideo)] && [currentWindow hasActiveVideo]) {
         if ([currentWindow respondsToSelector:@selector(fullscreen)] && [currentWindow fullscreen] && ![[currentWindow videoView] isHidden]) {
-
-            if ([[VLCMain sharedInstance] activeVideoPlayback])
-                [self.fspanel fadeIn];
+            if ([[VLCMain sharedInstance] activeVideoPlayback]) {
+                [_fspanel fadeIn];
+            }
         }
     }
 
diff --git a/modules/gui/macosx/main/VLCMain.h b/modules/gui/macosx/main/VLCMain.h
index 5f96f94444..5a51b6ffb1 100644
--- a/modules/gui/macosx/main/VLCMain.h
+++ b/modules/gui/macosx/main/VLCMain.h
@@ -114,8 +114,6 @@ static NSString * VLCAppleRemoteSettingChangedNotification = @"VLCAppleRemoteSet
 - (BOOL)activeVideoPlayback;
 - (void)applicationWillTerminate:(NSNotification *)notification;
 
-- (void)showFullscreenController;
-
 - (BOOL)isTerminating;
 
 @end
diff --git a/modules/gui/macosx/main/VLCMain.m b/modules/gui/macosx/main/VLCMain.m
index 1c65db0f30..5191baf799 100644
--- a/modules/gui/macosx/main/VLCMain.m
+++ b/modules/gui/macosx/main/VLCMain.m
@@ -143,14 +143,15 @@ static int ShowController(vlc_object_t *p_this, const char *psz_variable,
     @autoreleasepool {
         dispatch_async(dispatch_get_main_queue(), ^{
 
-            intf_thread_t * p_intf = getIntf();
+            intf_thread_t *p_intf = getIntf();
             if (p_intf) {
                 VLCMain *mainInstance = [VLCMain sharedInstance];
-                if ([[[mainInstance playlistController] playerController] fullscreen])
-                    [mainInstance showFullscreenController];
-
-                else if (!strcmp(psz_variable, "intf-show"))
+                if ([[[mainInstance playlistController] playerController] fullscreen]) {
+                    [[NSNotificationCenter defaultCenter] postNotificationName:VLCVideoWindowShouldShowFullscreenController
+                                                                        object:mainInstance];
+                } else if (!strcmp(psz_variable, "intf-show")) {
                     [[mainInstance libraryWindow] makeKeyAndOrderFront:nil];
+                }
             }
 
         });
@@ -444,20 +445,13 @@ static VLCMain *sharedInstance = nil;
     return YES;
 }
 
-- (void)showFullscreenController
-{
-    // defer selector here (possibly another time) to ensure that keyWindow is set properly
-    // (needed for NSApplicationDidBecomeActiveNotification)
-    [[self libraryWindow] performSelectorOnMainThread:@selector(showFullscreenController) withObject:nil waitUntilDone:NO];
-}
-
 - (void)setActiveVideoPlayback:(BOOL)b_value
 {
     assert([NSThread isMainThread]);
 
     b_active_videoplayback = b_value;
     if ([self libraryWindow]) {
-        [[self libraryWindow] setVideoplayEnabled];
+        [[self libraryWindow] toggleVideoPlaybackAppearance];
     }
 }
 
diff --git a/modules/gui/macosx/windows/mainwindow/VLCMainWindowControlsBar.m b/modules/gui/macosx/windows/mainwindow/VLCMainWindowControlsBar.m
index 22e39b5aa3..f2b508e12e 100644
--- a/modules/gui/macosx/windows/mainwindow/VLCMainWindowControlsBar.m
+++ b/modules/gui/macosx/windows/mainwindow/VLCMainWindowControlsBar.m
@@ -385,7 +385,6 @@
 - (IBAction)togglePlaylist:(id)sender
 {
     // FIXME: this is a NO-OP
-    [[[VLCMain sharedInstance] libraryWindow] changePlaylistState: 0];
 }
 
 - (IBAction)volumeAction:(id)sender
diff --git a/modules/gui/macosx/windows/video/VLCFSPanelController.h b/modules/gui/macosx/windows/video/VLCFSPanelController.h
index b705f2ef2f..88e65ff9c0 100644
--- a/modules/gui/macosx/windows/video/VLCFSPanelController.h
+++ b/modules/gui/macosx/windows/video/VLCFSPanelController.h
@@ -30,6 +30,9 @@
 #import "views/VLCTimeField.h"
 #import "views/VLCSlider.h"
 
+extern NSString *VLCFSPanelShouldBecomeActive;
+extern NSString *VLCFSPanelShouldBecomeInactive;
+
 @interface VLCFSPanelController : NSWindowController
 
 @property (readwrite, weak) NSTimer   *hideTimer;
@@ -58,11 +61,10 @@
 - (IBAction)timeSliderUpdate:(id)sender;
 - (IBAction)volumeSliderUpdate:(id)sender;
 
+- (void)shouldBecomeInactive:(NSNotification *)aNotification;
+- (void)shouldBecomeActive:(NSNotification *)aNotification;
 - (void)fadeIn;
 - (void)fadeOut;
-- (void)setActive;
-- (void)setNonActive;
-- (void)setVoutWasUpdated:(VLCWindow *)voutWindow;
 
 // Constrain frame to window. Used by VLCFSPanelDraggableView.
 - (NSRect)contrainFrameToAssociatedVoutWindow:(NSRect)frame;
diff --git a/modules/gui/macosx/windows/video/VLCFSPanelController.m b/modules/gui/macosx/windows/video/VLCFSPanelController.m
index 0581f1b479..e34f82c56a 100644
--- a/modules/gui/macosx/windows/video/VLCFSPanelController.m
+++ b/modules/gui/macosx/windows/video/VLCFSPanelController.m
@@ -30,6 +30,10 @@
 #import "main/VLCMain.h"
 #import "playlist/VLCPlaylistController.h"
 #import "playlist/VLCPlayerController.h"
+#import "windows/video/VLCVideoWindowCommon.h"
+
+NSString *VLCFSPanelShouldBecomeActive = @"VLCFSPanelShouldBecomeActive";
+NSString *VLCFSPanelShouldBecomeInactive = @"VLCFSPanelShouldBecomeInactive";
 
 @interface VLCFSPanelController () {
     BOOL _isCounting;
@@ -56,7 +60,6 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect
     [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
 }
 
-
 #pragma mark -
 #pragma mark Initialization
 
@@ -107,6 +110,9 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect
     [notificationCenter addObserver:self selector:@selector(hasNextChanged:) name:VLCPlaybackHasNextChanged object:nil];
     [notificationCenter addObserver:self selector:@selector(volumeChanged:) name:VLCPlayerVolumeChanged object:nil];
     [notificationCenter addObserver:self selector:@selector(inputItemChanged:) name:VLCPlayerCurrentMediaItemChanged object:nil];
+    [notificationCenter addObserver:self selector:@selector(shouldBecomeActive:) name:VLCFSPanelShouldBecomeActive object:nil];
+    [notificationCenter addObserver:self selector:@selector(shouldBecomeInactive:) name:VLCFSPanelShouldBecomeInactive object:nil];
+    [notificationCenter addObserver:self selector:@selector(voutWasUpdated:) name:VLCVideoWindowDidEnterFullscreen object:nil];
 }
 
 #define setupButton(target, title, desc)            \
@@ -440,12 +446,12 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect
     return frame;
 }
 
-- (void)setNonActive
+- (void)shouldBecomeInactive:(NSNotification *)aNotification
 {
     [self.window orderOut:self];
 }
 
-- (void)setActive
+- (void)shouldBecomeActive:(NSNotification *)aNotification
 {
     [self.window orderFront:self];
     [self fadeIn];
@@ -459,8 +465,9 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect
     [NSCursor setHiddenUntilMouseMoves:YES];
 }
 
-- (void)setVoutWasUpdated:(VLCWindow *)voutWindow
+- (void)voutWasUpdated:(NSNotification *)aNotification
 {
+    VLCWindow *voutWindow = aNotification.object;
     _associatedVoutWindow = voutWindow;
 
     NSRect voutRect = voutWindow.frame;
@@ -470,7 +477,6 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect
 
         [self centerPanel];
     }
-
 }
 
 #pragma mark -
diff --git a/modules/gui/macosx/windows/video/VLCVideoOutputProvider.m b/modules/gui/macosx/windows/video/VLCVideoOutputProvider.m
index a31489b7c4..64df32e579 100644
--- a/modules/gui/macosx/windows/video/VLCVideoOutputProvider.m
+++ b/modules/gui/macosx/windows/video/VLCVideoOutputProvider.m
@@ -227,7 +227,7 @@ int WindowOpen(vout_window_t *p_wnd)
 
     // should be called before any window resizing occurs
     if (!multipleVoutWindows)
-        [[mainInstance libraryWindow] videoplayWillBeStarted];
+        [[mainInstance libraryWindow] videoPlaybackWillBeStarted];
 
     if (multipleVoutWindows && videoWallpaper)
         videoWallpaper = false;
@@ -353,10 +353,6 @@ int WindowOpen(vout_window_t *p_wnd)
     [mainInstance setActiveVideoPlayback: YES];
     [[mainInstance libraryWindow] setNonembedded:!b_mainWindowHasVideo];
 
-    // beware of order, setActiveVideoPlayback:, setHasActiveVideo: and setNonembedded: must be called before
-    if ([newVideoWindow class] == [VLCLibraryWindow class])
-        [[mainInstance libraryWindow] changePlaylistState: 0]; // FIXME: this is a NO-OP
-
     // TODO: find a cleaner way for "start in fullscreen"
     // Start in fs, because either prefs settings, or fullscreen button was pressed before
 
@@ -425,9 +421,6 @@ int WindowOpen(vout_window_t *p_wnd)
         // video in main window might get stopped while another vout is open
         if ([_voutWindows count] > 0)
             [[mainInstance libraryWindow] setNonembedded:YES];
-
-        // beware of order, setActiveVideoPlayback:, setHasActiveVideo: and setNonembedded: must be called before
-        [[mainInstance libraryWindow] changePlaylistState: 0]; // FIXME: this is a NO-OP
     }
 }
 
diff --git a/modules/gui/macosx/windows/video/VLCVideoWindowCommon.h b/modules/gui/macosx/windows/video/VLCVideoWindowCommon.h
index 08259c39a1..b66bc41e25 100644
--- a/modules/gui/macosx/windows/video/VLCVideoWindowCommon.h
+++ b/modules/gui/macosx/windows/video/VLCVideoWindowCommon.h
@@ -25,6 +25,9 @@
 
 #import "windows/video/VLCWindow.h"
 
+extern NSString *VLCVideoWindowShouldShowFullscreenController;
+extern NSString *VLCVideoWindowDidEnterFullscreen;
+
 @class VLCVoutView;
 
 @class VLCControlsBarCommon;
diff --git a/modules/gui/macosx/windows/video/VLCVideoWindowCommon.m b/modules/gui/macosx/windows/video/VLCVideoWindowCommon.m
index 7cd7a83c69..e886960a4b 100644
--- a/modules/gui/macosx/windows/video/VLCVideoWindowCommon.m
+++ b/modules/gui/macosx/windows/video/VLCVideoWindowCommon.m
@@ -33,6 +33,9 @@
 #import "playlist/VLCPlayerController.h"
 #import "library/VLCLibraryWindow.h"
 
+NSString *VLCVideoWindowShouldShowFullscreenController = @"VLCVideoWindowShouldShowFullscreenController";
+NSString *VLCVideoWindowDidEnterFullscreen = @"VLCVideoWindowDidEnterFullscreen";
+
 /*****************************************************************************
  * VLCVideoWindowCommon
  *
@@ -436,17 +439,18 @@
     [super becomeKeyWindow];
 
     // change fspanel state for the case when multiple windows are in fullscreen
-    if ([self hasActiveVideo] && [self fullscreen])
-        [[[[VLCMain sharedInstance] libraryWindow] fspanel] setActive];
-    else
-        [[[[VLCMain sharedInstance] libraryWindow] fspanel] setNonActive];
+    if ([self hasActiveVideo] && [self fullscreen]) {
+        [[NSNotificationCenter defaultCenter] postNotificationName:VLCFSPanelShouldBecomeActive object:self];
+    } else {
+        [[NSNotificationCenter defaultCenter] postNotificationName:VLCFSPanelShouldBecomeInactive object:self];
+    }
 }
 
 - (void)resignKeyWindow
 {
     [super resignKeyWindow];
 
-    [[[[VLCMain sharedInstance] libraryWindow] fspanel] setNonActive];
+    [[NSNotificationCenter defaultCenter] postNotificationName:VLCFSPanelShouldBecomeInactive object:self];
 }
 
 -(NSArray*)customWindowsToEnterFullScreenForWindow:(NSWindow *)window
@@ -533,9 +537,11 @@
     _inFullscreenTransition = NO;
 
     if ([self hasActiveVideo]) {
-        [[[[VLCMain sharedInstance] libraryWindow] fspanel] setVoutWasUpdated:self];
-        if (![_videoView isHidden])
-            [[[[VLCMain sharedInstance] libraryWindow] fspanel] setActive];
+        NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
+        [notificationCenter postNotificationName:VLCVideoWindowDidEnterFullscreen object:self];
+        if (![_videoView isHidden]) {
+            [notificationCenter postNotificationName:VLCFSPanelShouldBecomeActive object:self];
+        }
     }
 
     NSArray *subviews = [[self videoView] subviews];
@@ -564,7 +570,7 @@
     }
 
     [NSCursor setHiddenUntilMouseMoves: NO];
-    [[[[VLCMain sharedInstance] libraryWindow] fspanel] setNonActive];
+    [[NSNotificationCenter defaultCenter] postNotificationName:VLCFSPanelShouldBecomeInactive object:self];
 
     if (![_videoView isHidden]) {
         [self showControlsBar];
@@ -742,8 +748,9 @@
     [o_fullscreen_window setAcceptsMouseMovedEvents: YES];
 
     /* tell the fspanel to move itself to front next time it's triggered */
-    [[[[VLCMain sharedInstance] libraryWindow] fspanel] setVoutWasUpdated:o_fullscreen_window];
-    [[[[VLCMain sharedInstance] libraryWindow] fspanel] setActive];
+    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
+    [notificationCenter postNotificationName:VLCVideoWindowDidEnterFullscreen object:self];
+    [notificationCenter postNotificationName:VLCFSPanelShouldBecomeActive object:self];
 
     if ([self isVisible])
         [self orderOut: self];
@@ -768,7 +775,7 @@
         return;
     }
 
-    [[[[VLCMain sharedInstance] libraryWindow] fspanel] setNonActive];
+    [[NSNotificationCenter defaultCenter] postNotificationName:VLCFSPanelShouldBecomeInactive object:self];
     [[o_fullscreen_window screen] setNonFullscreenPresentationOptions];
 
     if (o_fullscreen_anim1) {
diff --git a/modules/gui/macosx/windows/video/VLCVoutView.m b/modules/gui/macosx/windows/video/VLCVoutView.m
index ed7bfc1cee..4005e1fd3c 100644
--- a/modules/gui/macosx/windows/video/VLCVoutView.m
+++ b/modules/gui/macosx/windows/video/VLCVoutView.m
@@ -196,8 +196,10 @@
 - (void)mouseMoved:(NSEvent *)o_event
 {
     NSPoint ml = [self convertPoint: [o_event locationInWindow] fromView: nil];
-    if ([self mouse: ml inRect: [self bounds]])
-        [[VLCMain sharedInstance] showFullscreenController];
+    if ([self mouse: ml inRect: [self bounds]]) {
+        [[NSNotificationCenter defaultCenter] postNotificationName:VLCVideoWindowShouldShowFullscreenController
+                                                            object:self];
+    }
 
     [super mouseMoved: o_event];
 }



More information about the vlc-commits mailing list