Files
lvgl/src/dev/sdl/lv_sdl_mousewheel.c
2023-11-06 15:10:56 +01:00

127 lines
3.0 KiB
C

/**
* @file lv_sdl_mousewheel.c
*
*/
/*********************
* INCLUDES
*********************/
#include "lv_sdl_mousewheel.h"
#if LV_USE_SDL
#include "../../core/lv_group.h"
#include "../../indev/lv_indev_private.h"
#include "../../stdlib/lv_string.h"
#include LV_SDL_INCLUDE_PATH
/*********************
* DEFINES
*********************/
/**********************
* STATIC PROTOTYPES
**********************/
static void sdl_mousewheel_read(lv_indev_t * indev, lv_indev_data_t * data);
/**********************
* STATIC VARIABLES
**********************/
typedef struct {
int16_t diff;
lv_indev_state_t state;
} lv_sdl_mousewheel_t;
/**********************
* GLOBAL FUNCTIONS
**********************/
lv_indev_t * lv_sdl_mousewheel_create(void)
{
lv_sdl_mousewheel_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_mousewheel_t));
LV_ASSERT_MALLOC(dsc);
if(dsc == NULL) return NULL;
lv_indev_t * indev = lv_indev_create();
if(indev == NULL) {
lv_free(dsc);
return NULL;
}
lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER);
lv_indev_set_read_cb(indev, sdl_mousewheel_read);
lv_indev_set_driver_data(indev, dsc);
return indev;
}
/**********************
* STATIC FUNCTIONS
**********************/
static void sdl_mousewheel_read(lv_indev_t * indev, lv_indev_data_t * data)
{
lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev);
data->state = dsc->state;
data->enc_diff = dsc->diff;
dsc->diff = 0;
}
void _lv_sdl_mousewheel_handler(SDL_Event * event)
{
uint32_t win_id = UINT32_MAX;
switch(event->type) {
case SDL_MOUSEWHEEL:
win_id = event->wheel.windowID;
break;
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
win_id = event->button.windowID;
break;
default:
return;
}
lv_display_t * disp = _lv_sdl_get_disp_from_win_id(win_id);
/*Find a suitable indev*/
lv_indev_t * indev = lv_indev_get_next(NULL);
while(indev) {
if(lv_indev_get_disp(indev) == disp && lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) {
break;
}
indev = lv_indev_get_next(indev);
}
if(indev == NULL) return;
lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev);
switch(event->type) {
case SDL_MOUSEWHEEL:
#ifdef __EMSCRIPTEN__
/*Escripten scales it wrong*/
if(event->wheel.y < 0) dsc->diff++;
if(event->wheel.y > 0) dsc->diff--;
#else
dsc->diff = -event->wheel.y;
#endif
break;
case SDL_MOUSEBUTTONDOWN:
if(event->button.button == SDL_BUTTON_MIDDLE) {
dsc->state = LV_INDEV_STATE_PRESSED;
}
break;
case SDL_MOUSEBUTTONUP:
if(event->button.button == SDL_BUTTON_MIDDLE) {
dsc->state = LV_INDEV_STATE_RELEASED;
}
break;
default:
break;
}
}
#endif /*LV_USE_SDL*/