Browse Source

Remember player positioning when run from editor
Prevent multiple Atomic Player windows

rsredsq 10 years ago
parent
commit
33ea57ba52

+ 4 - 1
Resources/EditorData/AtomicEditor/editor/skin/skin.tb.txt

@@ -78,6 +78,9 @@ elements
 	PlayButton
 	PlayButton
 		bitmap play.png
 		bitmap play.png
 
 
+	StopButton
+		bitmap stop.png
+
 	PowerOffButton
 	PowerOffButton
 		bitmap power_off.png
 		bitmap power_off.png
 
 
@@ -171,7 +174,7 @@ elements
 	InspectorVectorAttrName
 	InspectorVectorAttrName
 		text-color #aaaaaa
 		text-color #aaaaaa
 		min-width 140
 		min-width 140
-		max-width 140		
+		max-width 140
 
 
 	InspectorTextAttrName
 	InspectorTextAttrName
 		padding 4
 		padding 4

BIN
Resources/EditorData/AtomicEditor/editor/skin/stop.png


+ 3 - 3
Resources/EditorData/AtomicEditor/editor/ui/maintoolbar.tb.txt

@@ -1,11 +1,11 @@
 definitions
 definitions
-	menubutton		
+	menubutton
 		lp: height: 28, width: 28
 		lp: height: 28, width: 28
 		skin TBButton.uniformflat
 		skin TBButton.uniformflat
 TBLayout: distribution: gravity, spacing: 4
 TBLayout: distribution: gravity, spacing: 4
-	TBButton 
+	TBButton
 		@include definitions>menubutton
 		@include definitions>menubutton
-		TBSkinImage: skin: PlayButton
+		TBSkinImage: skin: PlayButton, id: skin_image
 		id maintoolbar_play
 		id maintoolbar_play
 	TBButton: toggle-mode: 1
 	TBButton: toggle-mode: 1
 		@include definitions>menubutton
 		@include definitions>menubutton

+ 15 - 2
Script/AtomicEditor/editor/Editor.ts

@@ -34,12 +34,19 @@ class Editor extends Atomic.ScriptObject {
 
 
         Editor.instance = this;
         Editor.instance = this;
 
 
+        Preferences.getInstance().read();
+
+        var editorWindow = Preferences.getInstance().editorWindow;
+
+        if (editorWindow) {
+            Atomic.graphics.setWindowSize(editorWindow.width, editorWindow.height);
+            Atomic.graphics.setWindowPosition(editorWindow.x, editorWindow.y);
+        }
+
         this.initUI();
         this.initUI();
 
 
         this.editorLicense = new EditorLicense();
         this.editorLicense = new EditorLicense();
 
 
-        Preferences.getInstance().read();
-
         EditorUI.initialize();
         EditorUI.initialize();
 
 
         this.playMode = new PlayMode();
         this.playMode = new PlayMode();
@@ -53,6 +60,10 @@ class Editor extends Atomic.ScriptObject {
             this.handleProjectUnloaded(data)
             this.handleProjectUnloaded(data)
         });
         });
 
 
+        this.subscribeToEvent("IPCPlayerWindow", (data) => {
+            Preferences.getInstance().savePlayerWindowData(data.posX, data.posY, data.width, data.height);
+        });
+
         this.subscribeToEvent("ExitRequested", (data) => this.handleExitRequested(data));
         this.subscribeToEvent("ExitRequested", (data) => this.handleExitRequested(data));
 
 
         this.subscribeToEvent("ProjectLoaded", (data) => {
         this.subscribeToEvent("ProjectLoaded", (data) => {
@@ -118,6 +129,7 @@ class Editor extends Atomic.ScriptObject {
     }
     }
 
 
     closeProject() {
     closeProject() {
+        this.sendEvent("IPCPlayerExitRequest");
         var system = ToolCore.getToolSystem();
         var system = ToolCore.getToolSystem();
 
 
         if (system.project) {
         if (system.project) {
@@ -157,6 +169,7 @@ class Editor extends Atomic.ScriptObject {
 
 
     // event handling
     // event handling
     handleExitRequested(data) {
     handleExitRequested(data) {
+        this.sendEvent("IPCPlayerExitRequest");
         this.exitRequested = true;
         this.exitRequested = true;
         this.closeAllResourceEditors();
         this.closeAllResourceEditors();
     }
     }

+ 38 - 3
Script/AtomicEditor/editor/Preferences.ts

@@ -15,6 +15,7 @@ class Preferences {
 
 
     private static instance: Preferences;
     private static instance: Preferences;
     private _prefs: PreferencesFormat;
     private _prefs: PreferencesFormat;
+    private _configCorrupted: boolean;
 
 
     constructor() {
     constructor() {
         this.fileSystem = Atomic.getFileSystem();
         this.fileSystem = Atomic.getFileSystem();
@@ -68,7 +69,15 @@ class Preferences {
         }
         }
         //Read file
         //Read file
         jsonFile = new Atomic.File(filePath, Atomic.FILE_READ);
         jsonFile = new Atomic.File(filePath, Atomic.FILE_READ);
-        var prefs = <PreferencesFormat>JSON.parse(jsonFile.readText());
+        var prefs;
+        try {
+          prefs = <PreferencesFormat>JSON.parse(jsonFile.readText());
+        } catch (e){
+          console.log("Config file is corrupted");
+          prefs = null;
+          this._configCorrupted = true;
+          this.useDefaultConfig();
+        }
         if (prefs) {
         if (prefs) {
             if (!prefs.recentProjects) prefs.recentProjects = [""];
             if (!prefs.recentProjects) prefs.recentProjects = [""];
             this._prefs = prefs;
             this._prefs = prefs;
@@ -77,6 +86,7 @@ class Preferences {
     }
     }
 
 
     write(): void {
     write(): void {
+        if (this._configCorrupted) return;
         var filePath = this.getPreferencesFullPath();
         var filePath = this.getPreferencesFullPath();
         var jsonFile = new Atomic.File(filePath, Atomic.FILE_WRITE);
         var jsonFile = new Atomic.File(filePath, Atomic.FILE_WRITE);
         if (!jsonFile.isOpen()) return;
         if (!jsonFile.isOpen()) return;
@@ -87,10 +97,26 @@ class Preferences {
             width = graphics.getWidth();
             width = graphics.getWidth();
             height = graphics.getHeight();
             height = graphics.getHeight();
         }
         }
-        this._prefs.window = { x: pos[0], y: pos[1], width: width, height: height };
+        this._prefs.editorWindow = { x: pos[0], y: pos[1], width: width, height: height, fullscreen: graphics.getFullscreen()};
         jsonFile.writeString(JSON.stringify(this._prefs, null, 2));
         jsonFile.writeString(JSON.stringify(this._prefs, null, 2));
     }
     }
 
 
+    savePlayerWindowData(x, y, width, height) {
+        this._prefs.playerWindow = {x: x, y: y, width: width, height: height, fullscreen: false};
+    }
+
+    useDefaultConfig():void {
+        this._prefs = new PreferencesFormat();
+    }
+
+    get editorWindow():WindowData {
+        return this._prefs.editorWindow;
+    }
+
+    get playerWindow():WindowData {
+        return this._prefs.playerWindow;
+    }
+
     get recentProjects(): [string] {
     get recentProjects(): [string] {
         return this._prefs.recentProjects;
         return this._prefs.recentProjects;
     }
     }
@@ -100,9 +126,18 @@ class Preferences {
     }
     }
 }
 }
 
 
+class WindowData {
+  x: number;
+  y: number;
+  width: number;
+  height: number;
+  fullscreen: boolean;
+}
+
 class PreferencesFormat {
 class PreferencesFormat {
     recentProjects: [string];
     recentProjects: [string];
-    window: { x: number, y: number, width: number, height: number };
+    editorWindow: WindowData;
+    playerWindow: WindowData;
 }
 }
 
 
 export = Preferences;
 export = Preferences;

+ 15 - 2
Script/AtomicEditor/ui/MainToolbar.ts

@@ -13,6 +13,7 @@ class MainToolbar extends Atomic.UIWidget {
     rotateButton: Atomic.UIButton;
     rotateButton: Atomic.UIButton;
     scaleButton: Atomic.UIButton;
     scaleButton: Atomic.UIButton;
     axisButton: Atomic.UIButton;
     axisButton: Atomic.UIButton;
+    playButton: Atomic.UIButton;
 
 
     constructor(parent: Atomic.UIWidget) {
     constructor(parent: Atomic.UIWidget) {
 
 
@@ -26,6 +27,8 @@ class MainToolbar extends Atomic.UIWidget {
 
 
         this.axisButton = <Atomic.UIButton>this.getWidget("3d_axismode");
         this.axisButton = <Atomic.UIButton>this.getWidget("3d_axismode");
 
 
+        this.playButton = <Atomic.UIButton>this.getWidget("maintoolbar_play");
+
         this.translateButton.value = 1;
         this.translateButton.value = 1;
 
 
         parent.addChild(this);
         parent.addChild(this);
@@ -33,6 +36,10 @@ class MainToolbar extends Atomic.UIWidget {
         this.subscribeToEvent("GizmoAxisModeChanged", (ev) => this.handleGizmoAxisModeChanged(ev));
         this.subscribeToEvent("GizmoAxisModeChanged", (ev) => this.handleGizmoAxisModeChanged(ev));
         this.subscribeToEvent("GizmoEditModeChanged", (ev) => this.handleGizmoEditModeChanged(ev));
         this.subscribeToEvent("GizmoEditModeChanged", (ev) => this.handleGizmoEditModeChanged(ev));
         this.subscribeToEvent(this, "WidgetEvent", (data) => this.handleWidgetEvent(data));
         this.subscribeToEvent(this, "WidgetEvent", (data) => this.handleWidgetEvent(data));
+        this.subscribeToEvent("IPCPlayerExitRequest", (data) => {
+            var skin = <Atomic.UISkinImage> this.playButton.getWidget("skin_image");
+            skin.setSkinBg("PlayButton");
+        });
     }
     }
 
 
     handleGizmoAxisModeChanged(ev: Editor.GizmoAxisModeChangedEvent) {
     handleGizmoAxisModeChanged(ev: Editor.GizmoAxisModeChangedEvent) {
@@ -91,8 +98,14 @@ class MainToolbar extends Atomic.UIWidget {
                 return true;
                 return true;
 
 
             } else if (ev.target.id == "maintoolbar_play") {
             } else if (ev.target.id == "maintoolbar_play") {
-
-                EditorUI.getShortcuts().invokePlay();
+                var editorMode = <Editor.EditorMode> this.getSubsystem("EditorMode");
+                if (editorMode.isPlayerEnabled()) {
+                    this.sendEvent("IPCPlayerExitRequest");
+                } else {
+                    EditorUI.getShortcuts().invokePlay();
+                    var skin = <Atomic.UISkinImage> this.playButton.getWidget("skin_image");
+                    skin.setSkinBg("StopButton");
+                }
                 return true;
                 return true;
 
 
             }
             }

+ 17 - 2
Script/AtomicEditor/ui/Shortcuts.ts

@@ -7,6 +7,7 @@
 
 
 import EditorEvents = require("../editor/EditorEvents");
 import EditorEvents = require("../editor/EditorEvents");
 import EditorUI = require("./EditorUI");
 import EditorUI = require("./EditorUI");
+import Preferences = require("editor/Preferences")
 
 
 class Shortcuts extends Atomic.ScriptObject {
 class Shortcuts extends Atomic.ScriptObject {
 
 
@@ -21,17 +22,31 @@ class Shortcuts extends Atomic.ScriptObject {
 
 
     }
     }
 
 
+    //this should be moved somewhere else...
     invokePlay() {
     invokePlay() {
 
 
         this.sendEvent(EditorEvents.SaveAllResources);
         this.sendEvent(EditorEvents.SaveAllResources);
-        Atomic.editorMode.playProject();
 
 
+        var playerWindow = Preferences.getInstance().playerWindow;
+        if (playerWindow) {
+            var args = "--windowposx " + playerWindow.x + " --windowposy " + playerWindow.y + " --windowwidth " + playerWindow.width + " --windowheight " + playerWindow.height;
+            Atomic.editorMode.playProject(args, false);
+        } else {
+            Atomic.editorMode.playProject("");
+        }
     }
     }
 
 
     invokePlayDebug() {
     invokePlayDebug() {
 
 
         this.sendEvent(EditorEvents.SaveAllResources);
         this.sendEvent(EditorEvents.SaveAllResources);
-        Atomic.editorMode.playProjectDebug();
+
+        var playerWindow = Preferences.getInstance().playerWindow;
+        if (playerWindow) {
+            var args = "--windowposx " + playerWindow.x + " --windowposy " + playerWindow.y + " --windowwidth " + playerWindow.width + " --windowheight " + playerWindow.height;
+            Atomic.editorMode.playProject(args, true);
+        } else {
+          Atomic.editorMode.playProjectDebug();
+        }
 
 
     }
     }
 
 

+ 4 - 1
Script/Packages/Atomic/Graphics.json

@@ -15,6 +15,9 @@
 		},
 		},
 		"Camera" : {
 		"Camera" : {
 			"SetOrthoSize" : ["float"]
 			"SetOrthoSize" : ["float"]
+		},
+		"Graphics" : {
+			"SetWindowPosition" : ["int", "int"]
 		}
 		}
 
 
 	},
 	},
@@ -31,7 +34,7 @@
 		]
 		]
 
 
 	},
 	},
-	
+
 	"haxe_decl" : {
 	"haxe_decl" : {
 		"Light" : [
 		"Light" : [
 			"function getShadowCascade():Array<Float>;",
 			"function getShadowCascade():Array<Float>;",

+ 27 - 0
Source/AtomicEditor/Application/AEPlayerApp.cpp

@@ -31,6 +31,8 @@
 #include "../PlayerMode/AEPlayerMode.h"
 #include "../PlayerMode/AEPlayerMode.h"
 #include <AtomicPlayer/Player.h>
 #include <AtomicPlayer/Player.h>
 
 
+#include "../PlayerMode/AEPlayerEvents.h"
+
 #include "AEPlayerApp.h"
 #include "AEPlayerApp.h"
 
 
 #include <Atomic/DebugNew.h>
 #include <Atomic/DebugNew.h>
@@ -57,6 +59,8 @@ void AEPlayerApplication::Setup()
 {
 {
     AEEditorCommon::Setup();
     AEEditorCommon::Setup();
 
 
+    engine_->SetAutoExit(false);
+
     FileSystem* filesystem = GetSubsystem<FileSystem>();
     FileSystem* filesystem = GetSubsystem<FileSystem>();
 
 
     engineParameters_["WindowTitle"] = "AtomicPlayer";
     engineParameters_["WindowTitle"] = "AtomicPlayer";
@@ -150,6 +154,22 @@ void AEPlayerApplication::Setup()
 #endif
 #endif
 
 
             }
             }
+            else if (argument == "--windowposx" && value.Length()) 
+            {
+                engineParameters_["WindowPositionX"] = atoi(value.CString());
+            }
+            else if (argument == "--windowposy" && value.Length())
+            {
+                engineParameters_["WindowPositionY"] = atoi(value.CString());
+            }
+            else if (argument == "--windowwidth" && value.Length())
+            {
+                engineParameters_["WindowWidth"] = atoi(value.CString());
+            }
+            else if (argument == "--windowheight" && value.Length())
+            {
+                engineParameters_["WindowHeight"] = atoi(value.CString());
+            }
         }
         }
     }
     }
 
 
@@ -204,9 +224,16 @@ void AEPlayerApplication::Start()
         }
         }
     }
     }
 
 
+    SubscribeToEvent(E_IPCPLAYERQUIT, HANDLER(AEPlayerApplication, HandleQuit));
+
     return;
     return;
 }
 }
 
 
+void AEPlayerApplication::HandleQuit(StringHash eventType, VariantMap& eventData)
+{
+    engine_->Exit();
+}
+
 void AEPlayerApplication::Stop()
 void AEPlayerApplication::Stop()
 {
 {
     AEEditorCommon::Stop();
     AEEditorCommon::Stop();

+ 2 - 0
Source/AtomicEditor/Application/AEPlayerApp.h

@@ -41,6 +41,8 @@ private:
 
 
     void HandleLogMessage(StringHash eventType, VariantMap& eventData);
     void HandleLogMessage(StringHash eventType, VariantMap& eventData);
 
 
+    void HandleQuit(StringHash eventType, VariantMap& eventData);
+
     bool debugPlayer_;
     bool debugPlayer_;
 
 
 };
 };

+ 25 - 3
Source/AtomicEditor/EditorMode/AEEditorMode.cpp

@@ -20,6 +20,8 @@
 
 
 #include <Atomic/UI/SystemUI/DebugHud.h>
 #include <Atomic/UI/SystemUI/DebugHud.h>
 
 
+#include "../PlayerMode/AEPlayerEvents.h"
+
 #include "AEEditorMode.h"
 #include "AEEditorMode.h"
 
 
 using namespace ToolCore;
 using namespace ToolCore;
@@ -31,6 +33,7 @@ EditorMode::EditorMode(Context* context) :
     Object(context)
     Object(context)
 {
 {
     SubscribeToEvent(E_IPCWORKERSTART, HANDLER(EditorMode, HandleIPCWorkerStarted));
     SubscribeToEvent(E_IPCWORKERSTART, HANDLER(EditorMode, HandleIPCWorkerStarted));
+    SubscribeToEvent(E_IPCPLAYEREXITREQUEST, HANDLER(EditorMode, HandleIPCPlayerExitRequest));
 }
 }
 
 
 EditorMode::~EditorMode()
 EditorMode::~EditorMode()
@@ -57,14 +60,19 @@ void EditorMode::HandleIPCWorkerStarted(StringHash eventType, VariantMap& eventD
 
 
     SendEvent("EditorPlayerStarted");
     SendEvent("EditorPlayerStarted");
 
 
+    playerEnabled_ = true;
+
 }
 }
 
 
 void EditorMode::HandleIPCWorkerExit(StringHash eventType, VariantMap& eventData)
 void EditorMode::HandleIPCWorkerExit(StringHash eventType, VariantMap& eventData)
 {
 {
     //SendEvent(E_EDITORPLAYSTOP);
     //SendEvent(E_EDITORPLAYSTOP);
 
 
-    if ( eventData[IPCWorkerExit::P_BROKER] == playerBroker_)
+    if (eventData[IPCWorkerExit::P_BROKER] == playerBroker_) 
+    {
         playerBroker_ = 0;
         playerBroker_ = 0;
+        playerEnabled_ = false;
+    }
 }
 }
 
 
 void EditorMode::HandleIPCWorkerLog(StringHash eventType, VariantMap& eventData)
 void EditorMode::HandleIPCWorkerLog(StringHash eventType, VariantMap& eventData)
@@ -87,7 +95,7 @@ void EditorMode::HandleIPCJSError(StringHash eventType, VariantMap& eventData)
 
 
 }
 }
 
 
-bool EditorMode::PlayProject(bool debug)
+bool EditorMode::PlayProject(String addArgs, bool debug)
 {
 {
     ToolEnvironment* env = GetSubsystem<ToolEnvironment>();
     ToolEnvironment* env = GetSubsystem<ToolEnvironment>();
     ToolSystem* tsystem = GetSubsystem<ToolSystem>();
     ToolSystem* tsystem = GetSubsystem<ToolSystem>();
@@ -120,6 +128,9 @@ bool EditorMode::PlayProject(bool debug)
     if (debug)
     if (debug)
         vargs.Insert(0, "--debug");
         vargs.Insert(0, "--debug");
 
 
+    if (addArgs.Length() > 0)
+        vargs.Insert(0, addArgs);
+
     String dump;
     String dump;
     dump.Join(vargs, " ");
     dump.Join(vargs, " ");
     LOGINFOF("Launching Broker %s %s", editorBinary.CString(), dump.CString());
     LOGINFOF("Launching Broker %s %s", editorBinary.CString(), dump.CString());
@@ -140,7 +151,18 @@ bool EditorMode::PlayProject(bool debug)
 
 
 bool EditorMode::PlayProjectDebug()
 bool EditorMode::PlayProjectDebug()
 {
 {
-    return PlayProject(true);
+    return PlayProject("", true);
+}
+
+void EditorMode::HandleIPCPlayerExitRequest(StringHash eventType, VariantMap& eventData)
+{
+    if (!playerBroker_) return;
+    playerBroker_->PostMessage(E_IPCPLAYERQUIT, VariantMap());
+}
+
+bool EditorMode::IsPlayerEnabled()
+{
+    return playerEnabled_;
 }
 }
 
 
 }
 }

+ 5 - 1
Source/AtomicEditor/EditorMode/AEEditorMode.h

@@ -32,8 +32,9 @@ public:
     /// Destruct.
     /// Destruct.
     virtual ~EditorMode();
     virtual ~EditorMode();
 
 
-    bool PlayProject(bool debug = false);
+    bool PlayProject(String addArgs = "", bool debug = false);
     bool PlayProjectDebug();
     bool PlayProjectDebug();
+    bool IsPlayerEnabled();
 
 
 private:
 private:
 
 
@@ -41,9 +42,12 @@ private:
     void HandleIPCJSError(StringHash eventType, VariantMap& eventData);
     void HandleIPCJSError(StringHash eventType, VariantMap& eventData);
     void HandleIPCWorkerLog(StringHash eventType, VariantMap& eventData);
     void HandleIPCWorkerLog(StringHash eventType, VariantMap& eventData);
     void HandleIPCWorkerExit(StringHash eventType, VariantMap& eventData);
     void HandleIPCWorkerExit(StringHash eventType, VariantMap& eventData);
+    void HandleIPCPlayerExitRequest(StringHash eventType, VariantMap& eventData);
 
 
     SharedPtr<IPCBroker> playerBroker_;
     SharedPtr<IPCBroker> playerBroker_;
 
 
+    bool playerEnabled_ = false;
+
 };
 };
 
 
 }
 }

+ 35 - 0
Source/AtomicEditor/PlayerMode/AEPlayerEvents.h

@@ -0,0 +1,35 @@
+//
+// Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
+// LICENSE: Atomic Game Engine Editor and Tools EULA
+// Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for
+// license information: https://github.com/AtomicGameEngine/AtomicGameEngine
+//
+
+#pragma once
+
+#include <Atomic/Core/Object.h>
+
+using namespace Atomic;
+
+namespace AtomicEditor
+{
+
+EVENT(E_IPCPLAYEREXITREQUEST, IPCPlayerExitRequest)
+{
+
+}
+
+EVENT(E_IPCPLAYERWINDOW, IPCPlayerWindow)
+{
+    PARAM(P_POSX, PosX);
+    PARAM(P_POSY, PosY);
+    PARAM(P_WIDTH, Width);
+    PARAM(P_HEIGHT, Height);
+}
+
+EVENT(E_IPCPLAYERQUIT, IPCPlayerQuit)
+{
+
+}
+
+}

+ 16 - 0
Source/AtomicEditor/PlayerMode/AEPlayerMode.cpp

@@ -10,6 +10,7 @@
 #include <Atomic/Input/InputEvents.h>
 #include <Atomic/Input/InputEvents.h>
 #include <Atomic/Core/ProcessUtils.h>
 #include <Atomic/Core/ProcessUtils.h>
 #include <Atomic/Graphics/GraphicsEvents.h>
 #include <Atomic/Graphics/GraphicsEvents.h>
+#include <Atomic/Graphics/Graphics.h>
 #include <Atomic/Graphics/Camera.h>
 #include <Atomic/Graphics/Camera.h>
 #include <Atomic/UI/SystemUI/DebugHud.h>
 #include <Atomic/UI/SystemUI/DebugHud.h>
 #include <Atomic/UI/SystemUI/SystemUIEvents.h>
 #include <Atomic/UI/SystemUI/SystemUIEvents.h>
@@ -21,6 +22,8 @@
 #include <AtomicJS/Javascript/JSEvents.h>
 #include <AtomicJS/Javascript/JSEvents.h>
 #include <AtomicJS/Javascript/JSIPCEvents.h>
 #include <AtomicJS/Javascript/JSIPCEvents.h>
 
 
+#include "AEPlayerEvents.h"
+
 #include "AEPlayerMode.h"
 #include "AEPlayerMode.h"
 
 
 #ifdef ATOMIC_PLATFORM_WINDOWS
 #ifdef ATOMIC_PLATFORM_WINDOWS
@@ -43,6 +46,7 @@ PlayerMode::PlayerMode(Context* context) :
 
 
     SubscribeToEvent(E_LOGMESSAGE, HANDLER(PlayerMode, HandleLogMessage));
     SubscribeToEvent(E_LOGMESSAGE, HANDLER(PlayerMode, HandleLogMessage));
     SubscribeToEvent(E_JSERROR, HANDLER(PlayerMode, HandleJSError));
     SubscribeToEvent(E_JSERROR, HANDLER(PlayerMode, HandleJSError));
+    SubscribeToEvent(E_EXITREQUESTED, HANDLER(PlayerMode, HandleExitRequest));
 
 
     // BEGIN LICENSE MANAGEMENT
     // BEGIN LICENSE MANAGEMENT
     SubscribeToEvent(E_BEGINVIEWRENDER, HANDLER(PlayerMode, HandleViewRender));
     SubscribeToEvent(E_BEGINVIEWRENDER, HANDLER(PlayerMode, HandleViewRender));
@@ -235,5 +239,17 @@ void PlayerMode::HandleViewRender(StringHash eventType, VariantMap& eventData)
 
 
 }
 }
 
 
+void PlayerMode::HandleExitRequest(StringHash eventType, VariantMap& eventData)
+{
+    Graphics* graphics = GetSubsystem<Graphics>();
+    using namespace IPCPlayerWindow;
+    VariantMap data;
+    data[P_POSX] = graphics->GetWindowPosition().x_;
+    data[P_POSY] = graphics->GetWindowPosition().y_;
+    data[P_WIDTH] = graphics->GetWidth();
+    data[P_HEIGHT] = graphics->GetHeight();
+    ipc_->SendEventToBroker(E_IPCPLAYERWINDOW, data);
+    ipc_->SendEventToBroker(E_IPCPLAYEREXITREQUEST);
+}
 
 
 }
 }

+ 1 - 0
Source/AtomicEditor/PlayerMode/AEPlayerMode.h

@@ -41,6 +41,7 @@ private:
     void HandleLogMessage(StringHash eventType, VariantMap& eventData);
     void HandleLogMessage(StringHash eventType, VariantMap& eventData);
     void HandleIPCInitialize(StringHash eventType, VariantMap& eventData);
     void HandleIPCInitialize(StringHash eventType, VariantMap& eventData);
     void HandleViewRender(StringHash eventType, VariantMap& eventData);
     void HandleViewRender(StringHash eventType, VariantMap& eventData);
+    void HandleExitRequest(StringHash eventType, VariantMap& eventData);
 
 
 // BEGIN LICENSE MANAGEMENT
 // BEGIN LICENSE MANAGEMENT
     void HandleMessageAck(StringHash eventType, VariantMap& eventData);
     void HandleMessageAck(StringHash eventType, VariantMap& eventData);