Просмотр исходного кода

free views before starting game thread

jblanked 9 месяцев назад
Родитель
Сommit
f2e38ffb33
3 измененных файлов с 76 добавлено и 25 удалено
  1. 53 23
      alloc/alloc.c
  2. 3 2
      alloc/alloc.h
  3. 20 0
      callback/callback.c

+ 53 - 23
alloc/alloc.c

@@ -22,6 +22,58 @@ void flip_world_show_submenu()
     }
 }
 
+bool alloc_view_loader(void *context)
+{
+    FlipWorldApp *app = (FlipWorldApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipWorldApp is NULL");
+        return false;
+    }
+    if (!app->view_loader)
+    {
+        if (!easy_flipper_set_view(&app->view_loader, FlipWorldViewLoader, loader_draw_callback, NULL, callback_to_submenu, &app->view_dispatcher, app))
+        {
+            return false;
+        }
+        loader_init(app->view_loader);
+    }
+    if (!app->widget_result)
+    {
+        if (!easy_flipper_set_widget(&app->widget_result, FlipWorldViewWidgetResult, "", callback_to_submenu, &app->view_dispatcher))
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
+void free_view_loader(void *context)
+{
+    FlipWorldApp *app = (FlipWorldApp *)context;
+    if (!app)
+    {
+        FURI_LOG_E(TAG, "FlipWorldApp is NULL");
+        return;
+    }
+    // Free Widget(s)
+    if (app->widget_result)
+    {
+        view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewWidgetResult);
+        widget_free(app->widget_result);
+        app->widget_result = NULL;
+    }
+
+    // Free View(s)
+    if (app->view_loader)
+    {
+        view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewLoader);
+        loader_free_model(app->view_loader);
+        view_free(app->view_loader);
+        app->view_loader = NULL;
+    }
+}
+
 // Function to allocate resources for the FlipWorldApp
 FlipWorldApp *flip_world_app_alloc()
 {
@@ -36,16 +88,6 @@ FlipWorldApp *flip_world_app_alloc()
         return NULL;
     }
     view_dispatcher_set_custom_event_callback(app->view_dispatcher, custom_event_callback);
-    // Main view
-    if (!easy_flipper_set_view(&app->view_loader, FlipWorldViewLoader, loader_draw_callback, NULL, callback_to_submenu, &app->view_dispatcher, app))
-    {
-        return NULL;
-    }
-    loader_init(app->view_loader);
-    if (!easy_flipper_set_widget(&app->widget_result, FlipWorldViewWidgetResult, "", callback_to_submenu, &app->view_dispatcher))
-    {
-        return NULL;
-    }
 
     // Submenu
     if (!easy_flipper_set_submenu(&app->submenu, FlipWorldViewSubmenu, VERSION_TAG, callback_exit_app, &app->view_dispatcher))
@@ -90,20 +132,8 @@ void flip_world_app_free(FlipWorldApp *app)
         view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewGameSubmenu);
         submenu_free(app->submenu_game);
     }
-    // Free Widget(s)
-    if (app->widget_result)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewWidgetResult);
-        widget_free(app->widget_result);
-    }
 
-    // Free View(s)
-    if (app->view_loader)
-    {
-        view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewLoader);
-        loader_free_model(app->view_loader);
-        view_free(app->view_loader);
-    }
+    free_view_loader(app);
 
     free_all_views(app, true, true);
 

+ 3 - 2
alloc/alloc.h

@@ -1,6 +1,7 @@
 #pragma once
 #include <flip_world.h>
-
 FlipWorldApp *flip_world_app_alloc();
 void flip_world_app_free(FlipWorldApp *app);
-void flip_world_show_submenu();
+void flip_world_show_submenu();
+bool alloc_view_loader(void *context);
+void free_view_loader(void *context);

+ 20 - 0
callback/callback.c

@@ -799,6 +799,9 @@ void free_all_views(void *context, bool should_free_variable_item_list, bool sho
         free_submenu_settings(app);
         free_submenu_lobby(app);
     }
+
+    // free Derek's loader
+    free_view_loader(app);
 }
 static bool fetch_world_list(FlipperHTTP *fhttp)
 {
@@ -924,6 +927,13 @@ static bool start_game_thread(void *context)
         return false;
     }
 
+    // free everything but message_view
+    free_variable_item_list(app);
+    free_text_input_view(app);
+    free_submenu_settings(app);
+    free_submenu_lobby(app);
+    free_view_loader(app);
+
     // free game thread
     if (game_thread_running)
     {
@@ -1236,6 +1246,11 @@ static char *_parse_game(DataLoaderModel *model)
 }
 static void switch_to_view_get_game(FlipWorldApp *app)
 {
+    if (!alloc_view_loader(app))
+    {
+        FURI_LOG_E(TAG, "Failed to allocate view loader");
+        return;
+    }
     generic_switch_to_view(app, "Starting Game..", _fetch_game, _parse_game, 5, callback_to_submenu, FlipWorldViewLoader);
 }
 static void run(FlipWorldApp *app)
@@ -1980,6 +1995,11 @@ static char *_parse_worlds(DataLoaderModel *model)
 }
 static void switch_to_view_get_worlds(FlipWorldApp *app)
 {
+    if (!alloc_view_loader(app))
+    {
+        FURI_LOG_E(TAG, "Failed to allocate view loader");
+        return;
+    }
     generic_switch_to_view(app, "Fetching World Pack..", _fetch_worlds, _parse_worlds, 1, callback_to_submenu, FlipWorldViewLoader);
 }
 static void game_settings_select(void *context, uint32_t index)