| | |
| | | |
| | | /* The mouse state */ |
| | | static SDL_Mouse SDL_mouse; |
| | | static Uint32 SDL_double_click_time = 500; |
| | | static int SDL_double_click_radius = 1; |
| | | |
| | | static int |
| | | 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 |
| | | SDL_MouseNormalSpeedScaleChanged(void *userdata, const char *name, const char *oldValue, const char *hint) |
| | |
| | | |
| | | 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_MouseNormalSpeedScaleChanged, mouse); |
| | | |
| | |
| | | SDL_GetMouse(void) |
| | | { |
| | | return &SDL_mouse; |
| | | } |
| | | |
| | | void |
| | | SDL_SetDoubleClickTime(Uint32 interval) |
| | | { |
| | | SDL_double_click_time = interval; |
| | | } |
| | | |
| | | SDL_Window * |
| | |
| | | if (state == SDL_PRESSED) { |
| | | Uint32 now = SDL_GetTicks(); |
| | | |
| | | if (SDL_TICKS_PASSED(now, clickstate->last_timestamp + SDL_double_click_time) || |
| | | SDL_abs(mouse->x - clickstate->last_x) > SDL_double_click_radius || |
| | | SDL_abs(mouse->y - clickstate->last_y) > SDL_double_click_radius) { |
| | | if (SDL_TICKS_PASSED(now, clickstate->last_timestamp + mouse->double_click_time) || |
| | | SDL_abs(mouse->x - clickstate->last_x) > mouse->double_click_radius || |
| | | SDL_abs(mouse->y - clickstate->last_y) > mouse->double_click_radius) { |
| | | clickstate->click_count = 0; |
| | | } |
| | | clickstate->last_timestamp = now; |
| | |
| | | ShouldUseRelativeModeWarp(SDL_Mouse *mouse) |
| | | { |
| | | if (!mouse->SetRelativeMouseMode) { |
| | | SDL_assert(mouse->WarpMouse); /* Need this functionality for relative mode warp implementation */ |
| | | return SDL_TRUE; |
| | | } |
| | | |
| | |
| | | } else if (mouse->SetRelativeMouseMode(enabled) < 0) { |
| | | if (enabled) { |
| | | /* Fall back to warp mode if native relative mode failed */ |
| | | if (!mouse->WarpMouse) { |
| | | return SDL_SetError("No relative mode implementation available"); |
| | | } |
| | | mouse->relative_mode_warp = SDL_TRUE; |
| | | } |
| | | } |