From 0b7181e31f904154e1d7c57a239586619216c6e1 Mon Sep 17 00:00:00 2001 From: skyjake Date: Sun, 18 Mar 2012 15:46:16 +0200 Subject: [PATCH] Mac OS X|Fixed: Prevented Cmd+Q in fullscreen mode --- doomsday/engine/mac/src/displaymode_macx.mm | 12 +++--------- doomsday/engine/portable/include/canvaswindow.h | 1 + doomsday/engine/portable/src/canvaswindow.cpp | 6 ++++++ doomsday/engine/portable/src/displaymode.cpp | 2 ++ doomsday/engine/portable/src/window.cpp | 5 +++-- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/doomsday/engine/mac/src/displaymode_macx.mm b/doomsday/engine/mac/src/displaymode_macx.mm index d494a9f733..ea296036aa 100644 --- a/doomsday/engine/mac/src/displaymode_macx.mm +++ b/doomsday/engine/mac/src/displaymode_macx.mm @@ -128,8 +128,6 @@ static int findIndex(const DisplayMode* mode) return -1; // Invalid mode. } -#define DISABLE_FADE - int DisplayMode_Native_Change(const DisplayMode* mode) { const CGDisplayFadeInterval fadeTime = .5f; @@ -137,12 +135,10 @@ int DisplayMode_Native_Change(const DisplayMode* mode) assert(mode); assert(findIndex(mode) >= 0); // mode must be an enumerated one -#ifndef DISABLE_FADE // Fade all displays to black. CGDisplayFadeReservationToken token; CGAcquireDisplayFadeReservation(kCGMaxDisplayReservationInterval, &token); CGDisplayFade(token, fadeTime, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0, 0, 0, true /* wait */); -#endif // Capture the displays now if haven't yet done so. bool wasPreviouslyCaptured = true; @@ -156,6 +152,8 @@ int DisplayMode_Native_Change(const DisplayMode* mode) { CFDictionaryRef current = currentModeDict(); + qDebug() << "Changing to native mode" << findIndex(mode); + // Try to change. result = CGDisplaySwitchToMode(kCGDirectMainDisplay, displayDicts[findIndex(mode)]); if(result != kCGErrorSuccess) @@ -166,13 +164,9 @@ int DisplayMode_Native_Change(const DisplayMode* mode) } } - /// @todo fade should wait when shutting down - -#ifndef DISABLE_FADE // Fade back to normal. - CGDisplayFade(token, fadeTime, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, false /* don't wait */); + CGDisplayFade(token, 2*fadeTime, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, false); CGReleaseDisplayFadeReservation(token); -#endif return result == kCGErrorSuccess; } diff --git a/doomsday/engine/portable/include/canvaswindow.h b/doomsday/engine/portable/include/canvaswindow.h index 8032c6fbcd..e7bbf53c3b 100644 --- a/doomsday/engine/portable/include/canvaswindow.h +++ b/doomsday/engine/portable/include/canvaswindow.h @@ -46,6 +46,7 @@ class CanvasWindow : public QMainWindow void setMoveFunc(void (*func)(CanvasWindow&)); // Events. + void closeEvent(QCloseEvent* ev); void moveEvent(QMoveEvent* ev); void hideEvent(QHideEvent* ev); diff --git a/doomsday/engine/portable/src/canvaswindow.cpp b/doomsday/engine/portable/src/canvaswindow.cpp index 12c586525b..7484fdf7ea 100644 --- a/doomsday/engine/portable/src/canvaswindow.cpp +++ b/doomsday/engine/portable/src/canvaswindow.cpp @@ -63,6 +63,12 @@ void CanvasWindow::setMoveFunc(void (*func)(CanvasWindow&)) d->moveFunc = func; } +void CanvasWindow::closeEvent(QCloseEvent* ev) +{ + /// @todo autosave and quit? + ev->ignore(); +} + void CanvasWindow::moveEvent(QMoveEvent *ev) { QMainWindow::moveEvent(ev); diff --git a/doomsday/engine/portable/src/displaymode.cpp b/doomsday/engine/portable/src/displaymode.cpp index 9da28d2705..34797baeb7 100644 --- a/doomsday/engine/portable/src/displaymode.cpp +++ b/doomsday/engine/portable/src/displaymode.cpp @@ -156,6 +156,8 @@ void DisplayMode_Shutdown(void) { if(!inited) return; + qDebug() << "Restoring original display mode due to shutdown."; + // Back to the original mode. DisplayMode_Change(&originalMode); diff --git a/doomsday/engine/portable/src/window.cpp b/doomsday/engine/portable/src/window.cpp index b8abf60308..32eece9b84 100644 --- a/doomsday/engine/portable/src/window.cpp +++ b/doomsday/engine/portable/src/window.cpp @@ -201,6 +201,7 @@ struct ddwindow_s else { DisplayMode_Change(DisplayMode_OriginalMode()); + widget->canvas().trapMouse(false); } } @@ -213,6 +214,8 @@ struct ddwindow_s { assertWindow(); + applyDisplayMode(); + if(flags & DDWF_FULLSCREEN) { if(widget->isVisible()) widget->showFullScreen(); @@ -860,8 +863,6 @@ static Window* createWindow(ddwindowtype_t type, const char* title) // Let's see if there are command line options overriding the previous state. mainWindow.modifyAccordingToOptions(); - mainWindow.applyDisplayMode(); - // Make it so. (Not shown yet.) mainWindow.applyWindowGeometry();