vlc/vlc-2.2 | branch: master | David Fuhrmann <[email protected]> | Thu Oct 2 12:59:15 2014 +0200| [0da8979d04da3a19cc1cacacfe01627a9c37806f] | committer: David Fuhrmann
macosx: implement native fullscreen behaviour for yosemite titlebar (cherry picked from commit 0b001a0763aa2e34f6abd921184ce58d56947421) Signed-off-by: David Fuhrmann <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc/vlc-2.2.git/?a=commit;h=0da8979d04da3a19cc1cacacfe01627a9c37806f --- modules/gui/macosx/MainWindowTitle.h | 12 +++- modules/gui/macosx/MainWindowTitle.m | 103 ++++++++++++++++++++++++++-------- modules/gui/macosx/Windows.h | 3 +- modules/gui/macosx/Windows.m | 14 ++++- 4 files changed, 106 insertions(+), 26 deletions(-) diff --git a/modules/gui/macosx/MainWindowTitle.h b/modules/gui/macosx/MainWindowTitle.h index 0350993..f65b391 100644 --- a/modules/gui/macosx/MainWindowTitle.h +++ b/modules/gui/macosx/MainWindowTitle.h @@ -39,6 +39,10 @@ NSImage * o_green_img; NSImage * o_green_over_img; NSImage * o_green_on_img; + // yosemite fullscreen images + NSImage * o_fullscreen_img; + NSImage * o_fullscreen_over_img; + NSImage * o_fullscreen_on_img; NSShadow * o_window_title_shadow; NSDictionary * o_window_title_attributes_dict; @@ -47,15 +51,21 @@ IBOutlet id o_green_btn; IBOutlet id o_fullscreen_btn; IBOutlet id o_title_lbl; + + BOOL b_nativeFullscreenMode; + + // state to determine correct image for green bubble + BOOL b_alt_pressed; + BOOL b_mouse_over; } @property (readonly) NSButton * closeButton; @property (readonly) NSButton * minimizeButton; @property (readonly) NSButton * zoomButton; +- (void)informModifierPressed:(BOOL)b_is_altkey; - (void)loadButtonIcons; - (IBAction)buttonAction:(id)sender; - (void)setWindowTitle:(NSString *)title; -- (void)setFullscreenButtonHidden:(BOOL)b_value; - (void)setWindowButtonOver:(BOOL)b_value; - (void)setWindowFullscreenButtonOver:(BOOL)b_value; diff --git a/modules/gui/macosx/MainWindowTitle.m b/modules/gui/macosx/MainWindowTitle.m index d7c1895..0b0cc64 100644 --- a/modules/gui/macosx/MainWindowTitle.m +++ b/modules/gui/macosx/MainWindowTitle.m @@ -57,6 +57,9 @@ [o_green_img release]; [o_green_over_img release]; [o_green_on_img release]; + [o_fullscreen_img release]; + [o_fullscreen_over_img release]; + [o_fullscreen_on_img release]; [o_window_title_shadow release]; [o_window_title_attributes_dict release]; @@ -66,6 +69,16 @@ - (void)awakeFromNib { + b_nativeFullscreenMode = NO; +#ifdef MAC_OS_X_VERSION_10_7 + if (!OSX_SNOW_LEOPARD) + b_nativeFullscreenMode = var_InheritBool(VLCIntf, "macosx-nativefullscreenmode"); +#endif + + if (!b_nativeFullscreenMode || OSX_YOSEMITE) { + [o_fullscreen_btn setHidden: YES]; + } + [self setAutoresizesSubviews: YES]; [self setImagesLeft:imageFromRes(@"topbar-dark-left") middle: imageFromRes(@"topbar-dark-center-fill") right:imageFromRes(@"topbar-dark-right")]; @@ -75,16 +88,6 @@ - (void)controlTintChanged:(NSNotification *)notification { - [o_red_img release]; - [o_red_over_img release]; - [o_red_on_img release]; - [o_yellow_img release]; - [o_yellow_over_img release]; - [o_yellow_on_img release]; - [o_green_img release]; - [o_green_over_img release]; - [o_green_on_img release]; - [self loadButtonIcons]; [o_red_btn setNeedsDisplay]; @@ -92,6 +95,17 @@ [o_green_btn setNeedsDisplay]; } +- (void)informModifierPressed:(BOOL)b_is_altkey; +{ + BOOL b_state_changed = b_alt_pressed != b_is_altkey; + + b_alt_pressed = b_is_altkey; + + if (b_state_changed) { + [self updateGreenButton]; + } +} + - (NSImage *)getButtonImage:(NSString *)o_id { NSString *o_name = @""; @@ -114,6 +128,19 @@ - (void)loadButtonIcons { + [o_red_img release]; + [o_red_over_img release]; + [o_red_on_img release]; + [o_yellow_img release]; + [o_yellow_over_img release]; + [o_yellow_on_img release]; + [o_green_img release]; + [o_green_over_img release]; + [o_green_on_img release]; + [o_fullscreen_img release]; + [o_fullscreen_over_img release]; + [o_fullscreen_on_img release]; + o_red_img = [[self getButtonImage:@"window-close"] retain]; o_red_over_img = [[self getButtonImage:@"window-close-over"] retain]; o_red_on_img = [[self getButtonImage:@"window-close-on"] retain]; @@ -124,6 +151,13 @@ o_green_over_img = [[self getButtonImage:@"window-zoom-over"] retain]; o_green_on_img = [[self getButtonImage:@"window-zoom-on"] retain]; + // these files are only available in the yosemite variant + if (OSX_YOSEMITE) { + o_fullscreen_img = [[self getButtonImage:@"window-fullscreen"] retain]; + o_fullscreen_over_img = [[self getButtonImage:@"window-fullscreen-over"] retain]; + o_fullscreen_on_img = [[self getButtonImage:@"window-fullscreen-on"] retain]; + } + [o_red_btn setImage: o_red_img]; [o_red_btn setAlternateImage: o_red_on_img]; [[o_red_btn cell] setShowsBorderOnlyWhileMouseInside: YES]; @@ -132,8 +166,8 @@ [o_yellow_btn setAlternateImage: o_yellow_on_img]; [[o_yellow_btn cell] setShowsBorderOnlyWhileMouseInside: YES]; [[o_yellow_btn cell] setTag: 1]; - [o_green_btn setImage: o_green_img]; - [o_green_btn setAlternateImage: o_green_on_img]; + + [self updateGreenButton]; [[o_green_btn cell] setShowsBorderOnlyWhileMouseInside: YES]; [[o_green_btn cell] setTag: 2]; [o_fullscreen_btn setImage: [NSImage imageNamed:@"window-fullscreen"]]; @@ -142,6 +176,31 @@ [[o_fullscreen_btn cell] setTag: 3]; } +- (void)updateGreenButton +{ + // default image for old version, or if native fullscreen is + // disabled on yosemite, or if alt key is pressed + if (!OSX_YOSEMITE || !b_nativeFullscreenMode || b_alt_pressed) { + + if (b_mouse_over) { + [o_green_btn setImage: o_green_over_img]; + [o_green_btn setAlternateImage: o_green_on_img]; + } else { + [o_green_btn setImage: o_green_img]; + [o_green_btn setAlternateImage: o_green_on_img]; + } + } else { + + if (b_mouse_over) { + [o_green_btn setImage: o_fullscreen_over_img]; + [o_green_btn setAlternateImage: o_fullscreen_on_img]; + } else { + [o_green_btn setImage: o_fullscreen_img]; + [o_green_btn setAlternateImage: o_fullscreen_on_img]; + } + } +} + - (BOOL)mouseDownCanMoveWindow { return YES; @@ -153,9 +212,13 @@ [[self window] performClose: sender]; else if (sender == o_yellow_btn) [[self window] miniaturize: sender]; - else if (sender == o_green_btn) - [[self window] performZoom: sender]; - else if (sender == o_fullscreen_btn) { + else if (sender == o_green_btn) { + if (OSX_YOSEMITE && b_nativeFullscreenMode && !b_alt_pressed) { + [[self window] toggleFullScreen:self]; + } else { + [[self window] performZoom: sender]; + } + } else if (sender == o_fullscreen_btn) { // same action as native fs button [[self window] toggleFullScreen:self]; @@ -185,22 +248,18 @@ [o_attributed_title release]; } -- (void)setFullscreenButtonHidden:(BOOL)b_value -{ - [o_fullscreen_btn setHidden: b_value]; -} - - (void)setWindowButtonOver:(BOOL)b_value { + b_mouse_over = b_value; if (b_value) { [o_red_btn setImage: o_red_over_img]; [o_yellow_btn setImage: o_yellow_over_img]; - [o_green_btn setImage: o_green_over_img]; } else { [o_red_btn setImage: o_red_img]; [o_yellow_btn setImage: o_yellow_img]; - [o_green_btn setImage: o_green_img]; } + + [self updateGreenButton]; } - (void)setWindowFullscreenButtonOver:(BOOL)b_value diff --git a/modules/gui/macosx/Windows.h b/modules/gui/macosx/Windows.h index d3dec6b..319e95a 100644 --- a/modules/gui/macosx/Windows.h +++ b/modules/gui/macosx/Windows.h @@ -74,6 +74,7 @@ static const float f_min_video_height = 70.0; @class VLCControlsBarCommon; +@class VLCMainWindowTitleView; /***************************************************************************** * VLCVideoWindowCommon @@ -86,7 +87,7 @@ static const float f_min_video_height = 70.0; NSRect previousSavedFrame; BOOL b_dark_interface; - IBOutlet id o_titlebar_view; // only set in main or detached window + IBOutlet VLCMainWindowTitleView *o_titlebar_view; // only set in main or detached window IBOutlet VLCVoutView *o_video_view; IBOutlet VLCControlsBarCommon *o_controls_bar; diff --git a/modules/gui/macosx/Windows.m b/modules/gui/macosx/Windows.m index b78fe6a..48b1d82 100644 --- a/modules/gui/macosx/Windows.m +++ b/modules/gui/macosx/Windows.m @@ -335,10 +335,9 @@ if (b_nativeFullscreenMode) { [self setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary]; - } else { - [o_titlebar_view setFullscreenButtonHidden: YES]; } + [super awakeFromNib]; } @@ -646,6 +645,17 @@ } #pragma mark - +#pragma mark Key events + +- (void)flagsChanged:(NSEvent *)theEvent +{ + BOOL b_alt_pressed = ([theEvent modifierFlags] & NSAlternateKeyMask) != 0; + [o_titlebar_view informModifierPressed: b_alt_pressed]; + + [super flagsChanged:theEvent]; +} + +#pragma mark - #pragma mark Lion native fullscreen handling - (void)becomeKeyWindow _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
