From 7ef21141073802ee12911cc8a5a42b5bddd62054 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Sun, 1 Jul 2012 20:25:24 +0000 Subject: [PATCH] added fullscreen mode on Mac (patch #2040 by Takahiro Horikawa) --- modules/highgui/src/precomp.hpp | 2 + modules/highgui/src/window.cpp | 4 ++ modules/highgui/src/window_cocoa.mm | 82 +++++++++++++++++++++++++++++++++++-- 3 files changed, 84 insertions(+), 4 deletions(-) diff --git a/modules/highgui/src/precomp.hpp b/modules/highgui/src/precomp.hpp index eca4ce1..334a097 100644 --- a/modules/highgui/src/precomp.hpp +++ b/modules/highgui/src/precomp.hpp @@ -172,10 +172,12 @@ CvVideoWriter* cvCreateVideoWriter_GStreamer( const char* filename, int fourcc, void cvSetModeWindow_W32(const char* name, double prop_value); void cvSetModeWindow_GTK(const char* name, double prop_value); void cvSetModeWindow_CARBON(const char* name, double prop_value); +void cvSetModeWindow_COCOA(const char* name, double prop_value); double cvGetModeWindow_W32(const char* name); double cvGetModeWindow_GTK(const char* name); double cvGetModeWindow_CARBON(const char* name); +double cvGetModeWindow_COCOA(const char* name); double cvGetPropWindowAutoSize_W32(const char* name); double cvGetPropWindowAutoSize_GTK(const char* name); diff --git a/modules/highgui/src/window.cpp b/modules/highgui/src/window.cpp index 28ed2f1..4e94566 100644 --- a/modules/highgui/src/window.cpp +++ b/modules/highgui/src/window.cpp @@ -62,6 +62,8 @@ CV_IMPL void cvSetWindowProperty(const char* name, int prop_id, double prop_valu cvSetModeWindow_GTK(name,prop_value); #elif defined (HAVE_CARBON) cvSetModeWindow_CARBON(name,prop_value); + #elif defined (HAVE_COCOA) + cvSetModeWindow_COCOA(name,prop_value); #endif break; @@ -99,6 +101,8 @@ CV_IMPL double cvGetWindowProperty(const char* name, int prop_id) return cvGetModeWindow_GTK(name); #elif defined (HAVE_CARBON) return cvGetModeWindow_CARBON(name); + #elif defined (HAVE_COCOA) + return cvGetModeWindow_COCOA(name); #else return -1; #endif diff --git a/modules/highgui/src/window_cocoa.mm b/modules/highgui/src/window_cocoa.mm index d72c721..20e0b1c 100644 --- a/modules/highgui/src/window_cocoa.mm +++ b/modules/highgui/src/window_cocoa.mm @@ -109,13 +109,15 @@ static bool wasInitialized = false; CvMouseCallback mouseCallback; void *mouseParam; BOOL autosize; - BOOL firstContent; + BOOL firstContent; + int status; } @property(assign) CvMouseCallback mouseCallback; @property(assign) void *mouseParam; @property(assign) BOOL autosize; @property(assign) BOOL firstContent; @property(retain) NSMutableDictionary *sliders; +@property(readwrite) int status; - (CVView *)contentView; - (void)cvSendMouseEvent:(NSEvent *)event type:(int)type flags:(int)flags; - (void)cvMouseEvent:(NSEvent *)event; @@ -533,6 +535,75 @@ CV_IMPL int cvWaitKey (int maxWait) return returnCode; } +double cvGetModeWindow_COCOA( const char* name ) +{ + double result = -1; + CVWindow *window = nil; + + CV_FUNCNAME( "cvGetModeWindow_COCOA" ); + + __BEGIN__; + if( name == NULL ) + { + CV_ERROR( CV_StsNullPtr, "NULL name string" ); + } + + window = cvGetWindow( name ); + if ( window == NULL ) + { + CV_ERROR( CV_StsNullPtr, "NULL window" ); + } + + result = window.status; + + __END__; + return result; +} + +void cvSetModeWindow_COCOA( const char* name, double prop_value ) +{ + CVWindow *window = nil; + NSDictionary *fullscreenOptions = nil; + NSAutoreleasePool* localpool = nil; + + CV_FUNCNAME( "cvSetModeWindow_COCOA" ); + + __BEGIN__; + if( name == NULL ) + { + CV_ERROR( CV_StsNullPtr, "NULL name string" ); + } + + window = cvGetWindow(name); + if ( window == NULL ) + { + CV_ERROR( CV_StsNullPtr, "NULL window" ); + } + + if ( [window autosize] ) + { + return; + } + + localpool = [[NSAutoreleasePool alloc] init]; + + fullscreenOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:NSFullScreenModeSetting]; + if ( [[window contentView] isInFullScreenMode] && prop_value==CV_WINDOW_NORMAL ) + { + [[window contentView] exitFullScreenModeWithOptions:fullscreenOptions]; + window.status=CV_WINDOW_NORMAL; + } + else if( ![[window contentView] isInFullScreenMode] && prop_value==CV_WINDOW_FULLSCREEN ) + { + [[window contentView] enterFullScreenMode:[NSScreen mainScreen] withOptions:fullscreenOptions]; + window.status=CV_WINDOW_FULLSCREEN; + } + + [localpool drain]; + + __END__; +} + @implementation CVWindow @synthesize mouseCallback; @@ -540,6 +611,7 @@ CV_IMPL int cvWaitKey (int maxWait) @synthesize autosize; @synthesize firstContent; @synthesize sliders; +@synthesize status; - (void)cvSendMouseEvent:(NSEvent *)event type:(int)type flags:(int)flags { //cout << "cvSendMouseEvent" << endl; @@ -787,9 +859,11 @@ CV_IMPL int cvWaitKey (int maxWait) NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; CVWindow *cvwindow = (CVWindow *)[self window]; int height = 0; - for(NSString *key in [cvwindow sliders]) { - height += [[[cvwindow sliders] valueForKey:key] frame].size.height; - } + if ([cvwindow respondsToSelector:@selector(sliders)]) { + for(NSString *key in [cvwindow sliders]) { + height += [[[cvwindow sliders] valueForKey:key] frame].size.height; + } + } NSRect imageRect = {{0,0}, {[image size].width, [image size].height}}; -- 2.7.4