1 /**
2  * @file lv_disp.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "lv_disp.h"
10 #include "../lv_misc/lv_math.h"
11 
12 /*********************
13  *      DEFINES
14  *********************/
15 
16 /**********************
17  *      TYPEDEFS
18  **********************/
19 
20 /**********************
21  *  STATIC PROTOTYPES
22  **********************/
23 
24 /**********************
25  *  STATIC VARIABLES
26  **********************/
27 
28 /**********************
29  *      MACROS
30  **********************/
31 
32 /**********************
33  *   GLOBAL FUNCTIONS
34  **********************/
35 
36 /**
37  * Return with a pointer to the active screen
38  * @param disp pointer to display which active screen should be get. (NULL to use the default
39  * screen)
40  * @return pointer to the active screen object (loaded by 'lv_scr_load()')
41  */
lv_disp_get_scr_act(lv_disp_t * disp)42 lv_obj_t * lv_disp_get_scr_act(lv_disp_t * disp)
43 {
44     if(!disp) disp = lv_disp_get_default();
45     if(!disp) {
46         LV_LOG_WARN("lv_scr_act: no display registered to get its top layer");
47         return NULL;
48     }
49 
50     return disp->act_scr;
51 }
52 
53 /**
54  * Make a screen active
55  * @param scr pointer to a screen
56  */
lv_disp_load_scr(lv_obj_t * scr)57 void lv_disp_load_scr(lv_obj_t * scr)
58 {
59     lv_disp_t * d = lv_obj_get_disp(scr);
60 
61     d->act_scr = scr;
62 
63     lv_obj_invalidate(scr);
64 }
65 
66 /**
67  * Return with the top layer. (Same on every screen and it is above the normal screen layer)
68  * @param disp pointer to display which top layer should be get. (NULL to use the default screen)
69  * @return pointer to the top layer object  (transparent screen sized lv_obj)
70  */
lv_disp_get_layer_top(lv_disp_t * disp)71 lv_obj_t * lv_disp_get_layer_top(lv_disp_t * disp)
72 {
73     if(!disp) disp = lv_disp_get_default();
74     if(!disp) {
75         LV_LOG_WARN("lv_layer_top: no display registered to get its top layer");
76         return NULL;
77     }
78 
79     return disp->top_layer;
80 }
81 
82 /**
83  * Return with the sys. layer. (Same on every screen and it is above the normal screen and the top
84  * layer)
85  * @param disp pointer to display which sys. layer  should be get. (NULL to use the default screen)
86  * @return pointer to the sys layer object  (transparent screen sized lv_obj)
87  */
lv_disp_get_layer_sys(lv_disp_t * disp)88 lv_obj_t * lv_disp_get_layer_sys(lv_disp_t * disp)
89 {
90     if(!disp) disp = lv_disp_get_default();
91     if(!disp) {
92         LV_LOG_WARN("lv_layer_sys: no display registered to get its top layer");
93         return NULL;
94     }
95 
96     return disp->sys_layer;
97 }
98 
99 /**
100  * Assign a screen to a display.
101  * @param disp pointer to a display where to assign the screen
102  * @param scr pointer to a screen object to assign
103  */
lv_disp_assign_screen(lv_disp_t * disp,lv_obj_t * scr)104 void lv_disp_assign_screen(lv_disp_t * disp, lv_obj_t * scr)
105 {
106     if(lv_obj_get_parent(scr) != NULL) {
107         LV_LOG_WARN("lv_disp_assign_screen: try to assign a non-screen object");
108         return;
109     }
110 
111     lv_disp_t * old_disp = lv_obj_get_disp(scr);
112 
113     if(old_disp == disp) return;
114 
115     lv_ll_chg_list(&old_disp->scr_ll, &disp->scr_ll, scr, true);
116 }
117 
118 /**
119  * Get a pointer to the screen refresher task to
120  * modify its parameters with `lv_task_...` functions.
121  * @param disp pointer to a display
122  * @return pointer to the display refresher task. (NULL on error)
123  */
lv_disp_get_refr_task(lv_disp_t * disp)124 lv_task_t * lv_disp_get_refr_task(lv_disp_t * disp)
125 {
126     if(!disp) disp = lv_disp_get_default();
127     if(!disp) {
128         LV_LOG_WARN("lv_disp_get_refr_task: no display registered");
129         return NULL;
130     }
131 
132     return disp->refr_task;
133 }
134 
135 /**
136  * Get elapsed time since last user activity on a display (e.g. click)
137  * @param disp pointer to an display (NULL to get the overall smallest inactivity)
138  * @return elapsed ticks (milliseconds) since the last activity
139  */
lv_disp_get_inactive_time(const lv_disp_t * disp)140 uint32_t lv_disp_get_inactive_time(const lv_disp_t * disp)
141 {
142     if(!disp) disp = lv_disp_get_default();
143     if(!disp) {
144         LV_LOG_WARN("lv_disp_get_inactive_time: no display registered");
145         return 0;
146     }
147 
148     if(disp) return lv_tick_elaps(disp->last_activity_time);
149 
150     lv_disp_t * d;
151     uint32_t t = UINT32_MAX;
152     d          = lv_disp_get_next(NULL);
153     while(d) {
154         t = LV_MATH_MIN(t, lv_tick_elaps(d->last_activity_time));
155         d = lv_disp_get_next(d);
156     }
157 
158     return t;
159 }
160 
161 /**
162  * Manually trigger an activity on a display
163  * @param disp pointer to an display (NULL to use the default display)
164  */
lv_disp_trig_activity(lv_disp_t * disp)165 void lv_disp_trig_activity(lv_disp_t * disp)
166 {
167     if(!disp) disp = lv_disp_get_default();
168     if(!disp) {
169         LV_LOG_WARN("lv_disp_trig_activity: no display registered");
170         return;
171     }
172 
173     disp->last_activity_time = lv_tick_get();
174 }
175 
176 /**********************
177  *   STATIC FUNCTIONS
178  **********************/
179