desktop_scene_main.c 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "../desktop_i.h"
  2. #include "../views/desktop_main.h"
  3. #include "applications.h"
  4. #define MAIN_VIEW_DEFAULT (0UL)
  5. static void desktop_switch_to_app(Desktop* desktop, const FlipperApplication* flipper_app) {
  6. furi_assert(desktop);
  7. furi_assert(flipper_app);
  8. furi_assert(flipper_app->app);
  9. furi_assert(flipper_app->name);
  10. if(furi_thread_get_state(desktop->scene_thread) != FuriThreadStateStopped) {
  11. FURI_LOG_E("Desktop", "Thread is already running");
  12. return;
  13. }
  14. furi_thread_set_name(desktop->scene_thread, flipper_app->name);
  15. furi_thread_set_stack_size(desktop->scene_thread, flipper_app->stack_size);
  16. furi_thread_set_callback(desktop->scene_thread, flipper_app->app);
  17. furi_thread_start(desktop->scene_thread);
  18. }
  19. void desktop_scene_main_callback(DesktopMainEvent event, void* context) {
  20. Desktop* desktop = (Desktop*)context;
  21. view_dispatcher_send_custom_event(desktop->view_dispatcher, event);
  22. }
  23. const void desktop_scene_main_on_enter(void* context) {
  24. Desktop* desktop = (Desktop*)context;
  25. DesktopMainView* main_view = desktop->main_view;
  26. desktop_main_set_callback(main_view, desktop_scene_main_callback, desktop);
  27. view_port_enabled_set(desktop->lock_viewport, false);
  28. if(scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneMain) ==
  29. DesktopMainEventUnlocked) {
  30. desktop_main_unlocked(desktop->main_view);
  31. }
  32. view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewMain);
  33. }
  34. const bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) {
  35. Desktop* desktop = (Desktop*)context;
  36. bool consumed = false;
  37. if(event.type == SceneManagerEventTypeCustom) {
  38. switch(event.event) {
  39. case DesktopMainEventOpenMenu:
  40. with_value_mutex(
  41. desktop->menu_vm, (Menu * menu) { menu_ok(menu); });
  42. consumed = true;
  43. break;
  44. case DesktopMainEventOpenLockMenu:
  45. scene_manager_next_scene(desktop->scene_manager, DesktopSceneLockMenu);
  46. consumed = true;
  47. break;
  48. case DesktopMainEventOpenDebug:
  49. scene_manager_next_scene(desktop->scene_manager, DesktopViewDebug);
  50. consumed = true;
  51. break;
  52. case DesktopMainEventOpenArchive:
  53. desktop_switch_to_app(desktop, &FLIPPER_ARCHIVE);
  54. consumed = true;
  55. break;
  56. case DesktopMainEventOpenFavorite:
  57. desktop_settings_load(&desktop->settings);
  58. desktop_switch_to_app(desktop, &FLIPPER_APPS[desktop->settings.favorite]);
  59. consumed = true;
  60. break;
  61. default:
  62. break;
  63. }
  64. }
  65. return consumed;
  66. }
  67. const void desktop_scene_main_on_exit(void* context) {
  68. Desktop* desktop = (Desktop*)context;
  69. scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneMain, MAIN_VIEW_DEFAULT);
  70. desktop_main_reset_hint(desktop->main_view);
  71. }