[vlc-commits] macosx: implement native fullscreen behaviour for yosemite titlebar
David Fuhrmann
git at videolan.org
Thu Oct 2 14:08:12 CEST 2014
vlc | branch: master | David Fuhrmann <dfuhrmann at videolan.org> | Thu Oct 2 12:59:15 2014 +0200| [0b001a0763aa2e34f6abd921184ce58d56947421] | committer: David Fuhrmann
macosx: implement native fullscreen behaviour for yosemite titlebar
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0b001a0763aa2e34f6abd921184ce58d56947421
---
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;
+ at 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
More information about the vlc-commits
mailing list