98 lines
2.1 KiB
C
98 lines
2.1 KiB
C
|
/**
|
||
|
* @file mousewheel.c
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*********************
|
||
|
* INCLUDES
|
||
|
*********************/
|
||
|
#include "mousewheel.h"
|
||
|
#if USE_MOUSEWHEEL
|
||
|
|
||
|
/*********************
|
||
|
* DEFINES
|
||
|
*********************/
|
||
|
|
||
|
/**********************
|
||
|
* TYPEDEFS
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* STATIC PROTOTYPES
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* STATIC VARIABLES
|
||
|
**********************/
|
||
|
static int16_t enc_diff = 0;
|
||
|
static lv_indev_state_t state = LV_INDEV_STATE_RELEASED;
|
||
|
|
||
|
/**********************
|
||
|
* MACROS
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* GLOBAL FUNCTIONS
|
||
|
**********************/
|
||
|
|
||
|
/**
|
||
|
* Initialize the mousewheel
|
||
|
*/
|
||
|
void mousewheel_init(void)
|
||
|
{
|
||
|
/*Nothing to init*/
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get encoder (i.e. mouse wheel) ticks difference and pressed state
|
||
|
* @param indev_drv pointer to the related input device driver
|
||
|
* @param data store the read data here
|
||
|
*/
|
||
|
void mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||
|
{
|
||
|
(void) indev_drv; /*Unused*/
|
||
|
|
||
|
data->state = state;
|
||
|
data->enc_diff = enc_diff;
|
||
|
enc_diff = 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* It is called periodically from the SDL thread to check mouse wheel state
|
||
|
* @param event describes the event
|
||
|
*/
|
||
|
void mousewheel_handler(SDL_Event * event)
|
||
|
{
|
||
|
switch(event->type) {
|
||
|
case SDL_MOUSEWHEEL:
|
||
|
// Scroll down (y = -1) means positive encoder turn,
|
||
|
// so invert it
|
||
|
#ifdef __EMSCRIPTEN__
|
||
|
/*Escripten scales it wrong*/
|
||
|
if(event->wheel.y < 0) enc_diff++;
|
||
|
if(event->wheel.y > 0) enc_diff--;
|
||
|
#else
|
||
|
enc_diff = -event->wheel.y;
|
||
|
#endif
|
||
|
break;
|
||
|
case SDL_MOUSEBUTTONDOWN:
|
||
|
if(event->button.button == SDL_BUTTON_MIDDLE) {
|
||
|
state = LV_INDEV_STATE_PRESSED;
|
||
|
}
|
||
|
break;
|
||
|
case SDL_MOUSEBUTTONUP:
|
||
|
if(event->button.button == SDL_BUTTON_MIDDLE) {
|
||
|
state = LV_INDEV_STATE_RELEASED;
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**********************
|
||
|
* STATIC FUNCTIONS
|
||
|
**********************/
|
||
|
|
||
|
#endif
|