mirror of
https://github.com/lvgl/lvgl.git
synced 2026-05-29 14:46:29 +08:00
fix(indev): fix lv_indev_gesture write access error (#7843)
Arduino Lint / lint (push) Waiting to run
MicroPython CI / Build esp32 port (push) Waiting to run
MicroPython CI / Build rp2 port (push) Waiting to run
MicroPython CI / Build stm32 port (push) Waiting to run
MicroPython CI / Build unix port (push) Waiting to run
C/C++ CI / Build OPTIONS_16BIT - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_24BIT - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_FULL_32BIT - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_NORMAL_8BIT - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_SDL - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_VG_LITE - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_16BIT - cl - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_16BIT - gcc - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_24BIT - cl - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_24BIT - gcc - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_FULL_32BIT - cl - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_FULL_32BIT - gcc - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_VG_LITE - cl - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_VG_LITE - gcc - Windows (push) Waiting to run
C/C++ CI / Build ESP IDF ESP32S3 (push) Waiting to run
C/C++ CI / Run tests with 32bit build (push) Waiting to run
C/C++ CI / Run tests with 64bit build (push) Waiting to run
BOM Check / bom-check (push) Waiting to run
Verify that lv_conf_internal.h matches repository state / verify-conf-internal (push) Waiting to run
Verify the widget property name / verify-property-name (push) Waiting to run
Verify code formatting / verify-formatting (push) Waiting to run
Build docs / build-and-deploy (push) Waiting to run
Test API JSON generator / Test API JSON (push) Waiting to run
Check Makefile / Build using Makefile (push) Waiting to run
Check Makefile for UEFI / Build using Makefile for UEFI (push) Waiting to run
Port repo release update / run-release-branch-updater (push) Waiting to run
Verify Kconfig / verify-kconfig (push) Waiting to run
Arduino Lint / lint (push) Waiting to run
MicroPython CI / Build esp32 port (push) Waiting to run
MicroPython CI / Build rp2 port (push) Waiting to run
MicroPython CI / Build stm32 port (push) Waiting to run
MicroPython CI / Build unix port (push) Waiting to run
C/C++ CI / Build OPTIONS_16BIT - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_24BIT - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_FULL_32BIT - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_NORMAL_8BIT - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_SDL - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_VG_LITE - Ubuntu (push) Waiting to run
C/C++ CI / Build OPTIONS_16BIT - cl - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_16BIT - gcc - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_24BIT - cl - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_24BIT - gcc - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_FULL_32BIT - cl - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_FULL_32BIT - gcc - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_VG_LITE - cl - Windows (push) Waiting to run
C/C++ CI / Build OPTIONS_VG_LITE - gcc - Windows (push) Waiting to run
C/C++ CI / Build ESP IDF ESP32S3 (push) Waiting to run
C/C++ CI / Run tests with 32bit build (push) Waiting to run
C/C++ CI / Run tests with 64bit build (push) Waiting to run
BOM Check / bom-check (push) Waiting to run
Verify that lv_conf_internal.h matches repository state / verify-conf-internal (push) Waiting to run
Verify the widget property name / verify-property-name (push) Waiting to run
Verify code formatting / verify-formatting (push) Waiting to run
Build docs / build-and-deploy (push) Waiting to run
Test API JSON generator / Test API JSON (push) Waiting to run
Check Makefile / Build using Makefile (push) Waiting to run
Check Makefile for UEFI / Build using Makefile for UEFI (push) Waiting to run
Port repo release update / run-release-branch-updater (push) Waiting to run
Verify Kconfig / verify-kconfig (push) Waiting to run
Signed-off-by: liuhongchao <liuhongchao@xiaomi.com>
This commit is contained in:
@@ -66,9 +66,8 @@ void lv_indev_set_pinch_up_threshold(lv_indev_gesture_recognizer_t * recognizer,
|
|||||||
LV_ASSERT(threshold > 1.0f);
|
LV_ASSERT(threshold > 1.0f);
|
||||||
|
|
||||||
if(recognizer->config == NULL) {
|
if(recognizer->config == NULL) {
|
||||||
|
recognizer->config = lv_malloc_zeroed(sizeof(lv_indev_gesture_configuration_t));
|
||||||
recognizer->config = lv_malloc(sizeof(lv_indev_gesture_configuration_t));
|
LV_ASSERT_MALLOC(recognizer->config);
|
||||||
LV_ASSERT(recognizer->config != NULL);
|
|
||||||
recognizer->config->pinch_down_threshold = LV_GESTURE_PINCH_DOWN_THRESHOLD;
|
recognizer->config->pinch_down_threshold = LV_GESTURE_PINCH_DOWN_THRESHOLD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,9 +80,8 @@ void lv_indev_set_pinch_down_threshold(lv_indev_gesture_recognizer_t * recognize
|
|||||||
LV_ASSERT(threshold < 1.0f);
|
LV_ASSERT(threshold < 1.0f);
|
||||||
|
|
||||||
if(recognizer->config == NULL) {
|
if(recognizer->config == NULL) {
|
||||||
|
recognizer->config = lv_malloc_zeroed(sizeof(lv_indev_gesture_configuration_t));
|
||||||
recognizer->config = lv_malloc(sizeof(lv_indev_gesture_configuration_t));
|
LV_ASSERT_MALLOC(recognizer->config);
|
||||||
LV_ASSERT(recognizer->config != NULL);
|
|
||||||
recognizer->config->pinch_up_threshold = LV_GESTURE_PINCH_UP_THRESHOLD;
|
recognizer->config->pinch_up_threshold = LV_GESTURE_PINCH_UP_THRESHOLD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +114,6 @@ bool lv_indev_recognizer_is_active(lv_indev_gesture_recognizer_t * recognizer)
|
|||||||
float lv_event_get_pinch_scale(lv_event_t * gesture_event)
|
float lv_event_get_pinch_scale(lv_event_t * gesture_event)
|
||||||
{
|
{
|
||||||
lv_indev_gesture_recognizer_t * recognizer;
|
lv_indev_gesture_recognizer_t * recognizer;
|
||||||
|
|
||||||
if((recognizer = lv_indev_get_gesture_recognizer(gesture_event)) == NULL) {
|
if((recognizer = lv_indev_get_gesture_recognizer(gesture_event)) == NULL) {
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
@@ -134,13 +131,11 @@ void lv_indev_get_gesture_center_point(lv_indev_gesture_recognizer_t * recognize
|
|||||||
|
|
||||||
point->x = recognizer->info->center.x;
|
point->x = recognizer->info->center.x;
|
||||||
point->y = recognizer->info->center.y;
|
point->y = recognizer->info->center.y;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lv_indev_gesture_state_t lv_event_get_gesture_state(lv_event_t * gesture_event)
|
lv_indev_gesture_state_t lv_event_get_gesture_state(lv_event_t * gesture_event)
|
||||||
{
|
{
|
||||||
lv_indev_gesture_recognizer_t * recognizer;
|
lv_indev_gesture_recognizer_t * recognizer;
|
||||||
|
|
||||||
if((recognizer = lv_indev_get_gesture_recognizer(gesture_event)) == NULL) {
|
if((recognizer = lv_indev_get_gesture_recognizer(gesture_event)) == NULL) {
|
||||||
return LV_INDEV_GESTURE_STATE_NONE;
|
return LV_INDEV_GESTURE_STATE_NONE;
|
||||||
}
|
}
|
||||||
@@ -175,7 +170,6 @@ void lv_indev_set_gesture_data(lv_indev_data_t * data, lv_indev_gesture_recogniz
|
|||||||
|
|
||||||
if(is_active == false) {
|
if(is_active == false) {
|
||||||
data->state = LV_INDEV_STATE_RELEASED;
|
data->state = LV_INDEV_STATE_RELEASED;
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
data->state = LV_INDEV_STATE_PRESSED;
|
data->state = LV_INDEV_STATE_PRESSED;
|
||||||
@@ -215,9 +209,8 @@ void lv_indev_gesture_detect_pinch(lv_indev_gesture_recognizer_t * recognizer, l
|
|||||||
|
|
||||||
if(r->config == NULL) {
|
if(r->config == NULL) {
|
||||||
LV_LOG_TRACE("init gesture configuration - set defaults");
|
LV_LOG_TRACE("init gesture configuration - set defaults");
|
||||||
r->config = lv_malloc(sizeof(lv_indev_gesture_configuration_t));
|
r->config = lv_malloc_zeroed(sizeof(lv_indev_gesture_configuration_t));
|
||||||
|
LV_ASSERT_MALLOC(r->config);
|
||||||
LV_ASSERT(r->config != NULL);
|
|
||||||
|
|
||||||
r->config->pinch_up_threshold = LV_GESTURE_PINCH_UP_THRESHOLD;
|
r->config->pinch_up_threshold = LV_GESTURE_PINCH_UP_THRESHOLD;
|
||||||
r->config->pinch_down_threshold = LV_GESTURE_PINCH_DOWN_THRESHOLD;
|
r->config->pinch_down_threshold = LV_GESTURE_PINCH_DOWN_THRESHOLD;
|
||||||
@@ -225,7 +218,6 @@ void lv_indev_gesture_detect_pinch(lv_indev_gesture_recognizer_t * recognizer, l
|
|||||||
|
|
||||||
/* Process collected touch events */
|
/* Process collected touch events */
|
||||||
for(i = 0; i < touch_cnt; i++) {
|
for(i = 0; i < touch_cnt; i++) {
|
||||||
|
|
||||||
touch = touches;
|
touch = touches;
|
||||||
process_touch_event(touch, r->info);
|
process_touch_event(touch, r->info);
|
||||||
touches++;
|
touches++;
|
||||||
@@ -236,9 +228,7 @@ void lv_indev_gesture_detect_pinch(lv_indev_gesture_recognizer_t * recognizer, l
|
|||||||
|
|
||||||
LV_LOG_TRACE("Current finger count: %d state: %d", r->info->finger_cnt, r->state);
|
LV_LOG_TRACE("Current finger count: %d state: %d", r->info->finger_cnt, r->state);
|
||||||
|
|
||||||
|
|
||||||
if(r->info->finger_cnt == 2) {
|
if(r->info->finger_cnt == 2) {
|
||||||
|
|
||||||
switch(r->state) {
|
switch(r->state) {
|
||||||
case LV_INDEV_GESTURE_STATE_ENDED:
|
case LV_INDEV_GESTURE_STATE_ENDED:
|
||||||
case LV_INDEV_GESTURE_STATE_CANCELED:
|
case LV_INDEV_GESTURE_STATE_CANCELED:
|
||||||
@@ -262,7 +252,7 @@ void lv_indev_gesture_detect_pinch(lv_indev_gesture_recognizer_t * recognizer, l
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LV_ASSERT(r->config != NULL);
|
LV_ASSERT_NULL(r->config);
|
||||||
|
|
||||||
if(r->info->scale > r->config->pinch_up_threshold ||
|
if(r->info->scale > r->config->pinch_up_threshold ||
|
||||||
r->info->scale < r->config->pinch_down_threshold) {
|
r->info->scale < r->config->pinch_down_threshold) {
|
||||||
@@ -284,10 +274,8 @@ void lv_indev_gesture_detect_pinch(lv_indev_gesture_recognizer_t * recognizer, l
|
|||||||
default:
|
default:
|
||||||
LV_ASSERT_MSG(true, "invalid gesture recognizer state");
|
LV_ASSERT_MSG(true, "invalid gesture recognizer state");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
switch(r->state) {
|
switch(r->state) {
|
||||||
case LV_INDEV_GESTURE_STATE_RECOGNIZED:
|
case LV_INDEV_GESTURE_STATE_RECOGNIZED:
|
||||||
/* Gesture has ended */
|
/* Gesture has ended */
|
||||||
@@ -340,21 +328,22 @@ lv_indev_gesture_recognizer_t * lv_indev_get_gesture_recognizer(lv_event_t * ges
|
|||||||
*/
|
*/
|
||||||
static void reset_recognizer(lv_indev_gesture_recognizer_t * recognizer)
|
static void reset_recognizer(lv_indev_gesture_recognizer_t * recognizer)
|
||||||
{
|
{
|
||||||
size_t motion_arr_sz;
|
uint8_t finger_cnt;
|
||||||
lv_indev_gesture_t * info;
|
lv_indev_gesture_t * info;
|
||||||
lv_indev_gesture_configuration_t * conf;
|
lv_indev_gesture_configuration_t * conf;
|
||||||
|
|
||||||
if(recognizer == NULL) return;
|
if(recognizer == NULL) return;
|
||||||
|
|
||||||
|
finger_cnt = recognizer->info->finger_cnt;
|
||||||
info = recognizer->info;
|
info = recognizer->info;
|
||||||
conf = recognizer->config;
|
conf = recognizer->config;
|
||||||
|
|
||||||
/* Set everything to zero but preserve the motion descriptors,
|
/* Set everything to zero but preserve the motion descriptors,
|
||||||
* which are located at the start of the lv_indev_gesture_t struct */
|
* which are located at the start of the lv_indev_gesture_t struct */
|
||||||
motion_arr_sz = sizeof(lv_indev_gesture_motion_t) * LV_GESTURE_MAX_POINTS;
|
lv_memzero((uint8_t *)info + sizeof(info->motions), sizeof(lv_indev_gesture_t) - sizeof(info->motions));
|
||||||
lv_memset(info + motion_arr_sz, 0, sizeof(lv_indev_gesture_t) - motion_arr_sz);
|
lv_memzero(recognizer, sizeof(lv_indev_gesture_recognizer_t));
|
||||||
lv_memset(recognizer, 0, sizeof(lv_indev_gesture_recognizer_t));
|
|
||||||
|
|
||||||
|
info->finger_cnt = finger_cnt;
|
||||||
recognizer->scale = info->scale = 1;
|
recognizer->scale = info->scale = 1;
|
||||||
recognizer->info = info;
|
recognizer->info = info;
|
||||||
recognizer->config = conf;
|
recognizer->config = conf;
|
||||||
@@ -369,10 +358,9 @@ static lv_indev_gesture_t * init_gesture_info(void)
|
|||||||
lv_indev_gesture_t * info;
|
lv_indev_gesture_t * info;
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
info = lv_malloc(sizeof(lv_indev_gesture_t));
|
info = lv_malloc_zeroed(sizeof(lv_indev_gesture_t));
|
||||||
LV_ASSERT_NULL(info);
|
LV_ASSERT_MALLOC(info);
|
||||||
|
|
||||||
lv_memset(info, 0, sizeof(lv_indev_gesture_t));
|
|
||||||
info->scale = 1;
|
info->scale = 1;
|
||||||
|
|
||||||
for(i = 0; i < LV_GESTURE_MAX_POINTS; i++) {
|
for(i = 0; i < LV_GESTURE_MAX_POINTS; i++) {
|
||||||
@@ -399,7 +387,6 @@ static lv_indev_gesture_motion_t * get_motion(uint8_t id, lv_indev_gesture_t * i
|
|||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -419,7 +406,6 @@ static int8_t get_motion_idx(uint8_t id, lv_indev_gesture_t * info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -432,13 +418,12 @@ static void process_touch_event(lv_indev_touch_data_t * touch, lv_indev_gesture_
|
|||||||
lv_indev_gesture_t * g = info;
|
lv_indev_gesture_t * g = info;
|
||||||
lv_indev_gesture_motion_t * motion;
|
lv_indev_gesture_motion_t * motion;
|
||||||
int8_t motion_idx;
|
int8_t motion_idx;
|
||||||
uint8_t len;
|
int8_t len;
|
||||||
|
|
||||||
motion_idx = get_motion_idx(touch->id, g);
|
motion_idx = get_motion_idx(touch->id, g);
|
||||||
|
|
||||||
if(motion_idx == -1 && touch->state == LV_INDEV_STATE_PRESSED) {
|
if(motion_idx == -1 && touch->state == LV_INDEV_STATE_PRESSED) {
|
||||||
|
if(g->finger_cnt >= LV_GESTURE_MAX_POINTS) {
|
||||||
if(g->finger_cnt == LV_GESTURE_MAX_POINTS) {
|
|
||||||
/* Skip touch */
|
/* Skip touch */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -453,41 +438,45 @@ static void process_touch_event(lv_indev_touch_data_t * touch, lv_indev_gesture_
|
|||||||
motion->state = touch->state;
|
motion->state = touch->state;
|
||||||
|
|
||||||
g->finger_cnt++;
|
g->finger_cnt++;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(motion_idx >= 0 && touch->state == LV_INDEV_STATE_RELEASED) {
|
else if(motion_idx >= 0 && touch->state == LV_INDEV_STATE_RELEASED) {
|
||||||
|
|
||||||
if(motion_idx == g->finger_cnt - 1) {
|
if(motion_idx == g->finger_cnt - 1) {
|
||||||
|
|
||||||
/* Mark last item as un-used */
|
/* Mark last item as un-used */
|
||||||
motion = get_motion(touch->id, g);
|
motion = get_motion(touch->id, g);
|
||||||
motion->finger = -1;
|
motion->finger = -1;
|
||||||
motion->state = touch->state;
|
motion->state = touch->state;
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
/* Move back by one */
|
/* Move back by one */
|
||||||
len = (g->finger_cnt - 1) - motion_idx;
|
len = (g->finger_cnt - 1) - motion_idx;
|
||||||
lv_memmove(g->motions + motion_idx,
|
|
||||||
g->motions + motion_idx + 1,
|
|
||||||
sizeof(lv_indev_gesture_motion_t) * len);
|
|
||||||
|
|
||||||
g->motions[g->finger_cnt - 1].finger = -1;
|
if(len > 0) {
|
||||||
|
lv_memmove(g->motions + motion_idx,
|
||||||
|
g->motions + motion_idx + 1,
|
||||||
|
sizeof(lv_indev_gesture_motion_t) * len);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(g->finger_cnt > 0) {
|
||||||
|
g->motions[g->finger_cnt - 1].finger = -1;
|
||||||
|
}
|
||||||
|
|
||||||
LV_ASSERT(g->motions[motion_idx + 1].finger == -1);
|
LV_ASSERT(g->motions[motion_idx + 1].finger == -1);
|
||||||
|
|
||||||
}
|
}
|
||||||
g->finger_cnt--;
|
|
||||||
|
|
||||||
|
if(g->finger_cnt > 0) {
|
||||||
|
g->finger_cnt--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g->finger_cnt = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(motion_idx >= 0) {
|
else if(motion_idx >= 0) {
|
||||||
|
|
||||||
motion = get_motion(touch->id, g);
|
motion = get_motion(touch->id, g);
|
||||||
motion->point.x = touch->point.x;
|
motion->point.x = touch->point.x;
|
||||||
motion->point.y = touch->point.y;
|
motion->point.y = touch->point.y;
|
||||||
motion->state = touch->state;
|
motion->state = touch->state;
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LV_LOG_TRACE("Ignore extra touch id: %d", touch->id);
|
LV_LOG_TRACE("Ignore extra touch id: %d", touch->id);
|
||||||
@@ -525,7 +514,6 @@ static void gesture_update_center_point(lv_indev_gesture_t * gesture, int touch_
|
|||||||
x += motion->point.x;
|
x += motion->point.x;
|
||||||
y += motion->point.y;
|
y += motion->point.y;
|
||||||
touch_cnt++;
|
touch_cnt++;
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
break;
|
break;
|
||||||
@@ -536,7 +524,6 @@ static void gesture_update_center_point(lv_indev_gesture_t * gesture, int touch_
|
|||||||
g->center.y = y / touch_cnt;
|
g->center.y = y / touch_cnt;
|
||||||
|
|
||||||
for(i = 0; i < touch_points_nb; i++) {
|
for(i = 0; i < touch_points_nb; i++) {
|
||||||
|
|
||||||
motion = &g->motions[i];
|
motion = &g->motions[i];
|
||||||
if(motion->finger >= 0) {
|
if(motion->finger >= 0) {
|
||||||
delta_x[i] = motion->point.x - g->center.x;
|
delta_x[i] = motion->point.x - g->center.x;
|
||||||
@@ -545,7 +532,6 @@ static void gesture_update_center_point(lv_indev_gesture_t * gesture, int touch_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(i = 0; i < touch_points_nb; i++) {
|
for(i = 0; i < touch_points_nb; i++) {
|
||||||
|
|
||||||
motion = &g->motions[i];
|
motion = &g->motions[i];
|
||||||
if(motion->finger >= 0) {
|
if(motion->finger >= 0) {
|
||||||
g->scale_factors_x[i] = delta_x[i] / scale_factor;
|
g->scale_factors_x[i] = delta_x[i] / scale_factor;
|
||||||
@@ -580,7 +566,6 @@ static void gesture_calculate_factors(lv_indev_gesture_t * gesture, int touch_po
|
|||||||
center_x += motion->point.x;
|
center_x += motion->point.x;
|
||||||
center_y += motion->point.y;
|
center_y += motion->point.y;
|
||||||
touch_cnt++;
|
touch_cnt++;
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
break;
|
break;
|
||||||
@@ -611,7 +596,6 @@ static void gesture_calculate_factors(lv_indev_gesture_t * gesture, int touch_po
|
|||||||
|
|
||||||
g->center.x = (int32_t)center_x;
|
g->center.x = (int32_t)center_x;
|
||||||
g->center.y = (int32_t)center_y;
|
g->center.y = (int32_t)center_y;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* LV_USE_GESTURE_RECOGNITION */
|
#endif /* LV_USE_GESTURE_RECOGNITION */
|
||||||
|
|||||||
Reference in New Issue
Block a user