From 137a31f0f6964274916ce274f70bc0837f812a84 Mon Sep 17 00:00:00 2001 From: nminaylov Date: Fri, 19 Apr 2024 20:06:28 +0300 Subject: [PATCH] Using view_holder instead of view_dispatcher --- applications/services/gui/application.fam | 1 + .../system/js_app/modules/js_submenu.c | 38 +++++++++---------- targets/f18/api_symbols.csv | 13 ++++++- targets/f7/api_symbols.csv | 13 ++++++- 4 files changed, 44 insertions(+), 21 deletions(-) diff --git a/applications/services/gui/application.fam b/applications/services/gui/application.fam index 869d964dd01..b7dd18baa11 100644 --- a/applications/services/gui/application.fam +++ b/applications/services/gui/application.fam @@ -16,6 +16,7 @@ App( "elements.h", "view_dispatcher.h", "view_stack.h", + "view_holder.h", "modules/button_menu.h", "modules/byte_input.h", "modules/popup.h", diff --git a/applications/system/js_app/modules/js_submenu.c b/applications/system/js_app/modules/js_submenu.c index d66a7d24dc7..058b32fd091 100644 --- a/applications/system/js_app/modules/js_submenu.c +++ b/applications/system/js_app/modules/js_submenu.c @@ -1,11 +1,13 @@ #include -#include +#include #include +#include #include "../js_modules.h" typedef struct { Submenu* submenu; - ViewDispatcher* view_dispatcher; + ViewHolder* view_holder; + FuriApiLock lock; uint32_t result; bool accepted; } JsSubmenuInst; @@ -35,15 +37,14 @@ static void submenu_callback(void* context, uint32_t id) { JsSubmenuInst* submenu = context; submenu->result = id; submenu->accepted = true; - view_dispatcher_stop(submenu->view_dispatcher); + api_lock_unlock(submenu->lock); } -static bool submenu_exit(void* context) { +static void submenu_exit(void* context) { JsSubmenuInst* submenu = context; submenu->result = 0; submenu->accepted = false; - view_dispatcher_stop(submenu->view_dispatcher); - return true; + api_lock_unlock(submenu->lock); } static void js_submenu_add_item(struct mjs* mjs) { @@ -89,21 +90,20 @@ static void js_submenu_show(struct mjs* mjs) { JsSubmenuInst* submenu = get_this_ctx(mjs); if(!check_arg_count(mjs, 0)) return; + submenu->lock = api_lock_alloc_locked(); Gui* gui = furi_record_open(RECORD_GUI); - submenu->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(submenu->view_dispatcher); - view_dispatcher_add_view(submenu->view_dispatcher, 0, submenu_get_view(submenu->submenu)); - view_dispatcher_set_event_callback_context(submenu->view_dispatcher, submenu); - view_dispatcher_set_navigation_event_callback(submenu->view_dispatcher, submenu_exit); - view_dispatcher_attach_to_gui(submenu->view_dispatcher, gui, ViewDispatcherTypeFullscreen); - view_dispatcher_switch_to_view(submenu->view_dispatcher, 0); - - view_dispatcher_run(submenu->view_dispatcher); - - view_dispatcher_remove_view(submenu->view_dispatcher, 0); - view_dispatcher_free(submenu->view_dispatcher); - submenu->view_dispatcher = NULL; + submenu->view_holder = view_holder_alloc(); + view_holder_attach_to_gui(submenu->view_holder, gui); + view_holder_set_back_callback(submenu->view_holder, submenu_exit, submenu); + + view_holder_set_view(submenu->view_holder, submenu_get_view(submenu->submenu)); + view_holder_start(submenu->view_holder); + api_lock_wait_unlock(submenu->lock); + + view_holder_stop(submenu->view_holder); + view_holder_free(submenu->view_holder); furi_record_close(RECORD_GUI); + api_lock_free(submenu->lock); submenu_reset(submenu->submenu); if(submenu->accepted) { diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index 7cc7639bd41..769310b695d 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,61.1,, +Version,+,61.2,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -27,6 +27,7 @@ Header,+,applications/services/gui/modules/variable_item_list.h,, Header,+,applications/services/gui/modules/widget.h,, Header,+,applications/services/gui/modules/widget_elements/widget_element.h,, Header,+,applications/services/gui/view_dispatcher.h,, +Header,+,applications/services/gui/view_holder.h,, Header,+,applications/services/gui/view_stack.h,, Header,+,applications/services/input/input.h,, Header,+,applications/services/loader/firmware_api/firmware_api.h,, @@ -2680,6 +2681,16 @@ Function,+,view_dispatcher_switch_to_view,void,"ViewDispatcher*, uint32_t" Function,+,view_free,void,View* Function,+,view_free_model,void,View* Function,+,view_get_model,void*,View* +Function,+,view_holder_alloc,ViewHolder*, +Function,+,view_holder_attach_to_gui,void,"ViewHolder*, Gui*" +Function,+,view_holder_free,void,ViewHolder* +Function,+,view_holder_get_free_context,void*,ViewHolder* +Function,+,view_holder_set_back_callback,void,"ViewHolder*, BackCallback, void*" +Function,+,view_holder_set_free_callback,void,"ViewHolder*, FreeCallback, void*" +Function,+,view_holder_set_view,void,"ViewHolder*, View*" +Function,+,view_holder_start,void,ViewHolder* +Function,+,view_holder_stop,void,ViewHolder* +Function,+,view_holder_update,void,"View*, void*" Function,+,view_port_alloc,ViewPort*, Function,+,view_port_draw_callback_set,void,"ViewPort*, ViewPortDrawCallback, void*" Function,+,view_port_enabled_set,void,"ViewPort*, _Bool" diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 727a512c909..1407ceced7a 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,61.1,, +Version,+,61.2,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, @@ -28,6 +28,7 @@ Header,+,applications/services/gui/modules/variable_item_list.h,, Header,+,applications/services/gui/modules/widget.h,, Header,+,applications/services/gui/modules/widget_elements/widget_element.h,, Header,+,applications/services/gui/view_dispatcher.h,, +Header,+,applications/services/gui/view_holder.h,, Header,+,applications/services/gui/view_stack.h,, Header,+,applications/services/input/input.h,, Header,+,applications/services/loader/firmware_api/firmware_api.h,, @@ -3480,6 +3481,16 @@ Function,+,view_dispatcher_switch_to_view,void,"ViewDispatcher*, uint32_t" Function,+,view_free,void,View* Function,+,view_free_model,void,View* Function,+,view_get_model,void*,View* +Function,+,view_holder_alloc,ViewHolder*, +Function,+,view_holder_attach_to_gui,void,"ViewHolder*, Gui*" +Function,+,view_holder_free,void,ViewHolder* +Function,+,view_holder_get_free_context,void*,ViewHolder* +Function,+,view_holder_set_back_callback,void,"ViewHolder*, BackCallback, void*" +Function,+,view_holder_set_free_callback,void,"ViewHolder*, FreeCallback, void*" +Function,+,view_holder_set_view,void,"ViewHolder*, View*" +Function,+,view_holder_start,void,ViewHolder* +Function,+,view_holder_stop,void,ViewHolder* +Function,+,view_holder_update,void,"View*, void*" Function,+,view_port_alloc,ViewPort*, Function,+,view_port_draw_callback_set,void,"ViewPort*, ViewPortDrawCallback, void*" Function,+,view_port_enabled_set,void,"ViewPort*, _Bool"