1 /** 2 * @file lv_event.h 3 * 4 */ 5 6 #ifndef LV_EVENT_H 7 #define LV_EVENT_H 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 /********************* 14 * INCLUDES 15 *********************/ 16 #include <stdbool.h> 17 18 /********************* 19 * DEFINES 20 *********************/ 21 22 /********************** 23 * TYPEDEFS 24 **********************/ 25 26 struct _lv_obj_t; 27 struct _lv_event_dsc_t; 28 29 /** 30 * Type of event being sent to the object. 31 */ 32 typedef enum { 33 LV_EVENT_ALL = 0, 34 35 /** Input device events*/ 36 LV_EVENT_PRESSED, /**< The object has been pressed*/ 37 LV_EVENT_PRESSING, /**< The object is being pressed (called continuously while pressing)*/ 38 LV_EVENT_PRESS_LOST, /**< The object is still being pressed but slid cursor/finger off of the object */ 39 LV_EVENT_SHORT_CLICKED, /**< The object was pressed for a short period of time, then released it. Not called if scrolled.*/ 40 LV_EVENT_LONG_PRESSED, /**< Object has been pressed for at least `long_press_time`. Not called if scrolled.*/ 41 LV_EVENT_LONG_PRESSED_REPEAT, /**< Called after `long_press_time` in every `long_press_repeat_time` ms. Not called if scrolled.*/ 42 LV_EVENT_CLICKED, /**< Called on release if not scrolled (regardless to long press)*/ 43 LV_EVENT_RELEASED, /**< Called in every cases when the object has been released*/ 44 LV_EVENT_SCROLL_BEGIN, /**< Scrolling begins. The event parameter is a pointer to the animation of the scroll. Can be modified*/ 45 LV_EVENT_SCROLL_END, /**< Scrolling ends*/ 46 LV_EVENT_SCROLL, /**< Scrolling*/ 47 LV_EVENT_GESTURE, /**< A gesture is detected. Get the gesture with `lv_indev_get_gesture_dir(lv_indev_get_act());` */ 48 LV_EVENT_KEY, /**< A key is sent to the object. Get the key with `lv_indev_get_key(lv_indev_get_act());`*/ 49 LV_EVENT_FOCUSED, /**< The object is focused*/ 50 LV_EVENT_DEFOCUSED, /**< The object is defocused*/ 51 LV_EVENT_LEAVE, /**< The object is defocused but still selected*/ 52 LV_EVENT_HIT_TEST, /**< Perform advanced hit-testing*/ 53 54 /** Drawing events*/ 55 LV_EVENT_COVER_CHECK, /**< Check if the object fully covers an area. The event parameter is `lv_cover_check_info_t *`.*/ 56 LV_EVENT_REFR_EXT_DRAW_SIZE, /**< Get the required extra draw area around the object (e.g. for shadow). The event parameter is `lv_coord_t *` to store the size.*/ 57 LV_EVENT_DRAW_MAIN_BEGIN, /**< Starting the main drawing phase*/ 58 LV_EVENT_DRAW_MAIN, /**< Perform the main drawing*/ 59 LV_EVENT_DRAW_MAIN_END, /**< Finishing the main drawing phase*/ 60 LV_EVENT_DRAW_POST_BEGIN, /**< Starting the post draw phase (when all children are drawn)*/ 61 LV_EVENT_DRAW_POST, /**< Perform the post draw phase (when all children are drawn)*/ 62 LV_EVENT_DRAW_POST_END, /**< Finishing the post draw phase (when all children are drawn)*/ 63 LV_EVENT_DRAW_PART_BEGIN, /**< Starting to draw a part. The event parameter is `lv_obj_draw_dsc_t *`. */ 64 LV_EVENT_DRAW_PART_END, /**< Finishing to draw a part. The event parameter is `lv_obj_draw_dsc_t *`. */ 65 66 /** Special events*/ 67 LV_EVENT_VALUE_CHANGED, /**< The object's value has changed (i.e. slider moved)*/ 68 LV_EVENT_INSERT, /**< A text is inserted to the object. The event data is `char *` being inserted.*/ 69 LV_EVENT_REFRESH, /**< Notify the object to refresh something on it (for the user)*/ 70 LV_EVENT_READY, /**< A process has finished*/ 71 LV_EVENT_CANCEL, /**< A process has been cancelled */ 72 73 /** Other events*/ 74 LV_EVENT_DELETE, /**< Object is being deleted*/ 75 LV_EVENT_CHILD_CHANGED, /**< Child was removed, added, or its size, position were changed */ 76 LV_EVENT_CHILD_CREATED, /**< Child was created, always bubbles up to all parents*/ 77 LV_EVENT_CHILD_DELETED, /**< Child was deleted, always bubbles up to all parents*/ 78 LV_EVENT_SCREEN_UNLOAD_START, /**< A screen unload started, fired immediately when scr_load is called*/ 79 LV_EVENT_SCREEN_LOAD_START, /**< A screen load started, fired when the screen change delay is expired*/ 80 LV_EVENT_SCREEN_LOADED, /**< A screen was loaded*/ 81 LV_EVENT_SCREEN_UNLOADED, /**< A screen was unloaded*/ 82 LV_EVENT_SIZE_CHANGED, /**< Object coordinates/size have changed*/ 83 LV_EVENT_STYLE_CHANGED, /**< Object's style has changed*/ 84 LV_EVENT_LAYOUT_CHANGED, /**< The children position has changed due to a layout recalculation*/ 85 LV_EVENT_GET_SELF_SIZE, /**< Get the internal size of a widget*/ 86 87 _LV_EVENT_LAST, /** Number of default events*/ 88 89 LV_EVENT_PREPROCESS = 0x80, /** This is a flag that can be set with an event so it's processed 90 before the class default event processing */ 91 } lv_event_code_t; 92 93 typedef struct _lv_event_t { 94 struct _lv_obj_t * target; 95 struct _lv_obj_t * current_target; 96 lv_event_code_t code; 97 void * user_data; 98 void * param; 99 struct _lv_event_t * prev; 100 uint8_t deleted : 1; 101 uint8_t stop_processing : 1; 102 uint8_t stop_bubbling : 1; 103 } lv_event_t; 104 105 /** 106 * @brief Event callback. 107 * Events are used to notify the user of some action being taken on the object. 108 * For details, see ::lv_event_t. 109 */ 110 typedef void (*lv_event_cb_t)(lv_event_t * e); 111 112 /** 113 * Used as the event parameter of ::LV_EVENT_HIT_TEST to check if an `point` can click the object or not. 114 * `res` should be set like this: 115 * - If already set to `false` an other event wants that point non clickable. If you want to respect it leave it as `false` or set `true` to overwrite it. 116 * - If already set `true` and `point` shouldn't be clickable set to `false` 117 * - If already set to `true` you agree that `point` can click the object leave it as `true` 118 */ 119 typedef struct { 120 const lv_point_t * point; /**< A point relative to screen to check if it can click the object or not*/ 121 bool res; /**< true: `point` can click the object; false: it cannot*/ 122 } lv_hit_test_info_t; 123 124 /** 125 * Used as the event parameter of ::LV_EVENT_COVER_CHECK to check if an area is covered by the object or not. 126 * In the event use `const lv_area_t * area = lv_event_get_cover_area(e)` to get the area to check 127 * and `lv_event_set_cover_res(e, res)` to set the result. 128 */ 129 typedef struct { 130 lv_cover_res_t res; 131 const lv_area_t * area; 132 } lv_cover_check_info_t; 133 134 /********************** 135 * GLOBAL PROTOTYPES 136 **********************/ 137 138 /** 139 * Send an event to the object 140 * @param obj pointer to an object 141 * @param event_code the type of the event from `lv_event_t` 142 * @param param arbitrary data depending on the widget type and the event. (Usually `NULL`) 143 * @return LV_RES_OK: `obj` was not deleted in the event; LV_RES_INV: `obj` was deleted in the event_code 144 */ 145 lv_res_t lv_event_send(struct _lv_obj_t * obj, lv_event_code_t event_code, void * param); 146 147 /** 148 * Used by the widgets internally to call the ancestor widget types's event handler 149 * @param class_p pointer to the class of the widget (NOT the ancestor class) 150 * @param e pointer to the event descriptor 151 * @return LV_RES_OK: the target object was not deleted in the event; LV_RES_INV: it was deleted in the event_code 152 */ 153 lv_res_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e); 154 155 /** 156 * Get the object originally targeted by the event. It's the same even if the event is bubbled. 157 * @param e pointer to the event descriptor 158 * @return the target of the event_code 159 */ 160 struct _lv_obj_t * lv_event_get_target(lv_event_t * e); 161 162 /** 163 * Get the current target of the event. It's the object which event handler being called. 164 * If the event is not bubbled it's the same as "normal" target. 165 * @param e pointer to the event descriptor 166 * @return pointer to the current target of the event_code 167 */ 168 struct _lv_obj_t * lv_event_get_current_target(lv_event_t * e); 169 170 /** 171 * Get the event code of an event 172 * @param e pointer to the event descriptor 173 * @return the event code. (E.g. `LV_EVENT_CLICKED`, `LV_EVENT_FOCUSED`, etc) 174 */ 175 lv_event_code_t lv_event_get_code(lv_event_t * e); 176 177 /** 178 * Get the parameter passed when the event was sent 179 * @param e pointer to the event descriptor 180 * @return pointer to the parameter 181 */ 182 void * lv_event_get_param(lv_event_t * e); 183 184 /** 185 * Get the user_data passed when the event was registered on the object 186 * @param e pointer to the event descriptor 187 * @return pointer to the user_data 188 */ 189 void * lv_event_get_user_data(lv_event_t * e); 190 191 /** 192 * Stop the event from bubbling. 193 * This is only valid when called in the middle of an event processing chain. 194 * @param e pointer to the event descriptor 195 */ 196 void lv_event_stop_bubbling(lv_event_t * e); 197 198 /** 199 * Stop processing this event. 200 * This is only valid when called in the middle of an event processing chain. 201 * @param e pointer to the event descriptor 202 */ 203 void lv_event_stop_processing(lv_event_t * e); 204 205 /** 206 * Register a new, custom event ID. 207 * It can be used the same way as e.g. `LV_EVENT_CLICKED` to send custom events 208 * @return the new event id 209 * @example 210 * uint32_t LV_EVENT_MINE = 0; 211 * ... 212 * e = lv_event_register_id(); 213 * ... 214 * lv_event_send(obj, LV_EVENT_MINE, &some_data); 215 */ 216 uint32_t lv_event_register_id(void); 217 218 /** 219 * Nested events can be called and one of them might belong to an object that is being deleted. 220 * Mark this object's `event_temp_data` deleted to know that its `lv_event_send` should return `LV_RES_INV` 221 * @param obj pointer to an object to mark as deleted 222 */ 223 void _lv_event_mark_deleted(struct _lv_obj_t * obj); 224 225 /** 226 * Add an event handler function for an object. 227 * Used by the user to react on event which happens with the object. 228 * An object can have multiple event handler. They will be called in the same order as they were added. 229 * @param obj pointer to an object 230 * @param filter and event code (e.g. `LV_EVENT_CLICKED`) on which the event should be called. `LV_EVENT_ALL` can be sued the receive all the events. 231 * @param event_cb the new event function 232 * @param user_data custom data data will be available in `event_cb` 233 * @return a pointer the event descriptor. Can be used in ::lv_obj_remove_event_dsc 234 */ 235 struct _lv_event_dsc_t * lv_obj_add_event_cb(struct _lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, 236 void * user_data); 237 238 /** 239 * Remove an event handler function for an object. 240 * @param obj pointer to an object 241 * @param event_cb the event function to remove, or `NULL` to remove the firstly added event callback 242 * @return true if any event handlers were removed 243 */ 244 bool lv_obj_remove_event_cb(struct _lv_obj_t * obj, lv_event_cb_t event_cb); 245 246 /** 247 * Remove an event handler function with a specific user_data from an object. 248 * @param obj pointer to an object 249 * @param event_cb the event function to remove, or `NULL` only `user_data` matters. 250 * @param event_user_data the user_data specified in ::lv_obj_add_event_cb 251 * @return true if any event handlers were removed 252 */ 253 bool lv_obj_remove_event_cb_with_user_data(struct _lv_obj_t * obj, lv_event_cb_t event_cb, 254 const void * event_user_data); 255 256 /** 257 * DEPRECATED because doesn't work if multiple event handlers are added to an object. 258 * Remove an event handler function for an object. 259 * @param obj pointer to an object 260 * @param event_dsc pointer to an event descriptor to remove (returned by ::lv_obj_add_event_cb) 261 * @return true if any event handlers were removed 262 */ 263 bool lv_obj_remove_event_dsc(struct _lv_obj_t * obj, struct _lv_event_dsc_t * event_dsc); 264 265 /** 266 * The user data of an event object event callback. Always the first match with `event_cb` will be returned. 267 * @param obj pointer to an object 268 * @param event_cb the event function 269 * @return the user_data 270 */ 271 void * lv_obj_get_event_user_data(struct _lv_obj_t * obj, lv_event_cb_t event_cb); 272 273 /** 274 * Get the input device passed as parameter to indev related events. 275 * @param e pointer to an event 276 * @return the indev that triggered the event or NULL if called on a not indev related event 277 */ 278 lv_indev_t * lv_event_get_indev(lv_event_t * e); 279 280 /** 281 * Get the part draw descriptor passed as parameter to `LV_EVENT_DRAW_PART_BEGIN/END`. 282 * @param e pointer to an event 283 * @return the part draw descriptor to hook the drawing or NULL if called on an unrelated event 284 */ 285 lv_obj_draw_part_dsc_t * lv_event_get_draw_part_dsc(lv_event_t * e); 286 287 /** 288 * Get the draw context which should be the first parameter of the draw functions. 289 * Namely: `LV_EVENT_DRAW_MAIN/POST`, `LV_EVENT_DRAW_MAIN/POST_BEGIN`, `LV_EVENT_DRAW_MAIN/POST_END` 290 * @param e pointer to an event 291 * @return pointer to a draw context or NULL if called on an unrelated event 292 */ 293 lv_draw_ctx_t * lv_event_get_draw_ctx(lv_event_t * e); 294 295 /** 296 * Get the old area of the object before its size was changed. Can be used in `LV_EVENT_SIZE_CHANGED` 297 * @param e pointer to an event 298 * @return the old absolute area of the object or NULL if called on an unrelated event 299 */ 300 const lv_area_t * lv_event_get_old_size(lv_event_t * e); 301 302 /** 303 * Get the key passed as parameter to an event. Can be used in `LV_EVENT_KEY` 304 * @param e pointer to an event 305 * @return the triggering key or NULL if called on an unrelated event 306 */ 307 uint32_t lv_event_get_key(lv_event_t * e); 308 309 /** 310 * Get the animation descriptor of a scrolling. Can be used in `LV_EVENT_SCROLL_BEGIN` 311 * @param e pointer to an event 312 * @return the animation that will scroll the object. (can be modified as required) 313 */ 314 lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e); 315 316 /** 317 * Set the new extra draw size. Can be used in `LV_EVENT_REFR_EXT_DRAW_SIZE` 318 * @param e pointer to an event 319 * @param size The new extra draw size 320 */ 321 void lv_event_set_ext_draw_size(lv_event_t * e, lv_coord_t size); 322 323 /** 324 * Get a pointer to an `lv_point_t` variable in which the self size should be saved (width in `point->x` and height `point->y`). 325 * Can be used in `LV_EVENT_GET_SELF_SIZE` 326 * @param e pointer to an event 327 * @return pointer to `lv_point_t` or NULL if called on an unrelated event 328 */ 329 lv_point_t * lv_event_get_self_size_info(lv_event_t * e); 330 331 /** 332 * Get a pointer to an `lv_hit_test_info_t` variable in which the hit test result should be saved. Can be used in `LV_EVENT_HIT_TEST` 333 * @param e pointer to an event 334 * @return pointer to `lv_hit_test_info_t` or NULL if called on an unrelated event 335 */ 336 lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e); 337 338 /** 339 * Get a pointer to an area which should be examined whether the object fully covers it or not. 340 * Can be used in `LV_EVENT_HIT_TEST` 341 * @param e pointer to an event 342 * @return an area with absolute coordinates to check 343 */ 344 const lv_area_t * lv_event_get_cover_area(lv_event_t * e); 345 346 /** 347 * Set the result of cover checking. Can be used in `LV_EVENT_COVER_CHECK` 348 * @param e pointer to an event 349 * @param res an element of ::lv_cover_check_info_t 350 */ 351 void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res); 352 353 /********************** 354 * MACROS 355 **********************/ 356 357 #ifdef __cplusplus 358 } /*extern "C"*/ 359 #endif 360 361 #endif /*LV_EVENT_H*/ 362