mirror of https://github.com/encounter/SDL.git
Added hints SDL_HINT_MOUSE_DOUBLE_CLICK_TIME and SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS to allow tuning double-click sensitivity.
Also increased the default double-click radius to 32 pixels to be more forgiving for touch interfaces
This commit is contained in:
parent
66294d31df
commit
6b3e893105
|
@ -262,6 +262,16 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
#define SDL_HINT_GRAB_KEYBOARD "SDL_GRAB_KEYBOARD"
|
#define SDL_HINT_GRAB_KEYBOARD "SDL_GRAB_KEYBOARD"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief A variable setting the double click time, in milliseconds.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_MOUSE_DOUBLE_CLICK_TIME "SDL_MOUSE_DOUBLE_CLICK_TIME"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief A variable setting the double click radius, in pixels.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS "SDL_MOUSE_DOUBLE_CLICK_RADIUS"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief A variable setting the speed scale for mouse motion, in floating point, when the mouse is not in relative mode
|
* \brief A variable setting the speed scale for mouse motion, in floating point, when the mouse is not in relative mode
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -33,12 +33,38 @@
|
||||||
|
|
||||||
/* The mouse state */
|
/* The mouse state */
|
||||||
static SDL_Mouse SDL_mouse;
|
static SDL_Mouse SDL_mouse;
|
||||||
static Uint32 SDL_double_click_time = 500;
|
|
||||||
static int SDL_double_click_radius = 1;
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
SDL_PrivateSendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relative, int x, int y);
|
SDL_PrivateSendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relative, int x, int y);
|
||||||
|
|
||||||
|
static void SDLCALL
|
||||||
|
SDL_MouseDoubleClickTimeChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
||||||
|
{
|
||||||
|
SDL_Mouse *mouse = (SDL_Mouse *)userdata;
|
||||||
|
|
||||||
|
if (hint && *hint) {
|
||||||
|
mouse->double_click_time = SDL_atoi(hint);
|
||||||
|
} else {
|
||||||
|
#ifdef __WIN32__
|
||||||
|
mouse->double_click_time = GetDoubleClickTime();
|
||||||
|
#else
|
||||||
|
mouse->double_click_time = 500;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SDLCALL
|
||||||
|
SDL_MouseDoubleClickRadiusChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
||||||
|
{
|
||||||
|
SDL_Mouse *mouse = (SDL_Mouse *)userdata;
|
||||||
|
|
||||||
|
if (hint && *hint) {
|
||||||
|
mouse->double_click_radius = SDL_atoi(hint);
|
||||||
|
} else {
|
||||||
|
mouse->double_click_radius = 32; /* 32 pixels seems about right for touch interfaces */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void SDLCALL
|
static void SDLCALL
|
||||||
SDL_MouseNormalSpeedScaleChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
SDL_MouseNormalSpeedScaleChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
||||||
{
|
{
|
||||||
|
@ -83,6 +109,12 @@ SDL_MouseInit(void)
|
||||||
|
|
||||||
SDL_zerop(mouse);
|
SDL_zerop(mouse);
|
||||||
|
|
||||||
|
SDL_AddHintCallback(SDL_HINT_MOUSE_DOUBLE_CLICK_TIME,
|
||||||
|
SDL_MouseDoubleClickTimeChanged, mouse);
|
||||||
|
|
||||||
|
SDL_AddHintCallback(SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS,
|
||||||
|
SDL_MouseDoubleClickRadiusChanged, mouse);
|
||||||
|
|
||||||
SDL_AddHintCallback(SDL_HINT_MOUSE_NORMAL_SPEED_SCALE,
|
SDL_AddHintCallback(SDL_HINT_MOUSE_NORMAL_SPEED_SCALE,
|
||||||
SDL_MouseNormalSpeedScaleChanged, mouse);
|
SDL_MouseNormalSpeedScaleChanged, mouse);
|
||||||
|
|
||||||
|
@ -114,12 +146,6 @@ SDL_GetMouse(void)
|
||||||
return &SDL_mouse;
|
return &SDL_mouse;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
SDL_SetDoubleClickTime(Uint32 interval)
|
|
||||||
{
|
|
||||||
SDL_double_click_time = interval;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Window *
|
SDL_Window *
|
||||||
SDL_GetMouseFocus(void)
|
SDL_GetMouseFocus(void)
|
||||||
{
|
{
|
||||||
|
@ -454,9 +480,9 @@ SDL_PrivateSendMouseButton(SDL_Window * window, SDL_MouseID mouseID, Uint8 state
|
||||||
if (state == SDL_PRESSED) {
|
if (state == SDL_PRESSED) {
|
||||||
Uint32 now = SDL_GetTicks();
|
Uint32 now = SDL_GetTicks();
|
||||||
|
|
||||||
if (SDL_TICKS_PASSED(now, clickstate->last_timestamp + SDL_double_click_time) ||
|
if (SDL_TICKS_PASSED(now, clickstate->last_timestamp + mouse->double_click_time) ||
|
||||||
SDL_abs(mouse->x - clickstate->last_x) > SDL_double_click_radius ||
|
SDL_abs(mouse->x - clickstate->last_x) > mouse->double_click_radius ||
|
||||||
SDL_abs(mouse->y - clickstate->last_y) > SDL_double_click_radius) {
|
SDL_abs(mouse->y - clickstate->last_y) > mouse->double_click_radius) {
|
||||||
clickstate->click_count = 0;
|
clickstate->click_count = 0;
|
||||||
}
|
}
|
||||||
clickstate->last_timestamp = now;
|
clickstate->last_timestamp = now;
|
||||||
|
|
|
@ -90,6 +90,8 @@ typedef struct
|
||||||
float relative_speed_scale;
|
float relative_speed_scale;
|
||||||
float scale_accum_x;
|
float scale_accum_x;
|
||||||
float scale_accum_y;
|
float scale_accum_y;
|
||||||
|
Uint32 double_click_time;
|
||||||
|
int double_click_radius;
|
||||||
SDL_bool touch_mouse_events;
|
SDL_bool touch_mouse_events;
|
||||||
|
|
||||||
/* Data for double-click tracking */
|
/* Data for double-click tracking */
|
||||||
|
@ -112,9 +114,6 @@ extern int SDL_MouseInit(void);
|
||||||
/* Get the mouse state structure */
|
/* Get the mouse state structure */
|
||||||
SDL_Mouse *SDL_GetMouse(void);
|
SDL_Mouse *SDL_GetMouse(void);
|
||||||
|
|
||||||
/* Set the default double-click interval */
|
|
||||||
extern void SDL_SetDoubleClickTime(Uint32 interval);
|
|
||||||
|
|
||||||
/* Set the default mouse cursor */
|
/* Set the default mouse cursor */
|
||||||
extern void SDL_SetDefaultCursor(SDL_Cursor * cursor);
|
extern void SDL_SetDefaultCursor(SDL_Cursor * cursor);
|
||||||
|
|
||||||
|
|
|
@ -304,8 +304,6 @@ WIN_InitMouse(_THIS)
|
||||||
mouse->GetGlobalMouseState = WIN_GetGlobalMouseState;
|
mouse->GetGlobalMouseState = WIN_GetGlobalMouseState;
|
||||||
|
|
||||||
SDL_SetDefaultCursor(WIN_CreateDefaultCursor());
|
SDL_SetDefaultCursor(WIN_CreateDefaultCursor());
|
||||||
|
|
||||||
SDL_SetDoubleClickTime(GetDoubleClickTime());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue