GUI: GuiApi isolation
This commit is contained in:
		
							parent
							
								
									491343b683
								
							
						
					
					
						commit
						f0800e579f
					
				| @ -15,6 +15,7 @@ | |||||||
| ARRAY_DEF(WidgetArray, Widget*, M_PTR_OPLIST); | ARRAY_DEF(WidgetArray, Widget*, M_PTR_OPLIST); | ||||||
| 
 | 
 | ||||||
| struct Gui { | struct Gui { | ||||||
|  |     GuiApi api; | ||||||
|     GuiEvent* event; |     GuiEvent* event; | ||||||
|     CanvasApi* canvas_api; |     CanvasApi* canvas_api; | ||||||
|     WidgetArray_t widgets_status_bar; |     WidgetArray_t widgets_status_bar; | ||||||
| @ -25,39 +26,37 @@ struct Gui { | |||||||
| 
 | 
 | ||||||
| void gui_add_widget(GuiApi* gui_api, Widget* widget, WidgetLayer layer) { | void gui_add_widget(GuiApi* gui_api, Widget* widget, WidgetLayer layer) { | ||||||
|     assert(gui_api); |     assert(gui_api); | ||||||
|     assert(gui_api->gui); |     assert(widget); | ||||||
|  |     Gui* gui = (Gui*)gui_api; | ||||||
| 
 | 
 | ||||||
|     // TODO add mutex on widget array
 |     // TODO add mutex on widget array
 | ||||||
| 
 |  | ||||||
|     WidgetArray_t* widget_array = NULL; |     WidgetArray_t* widget_array = NULL; | ||||||
| 
 | 
 | ||||||
|     switch(layer) { |     switch(layer) { | ||||||
|     case WidgetLayerStatusBar: |     case WidgetLayerStatusBar: | ||||||
|         widget_array = &gui_api->gui->widgets_status_bar; |         widget_array = &gui->widgets_status_bar; | ||||||
|         break; |         break; | ||||||
|     case WidgetLayerMain: |     case WidgetLayerMain: | ||||||
|         widget_array = &gui_api->gui->widgets; |         widget_array = &gui->widgets; | ||||||
|         break; |         break; | ||||||
|     case WidgetLayerFullscreen: |     case WidgetLayerFullscreen: | ||||||
|         widget_array = &gui_api->gui->widgets_fs; |         widget_array = &gui->widgets_fs; | ||||||
|         break; |         break; | ||||||
|     case WidgetLayerDialog: |     case WidgetLayerDialog: | ||||||
|         widget_array = &gui_api->gui->widgets_dialog; |         widget_array = &gui->widgets_dialog; | ||||||
|         break; |         break; | ||||||
| 
 |  | ||||||
|     default: |     default: | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     assert(widget); |  | ||||||
|     assert(widget_array); |     assert(widget_array); | ||||||
| 
 | 
 | ||||||
|     gui_event_lock(gui_api->gui->event); |     gui_event_lock(gui->event); | ||||||
|     WidgetArray_push_back((struct WidgetArray_s*)widget_array, widget); |     WidgetArray_push_back(*widget_array, widget); | ||||||
|     widget_gui_set(widget, gui_api->gui); |     widget_gui_set(widget, gui); | ||||||
|     gui_event_unlock(gui_api->gui->event); |     gui_event_unlock(gui->event); | ||||||
| 
 | 
 | ||||||
|     gui_update(gui_api->gui); |     gui_update(gui); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void gui_update(Gui* gui) { | void gui_update(Gui* gui) { | ||||||
| @ -133,6 +132,7 @@ void gui_input(Gui* gui, InputEvent* input_event) { | |||||||
| 
 | 
 | ||||||
| Gui* gui_alloc() { | Gui* gui_alloc() { | ||||||
|     Gui* gui = furi_alloc(sizeof(Gui)); |     Gui* gui = furi_alloc(sizeof(Gui)); | ||||||
|  | 
 | ||||||
|     // Initialize widget arrays
 |     // Initialize widget arrays
 | ||||||
|     WidgetArray_init(gui->widgets_status_bar); |     WidgetArray_init(gui->widgets_status_bar); | ||||||
|     WidgetArray_init(gui->widgets); |     WidgetArray_init(gui->widgets); | ||||||
| @ -143,22 +143,17 @@ Gui* gui_alloc() { | |||||||
|     gui->event = gui_event_alloc(); |     gui->event = gui_event_alloc(); | ||||||
| 
 | 
 | ||||||
|     // Drawing canvas api
 |     // Drawing canvas api
 | ||||||
| 
 |  | ||||||
|     gui->canvas_api = canvas_api_init(); |     gui->canvas_api = canvas_api_init(); | ||||||
| 
 | 
 | ||||||
|  |     gui->api.add_widget = gui_add_widget; | ||||||
|  | 
 | ||||||
|     return gui; |     return gui; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void gui_task(void* p) { | void gui_task(void* p) { | ||||||
|     Gui* gui = gui_alloc(); |     Gui* gui = gui_alloc(); | ||||||
| 
 |  | ||||||
|     GuiApi gui_api = { |  | ||||||
|         .add_widget = gui_add_widget, |  | ||||||
|         .gui = gui, |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     // Create FURI record
 |     // Create FURI record
 | ||||||
|     if(!furi_create("gui", &gui_api)) { |     if(!furi_create("gui", gui)) { | ||||||
|         printf("[gui_task] cannot create the gui record\n"); |         printf("[gui_task] cannot create the gui record\n"); | ||||||
|         furiac_exit(NULL); |         furiac_exit(NULL); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -11,12 +11,8 @@ typedef enum { | |||||||
| } WidgetLayer; | } WidgetLayer; | ||||||
| 
 | 
 | ||||||
| typedef struct Widget Widget; | typedef struct Widget Widget; | ||||||
| typedef struct Gui Gui; |  | ||||||
| 
 | 
 | ||||||
| struct _GuiApi; | typedef struct GuiApi GuiApi; | ||||||
| typedef struct _GuiApi GuiApi; | struct GuiApi { | ||||||
| 
 |  | ||||||
| struct _GuiApi { |  | ||||||
|     void (*add_widget)(GuiApi* gui_api, Widget* widget, WidgetLayer layer); |     void (*add_widget)(GuiApi* gui_api, Widget* widget, WidgetLayer layer); | ||||||
|     Gui* gui; |  | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -1,3 +1,5 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | typedef struct Gui Gui; | ||||||
|  | 
 | ||||||
| void gui_update(Gui* gui); | void gui_update(Gui* gui); | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ | |||||||
| // TODO add mutex to widget ops
 | // TODO add mutex to widget ops
 | ||||||
| 
 | 
 | ||||||
| struct Widget { | struct Widget { | ||||||
|     void* gui; |     Gui* gui; | ||||||
|     bool is_enabled; |     bool is_enabled; | ||||||
|     WidgetDrawCallback draw_callback; |     WidgetDrawCallback draw_callback; | ||||||
|     void* draw_callback_context; |     void* draw_callback_context; | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "gui.h" | #include "gui_i.h" | ||||||
| 
 | 
 | ||||||
| void widget_gui_set(Widget* widget, Gui* gui); | void widget_gui_set(Widget* widget, Gui* gui); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Aleksandr Kutuzov
						Aleksandr Kutuzov