mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-07-28 03:12:19 +00:00
Support assigning functions to hotkeys from the JS GUI without involving a GUI object.
Allows developers and modders to register and unregister hotkeys without having to specify, change or overwrite XML files. Also allows implementing the main menu GUI page with only GUI objects for one submenu, refs #5387 / D2240. Differential Revision: https://code.wildfiregames.com/D2260 Idea by nani in D2257. This was SVN commit r22851.
This commit is contained in:
@@ -71,6 +71,18 @@ InReaction CGUI::HandleEvent(const SDL_Event_* ev)
|
||||
{
|
||||
const char* hotkey = static_cast<const char*>(ev->ev.user.data1);
|
||||
|
||||
if (m_GlobalHotkeys.count(hotkey))
|
||||
{
|
||||
HotkeyInputHandler(ev);
|
||||
ret = IN_HANDLED;
|
||||
|
||||
JSContext* cx = m_ScriptInterface->GetContext();
|
||||
JSAutoRequest rq(cx);
|
||||
JS::RootedObject globalObj(cx, &GetGlobalObject().toObject());
|
||||
JS::RootedValue result(cx);
|
||||
JS_CallFunctionValue(cx, globalObj, m_GlobalHotkeys[hotkey], JS::HandleValueArray::empty(), &result);
|
||||
}
|
||||
|
||||
std::map<CStr, std::vector<IGUIObject*> >::iterator it = m_HotkeyObjects.find(hotkey);
|
||||
if (it != m_HotkeyObjects.end())
|
||||
for (IGUIObject* const& obj : it->second)
|
||||
@@ -488,6 +500,32 @@ void CGUI::UnsetObjectHotkey(IGUIObject* pObject, const CStr& hotkeyTag)
|
||||
assignment.end());
|
||||
}
|
||||
|
||||
void CGUI::SetGlobalHotkey(const CStr& hotkeyTag, JS::HandleValue function)
|
||||
{
|
||||
JSContext* cx = m_ScriptInterface->GetContext();
|
||||
JSAutoRequest rq(cx);
|
||||
|
||||
if (hotkeyTag.empty())
|
||||
{
|
||||
JS_ReportError(cx, "Cannot assign a function to an empty hotkey identifier!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!function.isObject() || !JS_ObjectIsFunction(cx, &function.toObject()))
|
||||
{
|
||||
JS_ReportError(cx, "Cannot assign non-function value to global hotkey '%s'", hotkeyTag.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
UnsetGlobalHotkey(hotkeyTag);
|
||||
m_GlobalHotkeys[hotkeyTag].init(cx, function);
|
||||
}
|
||||
|
||||
void CGUI::UnsetGlobalHotkey(const CStr& hotkeyTag)
|
||||
{
|
||||
m_GlobalHotkeys.erase(hotkeyTag);
|
||||
}
|
||||
|
||||
const SGUIScrollBarStyle* CGUI::GetScrollBarStyle(const CStr& style) const
|
||||
{
|
||||
std::map<CStr, const SGUIScrollBarStyle>::const_iterator it = m_ScrollBarStyles.find(style);
|
||||
|
||||
Reference in New Issue
Block a user