Index: binaries/data/mods/public/gui/session/input.js =================================================================== --- binaries/data/mods/public/gui/session/input.js +++ binaries/data/mods/public/gui/session/input.js @@ -239,9 +239,7 @@ // thus the most specific should appear first. let actionInfo = undefined; - // Disable preselected actions on the minimap because their - // left-click interferes with the minimap left-click anyways. - if (preSelectedAction != ACTION_NONE && !fromMiniMap) + if (preSelectedAction != ACTION_NONE) { for (let action of g_UnitActionsSortedKeys) if (g_UnitActions[action].preSelectedActionCheck) Index: binaries/data/mods/public/gui/session/minimap/MiniMap.js =================================================================== --- binaries/data/mods/public/gui/session/minimap/MiniMap.js +++ binaries/data/mods/public/gui/session/minimap/MiniMap.js @@ -12,19 +12,42 @@ this.mouseIsOverMiniMap = false; } - onWorldClick(target) + onWorldClick(target, button) { - if (!controlsPlayer(g_ViewedPlayer)) - return false; - // Partly duplicated from handleInputAfterGui(), but with the input being // world coordinates instead of screen coordinates. + if (button == SDL_BUTTON_LEFT) + { + if (inputState != INPUT_PRESELECTEDACTION || preSelectedAction == ACTION_NONE) + return false; + } + else if (button == SDL_BUTTON_RIGHT) + { + if (inputState == INPUT_PRESELECTEDACTION) + { + preSelectedAction = ACTION_NONE; + inputState = INPUT_NORMAL; + return true; + } + else if (inputState != INPUT_NORMAL) + return false; + } + else + return false; - if (inputState != INPUT_NORMAL) + + if (!controlsPlayer(g_ViewedPlayer)) return false; let action = determineAction(undefined, undefined, true); - return action && handleUnitAction(target, action); + if (!action) + return false; + if (button == SDL_BUTTON_LEFT && !Engine.HotkeyIsPressed("session.queue")) + { + preSelectedAction = ACTION_NONE; + inputState = INPUT_NORMAL; + } + return handleUnitAction(target, action); } onMouseEnter() Index: source/gui/ObjectBases/IGUIObject.h =================================================================== --- source/gui/ObjectBases/IGUIObject.h +++ source/gui/ObjectBases/IGUIObject.h @@ -385,6 +385,17 @@ /** * Execute the script for a particular action. * Does nothing if no script has been registered for that action. + * The mouse coordinates will be passed as the first argument. + * + * @param eventName Name of action + * + * @return True if the script returned something truthy. + */ + bool ScriptEventWithReturn(const CStr& eventName); + + /** + * Execute the script for a particular action. + * Does nothing if no script has been registered for that action. * * @param eventName Name of action * @param paramData JS::HandleValueArray arguments to pass to the event. @@ -392,6 +403,17 @@ void ScriptEvent(const CStr& eventName, const JS::HandleValueArray& paramData); /** + * Execute the script for a particular action. + * Does nothing if no script has been registered for that action. + * + * @param eventName Name of action + * @param paramData JS::HandleValueArray arguments to pass to the event. + * + * @return True if the script returned something truthy. + */ + bool ScriptEventWithReturn(const CStr& eventName, const JS::HandleValueArray& paramData); + + /** * Assigns a JS function to the event name. */ void SetScriptHandler(const CStr& eventName, JS::HandleObject Function); Index: source/gui/ObjectBases/IGUIObject.cpp =================================================================== --- source/gui/ObjectBases/IGUIObject.cpp +++ source/gui/ObjectBases/IGUIObject.cpp @@ -21,6 +21,7 @@ #include "gui/CGUI.h" #include "gui/CGUISetting.h" +#include "js/Conversions.h" #include "ps/CLogger.h" #include "ps/GameSetup/Config.h" #include "ps/Profile.h" @@ -397,20 +398,30 @@ void IGUIObject::ScriptEvent(const CStr& eventName) { + ScriptEventWithReturn(eventName); +} + +bool IGUIObject::ScriptEventWithReturn(const CStr& eventName) +{ if (m_ScriptHandlers.find(eventName) == m_ScriptHandlers.end()) - return; + return false; JSContext* cx = m_pGUI.GetScriptInterface()->GetContext(); JSAutoRequest rq(cx); JS::AutoValueVector paramData(cx); - ScriptEvent(eventName, paramData); + return ScriptEventWithReturn(eventName, paramData); } void IGUIObject::ScriptEvent(const CStr& eventName, const JS::HandleValueArray& paramData) { + ScriptEventWithReturn(eventName, paramData); +} + +bool IGUIObject::ScriptEventWithReturn(const CStr& eventName, const JS::HandleValueArray& paramData) +{ std::map >::iterator it = m_ScriptHandlers.find(eventName); if (it == m_ScriptHandlers.end()) - return; + return false; JSContext* cx = m_pGUI.GetScriptInterface()->GetContext(); JSAutoRequest rq(cx); @@ -419,7 +430,11 @@ JS::RootedValue result(cx); if (!JS_CallFunctionValue(cx, obj, handlerVal, paramData, &result)) + { JS_ReportError(cx, "Errors executing script event \"%s\"", eventName.c_str()); + return false; + } + return JS::ToBoolean(result); } void IGUIObject::CreateJSObject() Index: source/gui/ObjectTypes/CMiniMap.h =================================================================== --- source/gui/ObjectTypes/CMiniMap.h +++ source/gui/ObjectTypes/CMiniMap.h @@ -56,7 +56,7 @@ void SetCameraPos(); - void FireWorldClickEvent(int button, int clicks); + bool FireWorldClickEvent(int button, int clicks); static const CStr EventNameWorldClick; Index: source/gui/ObjectTypes/CMiniMap.cpp =================================================================== --- source/gui/ObjectTypes/CMiniMap.cpp +++ source/gui/ObjectTypes/CMiniMap.cpp @@ -149,8 +149,11 @@ case GUIM_MOUSE_PRESS_LEFT: if (m_MouseHovering) { - SetCameraPos(); - m_Clicking = true; + if (!CMiniMap::FireWorldClickEvent(SDL_BUTTON_LEFT, 1)) + { + SetCameraPos(); + m_Clicking = true; + } } break; case GUIM_MOUSE_RELEASE_LEFT: @@ -237,7 +240,7 @@ return -atan2(cameraIn.X, cameraIn.Z); } -void CMiniMap::FireWorldClickEvent(int UNUSED(button), int UNUSED(clicks)) +bool CMiniMap::FireWorldClickEvent(int button, int UNUSED(clicks)) { JSContext* cx = g_GUI->GetActiveGUI()->GetScriptInterface()->GetContext(); JSAutoRequest rq(cx); @@ -248,10 +251,14 @@ JS::RootedValue coords(cx); ScriptInterface::CreateObject(cx, &coords, "x", x, "z", z); + JS::RootedValue buttonJs(cx); + ScriptInterface::ToJSVal(cx, &buttonJs, button); + JS::AutoValueVector paramData(cx); paramData.append(coords); + paramData.append(buttonJs); - ScriptEvent(EventNameWorldClick, paramData); + return ScriptEventWithReturn(EventNameWorldClick, paramData); } // This sets up and draws the rectangle on the minimap