diff --git a/src/window.cpp b/src/window.cpp index 2c12dbe8ec..69fccf9d3e 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -59,6 +59,7 @@ byte _scroller_click_timeout; bool _scrolling_scrollbar; ///< A scrollbar is being scrolled with the mouse. bool _scrolling_viewport; ///< A viewport is being scrolled with the mouse. +bool _mouse_hovering; ///< The mouse is hovering over the same point. SpecialMouseMode _special_mouse_mode; ///< Mode of the mouse. @@ -1287,6 +1288,7 @@ void InitWindowSystem() _focused_window = NULL; _mouseover_last_w = NULL; _scrolling_viewport = false; + _mouse_hovering = false; NWidgetLeaf::InvalidateDimensionCache(); // Reset cached sizes of several widgets. } @@ -2019,11 +2021,13 @@ enum MouseClick { MC_LEFT, MC_RIGHT, MC_DOUBLE_LEFT, + MC_HOVER, MAX_OFFSET_DOUBLE_CLICK = 5, ///< How much the mouse is allowed to move to call it a double click TIME_BETWEEN_DOUBLE_CLICK = 500, ///< Time between 2 left clicks before it becoming a double click, in ms + MAX_OFFSET_HOVER = 5, ///< Maximum mouse movement before stopping a hover event. + TIME_HOVER = 1000, ///< Time required to activate a hover event, in ms. }; - extern EventState VpHandlePlaceSizingDrag(); static void ScrollMainViewport(int x, int y) @@ -2216,6 +2220,23 @@ void HandleMouseEvents() _input_events_this_tick++; } + static int hover_time = 0; + static Point hover_pos = {0, 0}; + + if (click != MC_NONE || mousewheel != 0 || _left_button_down || _right_button_down || + hover_pos.x == 0 || abs(_cursor.pos.x - hover_pos.x) >= MAX_OFFSET_HOVER || + hover_pos.y == 0 || abs(_cursor.pos.y - hover_pos.y) >= MAX_OFFSET_HOVER) { + hover_pos = _cursor.pos; + hover_time = _realtime_tick; + _mouse_hovering = false; + } else { + if (hover_time != 0 && _realtime_tick - hover_time > TIME_HOVER) { + click = MC_HOVER; + _input_events_this_tick++; + _mouse_hovering = true; + } + } + /* Handle sprite picker before any GUI interaction */ if (_newgrf_debug_sprite_picker.mode == SPM_REDRAW && _newgrf_debug_sprite_picker.click_time != _realtime_tick) { /* Next realtime tick? Then redraw has finished */ diff --git a/src/window_gui.h b/src/window_gui.h index 5d15d8f5a0..7fc0ebe720 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -913,6 +913,7 @@ extern byte _scroller_click_timeout; extern bool _scrolling_scrollbar; extern bool _scrolling_viewport; +extern bool _mouse_hovering; /** Mouse modes. */ enum SpecialMouseMode {