[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)
This commit is contained in:
		
							parent
							
								
									7afdd14a4c
								
							
						
					
					
						commit
						651c5b35ca
					
				| @ -1,4 +1,5 @@ | |||||||
| #include "view_dispatcher_i.h" | #include "view_dispatcher_i.h" | ||||||
|  | #include "gui_i.h" | ||||||
| 
 | 
 | ||||||
| ViewDispatcher* view_dispatcher_alloc() { | ViewDispatcher* view_dispatcher_alloc() { | ||||||
|     ViewDispatcher* view_dispatcher = furi_alloc(sizeof(ViewDispatcher)); |     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); |     furi_assert(view); | ||||||
|     // Check if view id is not used and resgister view
 |     // Check if view id is not used and resgister view
 | ||||||
|     furi_check(ViewDict_get(view_dispatcher->views, view_id) == NULL); |     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); |     ViewDict_set_at(view_dispatcher->views, view_id, view); | ||||||
|     view_set_dispatcher(view, view_dispatcher); |     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) { | void view_dispatcher_remove_view(ViewDispatcher* view_dispatcher, uint32_t view_id) { | ||||||
|     furi_assert(view_dispatcher); |     furi_assert(view_dispatcher); | ||||||
| 
 | 
 | ||||||
|  |     // Lock gui
 | ||||||
|  |     if(view_dispatcher->gui) { | ||||||
|  |         gui_lock(view_dispatcher->gui); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     // Disable the view if it is active
 |     // Disable the view if it is active
 | ||||||
|     if(view_dispatcher->current_view == *ViewDict_get(view_dispatcher->views, view_id)) { |     if(view_dispatcher->current_view == *ViewDict_get(view_dispatcher->views, view_id)) { | ||||||
|         view_dispatcher_set_current_view(view_dispatcher, NULL); |         view_dispatcher_set_current_view(view_dispatcher, NULL); | ||||||
|     } |     } | ||||||
|     // Remove view
 |     // Remove view
 | ||||||
|     ViewDict_erase(view_dispatcher->views, view_id); |     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) { | void view_dispatcher_switch_to_view(ViewDispatcher* view_dispatcher, uint32_t view_id) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 SG
						SG