diff --git a/applications/system/js_app/examples/apps/Scripts/gui.js b/applications/system/js_app/examples/apps/Scripts/gui.js index ea342e02a8..10e88b6496 100644 --- a/applications/system/js_app/examples/apps/Scripts/gui.js +++ b/applications/system/js_app/examples/apps/Scripts/gui.js @@ -105,9 +105,13 @@ eventLoop.subscribe(views.bytekb.input, function (_sub, data, gui, views) { }, gui, views); // go to the demo chooser screen when the back key is pressed -eventLoop.subscribe(gui.viewDispatcher.navigation, function (_sub, _, gui, views) { +eventLoop.subscribe(gui.viewDispatcher.navigation, function (_sub, _, gui, views, eventLoop) { + if (gui.viewDispatcher.currentView === views.demos) { + eventLoop.stop(); + return; + } gui.viewDispatcher.switchTo(views.demos); -}, gui, views); +}, gui, views, eventLoop); // run UI gui.viewDispatcher.switchTo(views.demos); diff --git a/applications/system/js_app/modules/js_gui/js_gui.c b/applications/system/js_app/modules/js_gui/js_gui.c index 011f404e97..4bd4ccc31b 100644 --- a/applications/system/js_app/modules/js_gui/js_gui.c +++ b/applications/system/js_app/modules/js_gui/js_gui.c @@ -101,8 +101,10 @@ static void js_gui_vd_switch_to(struct mjs* mjs) { mjs_val_t view; JS_FETCH_ARGS_OR_RETURN(mjs, JS_EXACTLY, JS_ARG_OBJ(&view)); JsGuiViewData* view_data = JS_GET_INST(mjs, view); - JsGui* module = JS_GET_CONTEXT(mjs); + mjs_val_t vd_obj = mjs_get_this(mjs); + JsGui* module = JS_GET_INST(mjs, vd_obj); view_dispatcher_switch_to_view(module->dispatcher, (uint32_t)view_data->id); + mjs_set(mjs, vd_obj, "currentView", ~0, view); } static void* js_gui_create(struct mjs* mjs, mjs_val_t* object, JsModules* modules) { @@ -154,6 +156,7 @@ static void* js_gui_create(struct mjs* mjs, mjs_val_t* object, JsModules* module JS_FIELD("switchTo", MJS_MK_FN(js_gui_vd_switch_to)); JS_FIELD("custom", mjs_mk_foreign(mjs, &module->custom_contract)); JS_FIELD("navigation", mjs_mk_foreign(mjs, &module->navigation_contract)); + JS_FIELD("currentView", MJS_NULL); } // create API object diff --git a/applications/system/js_app/types/gui/index.d.ts b/applications/system/js_app/types/gui/index.d.ts index 3f95ab7806..85f1910599 100644 --- a/applications/system/js_app/types/gui/index.d.ts +++ b/applications/system/js_app/types/gui/index.d.ts @@ -20,6 +20,10 @@ declare class ViewDispatcher { * Event source for navigation events (back key presses) */ navigation: Contract; + /** + * View object currently shown + */ + currentView: View; /** * Sends a number to the custom event handler * @param event number to send