acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

event.md (8918B)

      1 ```eval_rst
      2 .. include:: /header.rst
      3 :github_url: |github_link_base|/overview/event.md
      4 ```
      5 # Events
      6 
      7 Events are triggered in LVGL when something happens which might be interesting to the user, e.g. when an object
      8 - is clicked
      9 - is scrolled
     10 - has its value changed
     11 - is redrawn, etc.
     12 
     13 ## Add events to the object
     14 
     15 The user can assign callback functions to an object to see its events. In practice, it looks like this:
     16 ```c
     17 lv_obj_t * btn = lv_btn_create(lv_scr_act());
     18 lv_obj_add_event_cb(btn, my_event_cb, LV_EVENT_CLICKED, NULL);   /*Assign an event callback*/
     19 
     20 ...
     21 
     22 static void my_event_cb(lv_event_t * event)
     23 {
     24     printf("Clicked\n");
     25 }
     26 ```
     27 In the example `LV_EVENT_CLICKED` means that only the click event will call `my_event_cb`. See the [list of event codes](#event-codes) for all the options.
     28 `LV_EVENT_ALL` can be used to receive all events.
     29 
     30 The last parameter of `lv_obj_add_event_cb` is a pointer to any custom data that will be available in the event. It will be described later in more detail.
     31 
     32 More events can be added to an object, like this:
     33 ```c
     34 lv_obj_add_event_cb(obj, my_event_cb_1, LV_EVENT_CLICKED, NULL);
     35 lv_obj_add_event_cb(obj, my_event_cb_2, LV_EVENT_PRESSED, NULL);
     36 lv_obj_add_event_cb(obj, my_event_cb_3, LV_EVENT_ALL, NULL);		/*No filtering, receive all events*/
     37 ```
     38 
     39 Even the same event callback can be used on an object with different `user_data`. For example:
     40 ```c
     41 lv_obj_add_event_cb(obj, increment_on_click, LV_EVENT_CLICKED, &num1);
     42 lv_obj_add_event_cb(obj, increment_on_click, LV_EVENT_CLICKED, &num2);
     43 ```
     44 
     45 The events will be called in the order as they were added.
     46 
     47 
     48 Other objects can use the same *event callback*.
     49 
     50 
     51 ## Remove event(s) from an object
     52 
     53 Events can be removed from an object with the `lv_obj_remove_event_cb(obj, event_cb)` function or `lv_obj_remove_event_dsc(obj, event_dsc)`. `event_dsc` is a pointer returned by `lv_obj_add_event_cb`.
     54 
     55 ## Event codes
     56 
     57 The event codes can be grouped into these categories:
     58 - Input device events
     59 - Drawing events
     60 - Other events
     61 - Special events
     62 - Custom events
     63 
     64 All objects (such as Buttons/Labels/Sliders etc.) regardless their type receive the *Input device*, *Drawing* and *Other* events.
     65 
     66 However, the *Special events* are specific to a particular widget type. See the [widgets' documentation](/widgets/index) to learn when they are sent,
     67 
     68 *Custom events* are added by the user and are never sent by LVGL.
     69 
     70 The following event codes exist:
     71 
     72 ### Input device events
     73 - `LV_EVENT_PRESSED`      An object has been pressed
     74 - `LV_EVENT_PRESSING`     An object is being pressed (called continuously while pressing)
     75 - `LV_EVENT_PRESS_LOST`   An object is still being pressed but slid cursor/finger off of the object
     76 - `LV_EVENT_SHORT_CLICKED`    An object was pressed for a short period of time, then released. Not called if scrolled.
     77 - `LV_EVENT_LONG_PRESSED` An object has been pressed for at least the `long_press_time` specified in the input device driver.  Not called if scrolled.
     78 - `LV_EVENT_LONG_PRESSED_REPEAT`  Called after `long_press_time` in every `long_press_repeat_time` ms.  Not called if scrolled.
     79 - `LV_EVENT_CLICKED`      Called on release if an object did not scroll (regardless of long press)
     80 - `LV_EVENT_RELEASED`     Called in every case when an object has been released
     81 - `LV_EVENT_SCROLL_BEGIN` Scrolling begins. The event parameter is `NULL` or an `lv_anim_t *` with a scroll animation descriptor that can be modified if required.
     82 - `LV_EVENT_SCROLL_END`   Scrolling ends.
     83 - `LV_EVENT_SCROLL`       An object was scrolled
     84 - `LV_EVENT_GESTURE`      A gesture is detected. Get the gesture with `lv_indev_get_gesture_dir(lv_indev_get_act());`
     85 - `LV_EVENT_KEY`          A key is sent to an object. Get the key with `lv_indev_get_key(lv_indev_get_act());`
     86 - `LV_EVENT_FOCUSED`      An object is focused
     87 - `LV_EVENT_DEFOCUSED`    An object is unfocused
     88 - `LV_EVENT_LEAVE`        An object is unfocused but still selected
     89 - `LV_EVENT_HIT_TEST`     Perform advanced hit-testing. Use `lv_hit_test_info_t * a = lv_event_get_hit_test_info(e)` and check if `a->point` can click the object or not. If not set `a->res = false`
     90 
     91 
     92 ### Drawing events
     93 - `LV_EVENT_COVER_CHECK` Check if an object fully covers an area. The event parameter is `lv_cover_check_info_t *`.
     94 - `LV_EVENT_REFR_EXT_DRAW_SIZE`  Get the required extra draw area around an object (e.g. for a shadow). The event parameter is `lv_coord_t *` to store the size. Only overwrite it with a larger value.
     95 - `LV_EVENT_DRAW_MAIN_BEGIN` Starting the main drawing phase.
     96 - `LV_EVENT_DRAW_MAIN`   Perform the main drawing
     97 - `LV_EVENT_DRAW_MAIN_END`   Finishing the main drawing phase
     98 - `LV_EVENT_DRAW_POST_BEGIN` Starting the post draw phase (when all children are drawn)
     99 - `LV_EVENT_DRAW_POST`   Perform the post draw phase (when all children are drawn)
    100 - `LV_EVENT_DRAW_POST_END`   Finishing the post draw phase (when all children are drawn)
    101 - `LV_EVENT_DRAW_PART_BEGIN` Starting to draw a part. The event parameter is `lv_obj_draw_dsc_t *`. Learn more [here](/overview/drawing).
    102 - `LV_EVENT_DRAW_PART_END`   Finishing to draw a part. The event parameter is `lv_obj_draw_dsc_t *`. Learn more [here](/overview/drawing).
    103 
    104 In `LV_EVENT_DRAW_...` events it's not allowed to adjust the widgets' properties. E.g. you can not call `lv_obj_set_width()`.
    105 In other words only `get` functions can be called.
    106 
    107 ### Other events
    108 - `LV_EVENT_DELETE`       Object is being deleted
    109 - `LV_EVENT_CHILD_CHANGED`    Child was removed/added
    110 - `LV_EVENT_CHILD_CREATED`    Child was created, always bubbles up to all parents
    111 - `LV_EVENT_CHILD_DELETED`    Child was deleted, always bubbles up to all parents
    112 - `LV_EVENT_SIZE_CHANGED`    Object coordinates/size have changed
    113 - `LV_EVENT_STYLE_CHANGED`    Object's style has changed
    114 - `LV_EVENT_BASE_DIR_CHANGED` The base dir has changed
    115 - `LV_EVENT_GET_SELF_SIZE`    Get the internal size of a widget
    116 - `LV_EVENT_SCREEN_UNLOAD_START` A screen unload started, fired immediately when lv_scr_load/lv_scr_load_anim is called
    117 - `LV_EVENT_SCREEN_LOAD_START` A screen load started, fired when the screen change delay is expired
    118 - `LV_EVENT_SCREEN_LOADED`    A screen was loaded, called when all animations are finished
    119 - `LV_EVENT_SCREEN_UNLOADED`  A screen was unloaded, called when all animations are finished
    120 
    121 ### Special events
    122 - `LV_EVENT_VALUE_CHANGED`    The object's value has changed (i.e. slider moved)
    123 - `LV_EVENT_INSERT`       Text is being inserted into the object. The event data is `char *` being inserted.
    124 - `LV_EVENT_REFRESH`      Notify the object to refresh something on it (for the user)
    125 - `LV_EVENT_READY`        A process has finished
    126 - `LV_EVENT_CANCEL`       A process has been canceled
    127 
    128 
    129 ### Custom events
    130 Any custom event codes can be registered by `uint32_t MY_EVENT_1 = lv_event_register_id();`
    131 
    132 They can be sent to any object with `lv_event_send(obj, MY_EVENT_1, &some_data)`
    133 
    134 ## Sending events
    135 
    136 To manually send events to an object, use `lv_event_send(obj, <EVENT_CODE> &some_data)`.
    137 
    138 For example, this can be used to manually close a message box by simulating a button press (although there are simpler ways to do this):
    139 ```c
    140 /*Simulate the press of the first button (indexes start from zero)*/
    141 uint32_t btn_id = 0;
    142 lv_event_send(mbox, LV_EVENT_VALUE_CHANGED, &btn_id);
    143 ```
    144 
    145 ### Refresh event
    146 
    147 `LV_EVENT_REFRESH` is a special event because it's designed to let the user notify an object to refresh itself. Some examples:
    148 - notify a label to refresh its text according to one or more variables (e.g. current time)
    149 - refresh a label when the language changes
    150 - enable a button if some conditions are met (e.g. the correct PIN is entered)
    151 - add/remove styles to/from an object if a limit is exceeded, etc
    152 
    153 ## Fields of lv_event_t
    154 
    155 `lv_event_t` is the only parameter passed to the event callback and it contains all data about the event. The following values can be gotten from it:
    156 - `lv_event_get_code(e)` get the event code
    157 - `lv_event_get_current_target(e)` get the object to which an event was sent. I.e. the object whose event handler is being called.
    158 - `lv_event_get_target(e)` get the object that originally triggered the event (different from `lv_event_get_target` if [event bubbling](#event-bubbling) is enabled)
    159 - `lv_event_get_user_data(e)` get the pointer passed as the last parameter of `lv_obj_add_event_cb`.
    160 - `lv_event_get_param(e)` get the parameter passed as the last parameter of `lv_event_send`
    161 
    162 
    163 ## Event bubbling
    164 
    165 If `lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE)` is enabled all events will be sent to an object's parent too. If the parent also has `LV_OBJ_FLAG_EVENT_BUBBLE` enabled the event will be sent to its parent and so on.
    166 
    167 The *target* parameter of the event is always the current target object, not the original object. To get the original target call `lv_event_get_original_target(e)` in the event handler.
    168 
    169 
    170 
    171 ## Examples
    172 
    173 ```eval_rst
    174 
    175 .. include:: ../../examples/event/index.rst
    176 
    177 ```