123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2013 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- #import "platformOSX/platformOSX.h"
- #include "platformOSX/osxOpenGLDevice.h"
- //------------------------------------------------------------------------------
- // Get the video settings from the prefs.
- static void osxGetInitialResolution(U32 &width, U32 &height, U32 &bpp, bool &fullScreen)
- {
- const char* resString;
- char *tempBuf;
-
- osxPlatState * platState = [osxPlatState sharedPlatState];
-
- // cache the desktop size of the selected screen in platState
- Video::getDesktopResolution();
-
- // load pref variables, properly choose windowed / fullscreen
- fullScreen = Con::getBoolVariable("$pref::Video::fullScreen");
-
- if (fullScreen)
- resString = Con::getVariable("$pref::Video::resolution");
- else
- resString = Con::getVariable("$pref::Video::windowedRes");
-
- // dStrtok is destructive, work on a copy...
- tempBuf = new char[dStrlen(resString) + 1];
- dStrcpy(tempBuf, resString);
-
- // set window size
- //DAW: Added min size checks for windowSize
- width = (U32)dAtoi(dStrtok(tempBuf, " x\0"));
-
- if (width <= 0)
- width = [platState windowWidth];
-
- height = (U32)dAtoi(dStrtok( NULL, " x\0"));
-
- if (height <= 0)
- height = [platState windowHeight];
-
- // bit depth
- if (fullScreen)
- {
- dAtoi(dStrtok(NULL, "\0"));
-
- if ( bpp <= 0 )
- bpp = 16;
- }
- else
- bpp = platState.desktopBitsPixel == 24 ? 32 : platState.desktopBitsPixel;
-
- delete [] tempBuf;
- }
- //-----------------------------------------------------------------------------
- // This is the critical platform function for initializing graphics. This
- // will create a NSWindow, a custom OSXTorqueView, a DisplayDevice, and
- // kick off the Video:: work
- void Platform::initWindow(const Point2I &initialSize, const char *name)
- {
- bool fullScreen;
- U32 width, height, bpp;
-
- osxGetInitialResolution(width, height, bpp, fullScreen);
-
- // Create the NSWindow
- osxPlatState * platState = [osxPlatState sharedPlatState];
-
-
- NSRect frame = NSMakeRect(0, 0, [platState windowWidth], [platState windowHeight]);
-
- NSWindow *tempWindow = [[[NSWindow alloc] initWithContentRect:frame
- styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable
- backing:NSBackingStoreBuffered
- defer:NO] autorelease];
-
- [tempWindow setBackgroundColor:[NSColor blackColor]];
- // The full frame for a window must consider the title bar height as well
- // Thus, our NSWindow must be larger than the passed width and height
- frame = [NSWindow frameRectForContentRect:frame styleMask:NSWindowStyleMaskTitled];
- [tempWindow setFrame:frame display:YES];
- [platState setWindow:tempWindow];
-
- [platState setWindowSize:initialSize.x height:initialSize.y];
-
- [platState updateWindowTitle:name];
-
- // Set up TorqueView and add it here:
- OSXTorqueView* torqueView = [[OSXTorqueView alloc] initWithFrame:frame];
- [torqueView initialize];
-
- [platState setTorqueView:torqueView];
- [[platState window] setContentView:[platState torqueView]];
- [[NSNotificationCenter defaultCenter] addObserver:[platState torqueView] selector:@selector(windowFinishedLiveResize:) name:NSWindowDidEndLiveResizeNotification object:[platState window]];
-
- // Create the DisplayDevice and install it. In this case, our osxOpenGLDevice
- osxOpenGLDevice* device = new osxOpenGLDevice();
- Video::installDevice(device);
-
- bool deviceWasSet = Video::setDevice(device->mDeviceName, width, height, bpp, fullScreen);
-
- if (!deviceWasSet)
- AssertFatal(false, "Platform::initWindow could not find a compatible display device!");
- // Show the window and all its contents
- [[platState window] makeKeyAndOrderFront:NSApp];
- [[platState window] center];
- }
- //-----------------------------------------------------------------------------
- // Changes the text in the NSWindow title
- void Platform::setWindowTitle( const char* title )
- {
- osxPlatState * platState = [osxPlatState sharedPlatState];
-
- [platState updateWindowTitle:title];
- }
- //-----------------------------------------------------------------------------
- // Calls osxPlatState::setWindowSize
- void Platform::setWindowSize( U32 newWidth, U32 newHeight )
- {
- osxPlatState * platState = [osxPlatState sharedPlatState];
-
- [platState setWindowSize:newWidth height:newHeight];
- }
- //-----------------------------------------------------------------------------
- // Returns osxPlatState::getWindowSize
- const Point2I& Platform::getWindowSize()
- {
- osxPlatState * platState = [osxPlatState sharedPlatState];
-
- return [platState getWindowSize];
- }
- //-----------------------------------------------------------------------------
- // Simulates the user clicking the minimize button by momentarily highlighting
- // the button, then minimizing the window.
- void Platform::minimizeWindow()
- {
- NSApplication *application = [NSApplication sharedApplication];
- NSWindow *keyWindow = [application keyWindow];
- [keyWindow miniaturize:keyWindow];
- }
- //-----------------------------------------------------------------------------
- // De-minimizes the window.
- void Platform::restoreWindow()
- {
- NSApplication *application = [NSApplication sharedApplication];
- NSWindow *keyWindow = [application keyWindow];
- [keyWindow deminiaturize:keyWindow];
- }
- //-----------------------------------------------------------------------------
- // Sets whether the mouse is locked to the appWindow. Thist changes how the
- // mouse input is processed on movement, but does not affect any actual window
- // or view properties.
- void Platform::setMouseLock(bool locked)
- {
- osxPlatState* platState = [osxPlatState sharedPlatState];
- [platState setMouseLocked:YES];
- }
- //-----------------------------------------------------------------------------
- // Launch the default OS browser. This has nothing to do with the QT browser
- bool Platform::openWebBrowser( const char* webAddress )
- {
- if(Video::isFullScreen())
- Video::toggleFullScreen();
- NSString* convertedAddress = [NSString stringWithUTF8String:webAddress];
- bool result = [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:convertedAddress]];
- if (!result)
- Con::errorf("Platform::openWebBrowser could not open web address:%s", webAddress);
- return result;
- }
|