127 lines
3.0 KiB
C
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*/
|
|
|