Rollback gui update visibility check, fixes gui thread lockup. (#340)
This commit is contained in:
		
							parent
							
								
									23f66c2cdd
								
							
						
					
					
						commit
						48191ea20a
					
				| @ -14,21 +14,9 @@ ViewPort* gui_view_port_find_enabled(ViewPortArray_t array) { | |||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void gui_update(Gui* gui, ViewPort* view_port) { | void gui_update(Gui* gui) { | ||||||
|     furi_assert(gui); |     furi_assert(gui); | ||||||
|     if(view_port) { |  | ||||||
|         // Visibility check
 |  | ||||||
|         gui_lock(gui); |  | ||||||
|         for(size_t i = 0; i < GuiLayerMAX; i++) { |  | ||||||
|             if(gui_view_port_find_enabled(gui->layers[i]) == view_port) { |  | ||||||
|     osThreadFlagsSet(gui->thread, GUI_THREAD_FLAG_DRAW); |     osThreadFlagsSet(gui->thread, GUI_THREAD_FLAG_DRAW); | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         gui_unlock(gui); |  | ||||||
|     } else { |  | ||||||
|         osThreadFlagsSet(gui->thread, GUI_THREAD_FLAG_DRAW); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void gui_input_events_callback(const void* value, void* ctx) { | void gui_input_events_callback(const void* value, void* ctx) { | ||||||
| @ -206,7 +194,7 @@ void gui_add_view_port(Gui* gui, ViewPort* view_port, GuiLayer layer) { | |||||||
|     view_port_gui_set(view_port, gui); |     view_port_gui_set(view_port, gui); | ||||||
|     gui_unlock(gui); |     gui_unlock(gui); | ||||||
| 
 | 
 | ||||||
|     gui_update(gui, NULL); |     gui_update(gui); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void gui_remove_view_port(Gui* gui, ViewPort* view_port) { | void gui_remove_view_port(Gui* gui, ViewPort* view_port) { | ||||||
| @ -297,10 +285,8 @@ Gui* gui_alloc() { | |||||||
|     Gui* gui = furi_alloc(sizeof(Gui)); |     Gui* gui = furi_alloc(sizeof(Gui)); | ||||||
|     // Thread ID
 |     // Thread ID
 | ||||||
|     gui->thread = osThreadGetId(); |     gui->thread = osThreadGetId(); | ||||||
|     gui->mutex_attr.name = "mtx_gui"; |  | ||||||
|     gui->mutex_attr.attr_bits |= osMutexRecursive; |  | ||||||
|     // Allocate mutex
 |     // Allocate mutex
 | ||||||
|     gui->mutex = osMutexNew(&gui->mutex_attr); |     gui->mutex = osMutexNew(NULL); | ||||||
|     furi_check(gui->mutex); |     furi_check(gui->mutex); | ||||||
|     // Layers
 |     // Layers
 | ||||||
|     for(size_t i = 0; i < GuiLayerMAX; i++) { |     for(size_t i = 0; i < GuiLayerMAX; i++) { | ||||||
|  | |||||||
| @ -34,7 +34,6 @@ ARRAY_DEF(ViewPortArray, ViewPort*, M_PTR_OPLIST); | |||||||
| struct Gui { | struct Gui { | ||||||
|     // Thread and lock
 |     // Thread and lock
 | ||||||
|     osThreadId_t thread; |     osThreadId_t thread; | ||||||
|     osMutexAttr_t mutex_attr; |  | ||||||
|     osMutexId_t mutex; |     osMutexId_t mutex; | ||||||
|     // Layers and Canvas
 |     // Layers and Canvas
 | ||||||
|     ViewPortArray_t layers[GuiLayerMAX]; |     ViewPortArray_t layers[GuiLayerMAX]; | ||||||
| @ -51,12 +50,9 @@ struct Gui { | |||||||
| ViewPort* gui_view_port_find_enabled(ViewPortArray_t array); | ViewPort* gui_view_port_find_enabled(ViewPortArray_t array); | ||||||
| 
 | 
 | ||||||
| /* Update GUI, request redraw
 | /* Update GUI, request redraw
 | ||||||
|  * Real redraw event will be issued only if view_port is currently visible |  | ||||||
|  * Setting view_port to NULL forces redraw, but must be avoided |  | ||||||
|  * @param gui, Gui instance |  * @param gui, Gui instance | ||||||
|  * @param view_port, ViewPort instance or NULL |  | ||||||
|  */ |  */ | ||||||
| void gui_update(Gui* gui, ViewPort* view_port); | void gui_update(Gui* gui); | ||||||
| 
 | 
 | ||||||
| void gui_input_events_callback(const void* value, void* ctx); | void gui_input_events_callback(const void* value, void* ctx); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -43,7 +43,7 @@ void view_port_enabled_set(ViewPort* view_port, bool enabled) { | |||||||
|     furi_assert(view_port); |     furi_assert(view_port); | ||||||
|     if(view_port->is_enabled != enabled) { |     if(view_port->is_enabled != enabled) { | ||||||
|         view_port->is_enabled = enabled; |         view_port->is_enabled = enabled; | ||||||
|         if(view_port->gui) gui_update(view_port->gui, NULL); |         if(view_port->gui) gui_update(view_port->gui); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -69,7 +69,7 @@ void view_port_input_callback_set( | |||||||
| 
 | 
 | ||||||
| void view_port_update(ViewPort* view_port) { | void view_port_update(ViewPort* view_port) { | ||||||
|     furi_assert(view_port); |     furi_assert(view_port); | ||||||
|     if(view_port->gui && view_port->is_enabled) gui_update(view_port->gui, view_port); |     if(view_port->gui && view_port->is_enabled) gui_update(view_port->gui); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void view_port_gui_set(ViewPort* view_port, Gui* gui) { | void view_port_gui_set(ViewPort* view_port, Gui* gui) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく