Input devices¶
An input device usually means:
Pointer-like input device like touchpad or mouse
Keypads like a normal keyboard or simple numeric keypad
Encoders with left/right turn and push options
External hardware buttons which are assigned to specific points on the screen
Important
Before reading further, please read the [Porting](/porting/indev) section of Input devices
Pointers¶
Cursor¶
Pointer input devices (like a mouse) can have a cursor.
...
lv_indev_t * mouse_indev = lv_indev_drv_register(&indev_drv);
LV_IMG_DECLARE(mouse_cursor_icon); /*Declare the image source.*/
lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */
lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/
lv_indev_set_cursor(mouse_indev, cursor_obj); /*Connect the image object to the driver*/
Note that the cursor object should have lv_obj_clear_flag(cursor_obj, LV_OBJ_FLAG_CLICKABLE)
.
For images, clicking is disabled by default.
Gestures¶
Pointer input devices can detect basic gestures. By default, most of the widgets send the gestures to its parent, so finally the gestures can be detected on the screen object in a form of an LV_EVENT_GESTURE
event. For example:
void my_event(lv_event_t * e)
{
lv_obj_t * screen = lv_event_get_current_target(e);
lv_dir_t dir = lv_indev_get_gesture_dir(lv_indev_act());
switch(dir) {
case LV_DIR_LEFT:
...
break;
case LV_DIR_RIGHT:
...
break;
case LV_DIR_TOP:
...
break;
case LV_DIR_BOTTOM:
...
break;
}
}
...
lv_obj_add_event_cb(screen1, my_event, LV_EVENT_GESTURE, NULL);
To prevent passing the gesture event to the parent from an object use lv_obj_clear_flag(obj, LV_OBJ_FLAG_GESTURE_BUBBLE)
.
Note that, gestures are not triggered if an object is being scrolled.
Keypad and encoder¶
You can fully control the user interface without a touchpad or mouse by using a keypad or encoder(s). It works similar to the TAB key on the PC to select an element in an application or a web page.
Groups¶
Objects you want to control with a keypad or encoder need to be added to a Group. In every group there is exactly one focused object which receives the pressed keys or the encoder actions. For example, if a Text area is focused and you press some letter on a keyboard, the keys will be sent and inserted into the text area. Similarly, if a Slider is focused and you press the left or right arrows, the slider's value will be changed.
You need to associate an input device with a group. An input device can send key events to only one group but a group can receive data from more than one input device.
To create a group use lv_group_t * g = lv_group_create()
and to add an object to the group use lv_group_add_obj(g, obj)
.
To associate a group with an input device use lv_indev_set_group(indev, g)
, where indev
is the return value of lv_indev_drv_register()
Keys¶
There are some predefined keys which have special meaning:
LV_KEY_NEXT Focus on the next object
LV_KEY_PREV Focus on the previous object
LV_KEY_ENTER Triggers
LV_EVENT_PRESSED/CLICKED/LONG_PRESSED
etc. eventsLV_KEY_UP Increase value or move upwards
LV_KEY_DOWN Decrease value or move downwards
LV_KEY_RIGHT Increase value or move to the right
LV_KEY_LEFT Decrease value or move to the left
LV_KEY_ESC Close or exit (E.g. close a Drop down list)
LV_KEY_DEL Delete (E.g. a character on the right in a Text area)
LV_KEY_BACKSPACE Delete a character on the left (E.g. in a Text area)
LV_KEY_HOME Go to the beginning/top (E.g. in a Text area)
LV_KEY_END Go to the end (E.g. in a Text area)
The most important special keys are LV_KEY_NEXT/PREV
, LV_KEY_ENTER
and LV_KEY_UP/DOWN/LEFT/RIGHT
.
In your read_cb
function, you should translate some of your keys to these special keys to support navigation in a group and interact with selected objects.
Usually, it's enough to use only LV_KEY_LEFT/RIGHT
because most objects can be fully controlled with them.
With an encoder you should use only LV_KEY_LEFT
, LV_KEY_RIGHT
, and LV_KEY_ENTER
.
Default group¶
Interactive widgets - such as buttons, checkboxes, sliders, etc. - can be automatically added to a default group.
Just create a group with lv_group_t * g = lv_group_create();
and set the default group with lv_group_set_default(g);
Don't forget to assign one or more input devices to the default group with lv_indev_set_group(my_indev, g);
.
Styling¶
If an object is focused either by clicking it via touchpad or focused via an encoder or keypad it goes to the LV_STATE_FOCUSED
state. Hence, focused styles will be applied to it.
If an object switches to edit mode it enters the LV_STATE_FOCUSED | LV_STATE_EDITED
states so these style properties will be shown.
For a more detailed description read the Style section.
API¶
Input device¶
Functions
-
void lv_indev_read_timer_cb(lv_timer_t *timer)¶
Called periodically to read the input devices
- Parameters
timer -- pointer to a timer to read
-
void lv_indev_enable(lv_indev_t *indev, bool en)¶
-
lv_indev_t *lv_indev_get_act(void)¶
Get the currently processed input device. Can be used in action functions too.
- Returns
pointer to the currently processed input device or NULL if no input device processing right now
-
lv_indev_type_t lv_indev_get_type(const lv_indev_t *indev)¶
Get the type of an input device
- Parameters
indev -- pointer to an input device
- Returns
the type of the input device from
lv_hal_indev_type_t
(LV_INDEV_TYPE_...
)
-
void lv_indev_reset(lv_indev_t *indev, lv_obj_t *obj)¶
Reset one or all input devices
- Parameters
indev -- pointer to an input device to reset or NULL to reset all of them
obj -- pointer to an object which triggers the reset.
-
void lv_indev_reset_long_press(lv_indev_t *indev)¶
Reset the long press state of an input device
- Parameters
indev -- pointer to an input device
-
void lv_indev_set_cursor(lv_indev_t *indev, lv_obj_t *cur_obj)¶
Set a cursor for a pointer input device (for LV_INPUT_TYPE_POINTER and LV_INPUT_TYPE_BUTTON)
- Parameters
indev -- pointer to an input device
cur_obj -- pointer to an object to be used as cursor
-
void lv_indev_set_group(lv_indev_t *indev, lv_group_t *group)¶
Set a destination group for a keypad input device (for LV_INDEV_TYPE_KEYPAD)
- Parameters
indev -- pointer to an input device
group -- point to a group
-
void lv_indev_set_button_points(lv_indev_t *indev, const lv_point_t points[])¶
Set the an array of points for LV_INDEV_TYPE_BUTTON. These points will be assigned to the buttons to press a specific point on the screen
- Parameters
indev -- pointer to an input device
group -- point to a group
-
void lv_indev_get_point(const lv_indev_t *indev, lv_point_t *point)¶
Get the last point of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
- Parameters
indev -- pointer to an input device
point -- pointer to a point to store the result
-
lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t *indev)¶
Get the current gesture direct
- Parameters
indev -- pointer to an input device
- Returns
current gesture direct
-
uint32_t lv_indev_get_key(const lv_indev_t *indev)¶
Get the last pressed key of an input device (for LV_INDEV_TYPE_KEYPAD)
- Parameters
indev -- pointer to an input device
- Returns
the last pressed key (0 on error)
-
lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t *indev)¶
Check the current scroll direction of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
- Parameters
indev -- pointer to an input device
- Returns
LV_DIR_NONE: no scrolling now LV_DIR_HOR/VER
-
lv_obj_t *lv_indev_get_scroll_obj(const lv_indev_t *indev)¶
Get the currently scrolled object (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
- Parameters
indev -- pointer to an input device
- Returns
pointer to the currently scrolled object or NULL if no scrolling by this indev
-
void lv_indev_get_vect(const lv_indev_t *indev, lv_point_t *point)¶
Get the movement vector of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
- Parameters
indev -- pointer to an input device
point -- pointer to a point to store the types.pointer.vector
-
void lv_indev_wait_release(lv_indev_t *indev)¶
Do nothing until the next release
- Parameters
indev -- pointer to an input device
-
lv_obj_t *lv_indev_get_obj_act(void)¶
Gets a pointer to the currently active object in the currently processed input device.
- Returns
pointer to currently active object or NULL if no active object
-
lv_timer_t *lv_indev_get_read_timer(lv_disp_t *indev)¶
Get a pointer to the indev read timer to modify its parameters with
lv_timer_...
functions.- Parameters
indev -- pointer to an input device
- Returns
pointer to the indev read refresher timer. (NULL on error)
-
lv_obj_t *lv_indev_search_obj(lv_obj_t *obj, lv_point_t *point)¶
Search the most top, clickable object by a point
- Parameters
obj -- pointer to a start object, typically the screen
point -- pointer to a point for searching the most top child
- Returns
pointer to the found object or NULL if there was no suitable object
Groups¶
Typedefs
-
typedef uint8_t lv_key_t¶
-
typedef void (*lv_group_focus_cb_t)(struct _lv_group_t*)¶
-
typedef struct _lv_group_t lv_group_t¶
Groups can be used to logically hold objects so that they can be individually focused. They are NOT for laying out objects on a screen (try layouts for that).
Enums
-
enum [anonymous]¶
Values:
-
enumerator LV_KEY_UP¶
-
enumerator LV_KEY_DOWN¶
-
enumerator LV_KEY_RIGHT¶
-
enumerator LV_KEY_LEFT¶
-
enumerator LV_KEY_ESC¶
-
enumerator LV_KEY_DEL¶
-
enumerator LV_KEY_BACKSPACE¶
-
enumerator LV_KEY_ENTER¶
-
enumerator LV_KEY_NEXT¶
-
enumerator LV_KEY_PREV¶
-
enumerator LV_KEY_HOME¶
-
enumerator LV_KEY_END¶
-
enumerator LV_KEY_UP¶
Functions
-
void _lv_group_init(void)¶
Init. the group module
- Remark
Internal function, do not call directly.
-
lv_group_t *lv_group_create(void)¶
Create a new object group
- Returns
pointer to the new object group
-
void lv_group_del(lv_group_t *group)¶
Delete a group object
- Parameters
group -- pointer to a group
-
void lv_group_set_default(lv_group_t *group)¶
Set a default group. New object are added to this group if it's enabled in their class with
add_to_def_group = true
- Parameters
group -- pointer to a group (can be
NULL
)
-
lv_group_t *lv_group_get_default(void)¶
Get the default group
- Returns
pointer to the default group
-
void lv_group_add_obj(lv_group_t *group, struct _lv_obj_t *obj)¶
Add an object to a group
- Parameters
group -- pointer to a group
obj -- pointer to an object to add
-
void lv_group_swap_obj(struct _lv_obj_t *obj1, struct _lv_obj_t *obj2)¶
Swap 2 object in a group. The object must be in the same group
- Parameters
obj1 -- pointer to an object
obj2 -- pointer to an other object
-
void lv_group_remove_obj(struct _lv_obj_t *obj)¶
Remove an object from its group
- Parameters
obj -- pointer to an object to remove
-
void lv_group_remove_all_objs(lv_group_t *group)¶
Remove all objects from a group
- Parameters
group -- pointer to a group
-
void lv_group_focus_obj(struct _lv_obj_t *obj)¶
Focus on an object (defocus the current)
- Parameters
obj -- pointer to an object to focus on
-
void lv_group_focus_next(lv_group_t *group)¶
Focus the next object in a group (defocus the current)
- Parameters
group -- pointer to a group
-
void lv_group_focus_prev(lv_group_t *group)¶
Focus the previous object in a group (defocus the current)
- Parameters
group -- pointer to a group
-
void lv_group_focus_freeze(lv_group_t *group, bool en)¶
Do not let to change the focus from the current object
- Parameters
group -- pointer to a group
en -- true: freeze, false: release freezing (normal mode)
-
lv_res_t lv_group_send_data(lv_group_t *group, uint32_t c)¶
Send a control character to the focuses object of a group
- Parameters
group -- pointer to a group
c -- a character (use LV_KEY_.. to navigate)
- Returns
result of focused object in group.
-
void lv_group_set_focus_cb(lv_group_t *group, lv_group_focus_cb_t focus_cb)¶
Set a function for a group which will be called when a new object is focused
- Parameters
group -- pointer to a group
focus_cb -- the call back function or NULL if unused
-
void lv_group_set_refocus_policy(lv_group_t *group, lv_group_refocus_policy_t policy)¶
Set whether the next or previous item in a group is focused if the currently focused obj is deleted.
- Parameters
group -- pointer to a group
policy -- new refocus policy enum
-
void lv_group_set_editing(lv_group_t *group, bool edit)¶
Manually set the current mode (edit or navigate).
- Parameters
group -- pointer to group
edit -- true: edit mode; false: navigate mode
-
void lv_group_set_wrap(lv_group_t *group, bool en)¶
Set whether focus next/prev will allow wrapping from first->last or last->first object.
- Parameters
group -- pointer to group
en -- true: wrapping enabled; false: wrapping disabled
-
struct _lv_obj_t *lv_group_get_focused(const lv_group_t *group)¶
Get the focused object or NULL if there isn't one
- Parameters
group -- pointer to a group
- Returns
pointer to the focused object
-
lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t *group)¶
Get the focus callback function of a group
- Parameters
group -- pointer to a group
- Returns
the call back function or NULL if not set
-
bool lv_group_get_editing(const lv_group_t *group)¶
Get the current mode (edit or navigate).
- Parameters
group -- pointer to group
- Returns
true: edit mode; false: navigate mode
-
bool lv_group_get_wrap(lv_group_t *group)¶
Get whether focus next/prev will allow wrapping from first->last or last->first object.
- Parameters
group -- pointer to group
en -- true: wrapping enabled; false: wrapping disabled
-
uint32_t lv_group_get_obj_count(lv_group_t *group)¶
Get the number of object in the group
- Parameters
group -- pointer to a group
- Returns
number of objects in the group
-
struct _lv_group_t¶
- #include <lv_group.h>
Groups can be used to logically hold objects so that they can be individually focused. They are NOT for laying out objects on a screen (try layouts for that).
Public Members
-
lv_ll_t obj_ll¶
Linked list to store the objects in the group
-
lv_group_focus_cb_t focus_cb¶
A function to call when a new object is focused (optional)
-
void *user_data¶
-
uint8_t frozen¶
1: can't focus to new object
-
uint8_t editing¶
1: Edit mode, 0: Navigate mode
-
uint8_t refocus_policy¶
1: Focus prev if focused on deletion. 0: Focus next if focused on deletion.
-
uint8_t wrap¶
1: Focus next/prev can wrap at end of list. 0: Focus next/prev stops at end of list.
-
lv_ll_t obj_ll¶