Selaa lähdekoodia

[FL-960] View dispatcher: lock gui when the view tree changes (#369)

* View dispatcher: lock gui when the view tree changes

* View dispatcher: include gui interface

* View dispatcher: lock gui also when view added (view_dispatcher_add_view fn)
SG 5 vuotta sitten
vanhempi
commit
651c5b35ca
1 muutettua tiedostoa jossa 22 lisäystä ja 0 poistoa
  1. 22 0
      applications/gui/view_dispatcher.c

+ 22 - 0
applications/gui/view_dispatcher.c

@@ -1,4 +1,5 @@
 #include "view_dispatcher_i.h"
+#include "gui_i.h"
 
 ViewDispatcher* view_dispatcher_alloc() {
     ViewDispatcher* view_dispatcher = furi_alloc(sizeof(ViewDispatcher));
@@ -38,19 +39,40 @@ void view_dispatcher_add_view(ViewDispatcher* view_dispatcher, uint32_t view_id,
     furi_assert(view);
     // Check if view id is not used and resgister view
     furi_check(ViewDict_get(view_dispatcher->views, view_id) == NULL);
+
+    // Lock gui
+    if(view_dispatcher->gui) {
+        gui_lock(view_dispatcher->gui);
+    }
+
     ViewDict_set_at(view_dispatcher->views, view_id, view);
     view_set_dispatcher(view, view_dispatcher);
+
+    // Unlock gui
+    if(view_dispatcher->gui) {
+        gui_unlock(view_dispatcher->gui);
+    }
 }
 
 void view_dispatcher_remove_view(ViewDispatcher* view_dispatcher, uint32_t view_id) {
     furi_assert(view_dispatcher);
 
+    // Lock gui
+    if(view_dispatcher->gui) {
+        gui_lock(view_dispatcher->gui);
+    }
+
     // Disable the view if it is active
     if(view_dispatcher->current_view == *ViewDict_get(view_dispatcher->views, view_id)) {
         view_dispatcher_set_current_view(view_dispatcher, NULL);
     }
     // Remove view
     ViewDict_erase(view_dispatcher->views, view_id);
+
+    // Unlock gui
+    if(view_dispatcher->gui) {
+        gui_unlock(view_dispatcher->gui);
+    }
 }
 
 void view_dispatcher_switch_to_view(ViewDispatcher* view_dispatcher, uint32_t view_id) {