File diff r24952:3017eb59bf1a → r24953:69f7dc5c1a31
src/window.cpp
Show inline comments
 
@@ -2822,17 +2822,18 @@ 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.
 
};
 
extern EventState VpHandlePlaceSizingDrag();
 

	
 
const std::chrono::milliseconds TIME_BETWEEN_DOUBLE_CLICK(500); ///< Time between 2 left clicks before it becoming a double click.
 

	
 
static void ScrollMainViewport(int x, int y)
 
{
 
	if (_game_mode != GM_MENU) {
 
		Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
 
		assert(w);
 

	
 
@@ -2988,25 +2989,33 @@ static void MouseLoop(MouseClick click, 
 
void HandleMouseEvents()
 
{
 
	/* World generation is multithreaded and messes with companies.
 
	 * But there is no company related window open anyway, so _current_company is not used. */
 
	assert(HasModalProgress() || IsLocalCompany());
 

	
 
	static int double_click_time = 0;
 
	/* Handle sprite picker before any GUI interaction */
 
	if (_newgrf_debug_sprite_picker.mode == SPM_REDRAW && _input_events_this_tick == 0) {
 
		/* We are done with the last draw-frame, so we know what sprites we
 
		 * clicked on. Reset the picker mode and invalidate the window. */
 
		_newgrf_debug_sprite_picker.mode = SPM_NONE;
 
		InvalidateWindowData(WC_SPRITE_ALIGNER, 0, 1);
 
	}
 

	
 
	static std::chrono::steady_clock::time_point double_click_time = {};
 
	static Point double_click_pos = {0, 0};
 

	
 
	/* Mouse event? */
 
	MouseClick click = MC_NONE;
 
	if (_left_button_down && !_left_button_clicked) {
 
		click = MC_LEFT;
 
		if (double_click_time != 0 && _realtime_tick - double_click_time   < TIME_BETWEEN_DOUBLE_CLICK &&
 
		if (std::chrono::steady_clock::now() <= double_click_time + TIME_BETWEEN_DOUBLE_CLICK &&
 
				double_click_pos.x != 0 && abs(_cursor.pos.x - double_click_pos.x) < MAX_OFFSET_DOUBLE_CLICK  &&
 
				double_click_pos.y != 0 && abs(_cursor.pos.y - double_click_pos.y) < MAX_OFFSET_DOUBLE_CLICK) {
 
			click = MC_DOUBLE_LEFT;
 
		}
 
		double_click_time = _realtime_tick;
 
		double_click_time = std::chrono::steady_clock::now();
 
		double_click_pos = _cursor.pos;
 
		_left_button_clicked = true;
 
		_input_events_this_tick++;
 
	} else if (_right_button_clicked) {
 
		_right_button_clicked = false;
 
		click = MC_RIGHT;
 
@@ -3017,43 +3026,35 @@ void HandleMouseEvents()
 
	if (_cursor.wheel) {
 
		mousewheel = _cursor.wheel;
 
		_cursor.wheel = 0;
 
		_input_events_this_tick++;
 
	}
 

	
 
	static uint32 hover_time = 0;
 
	static std::chrono::steady_clock::time_point hover_time = {};
 
	static Point hover_pos = {0, 0};
 

	
 
	if (_settings_client.gui.hover_delay_ms > 0) {
 
		if (!_cursor.in_window || 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;
 
			hover_time = std::chrono::steady_clock::now();
 
			_mouse_hovering = false;
 
		} else {
 
			if (hover_time != 0 && _realtime_tick > hover_time + _settings_client.gui.hover_delay_ms) {
 
			if (std::chrono::steady_clock::now() > hover_time + std::chrono::milliseconds(_settings_client.gui.hover_delay_ms)) {
 
				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 */
 
		_newgrf_debug_sprite_picker.mode = SPM_NONE;
 
		InvalidateWindowData(WC_SPRITE_ALIGNER, 0, 1);
 
	}
 

	
 
	if (click == MC_LEFT && _newgrf_debug_sprite_picker.mode == SPM_WAIT_CLICK) {
 
		/* Mark whole screen dirty, and wait for the next realtime tick, when drawing is finished. */
 
		Blitter *blitter = BlitterFactory::GetCurrentBlitter();
 
		_newgrf_debug_sprite_picker.clicked_pixel = blitter->MoveTo(_screen.dst_ptr, _cursor.pos.x, _cursor.pos.y);
 
		_newgrf_debug_sprite_picker.click_time = _realtime_tick;
 
		_newgrf_debug_sprite_picker.sprites.clear();
 
		_newgrf_debug_sprite_picker.mode = SPM_REDRAW;
 
		MarkWholeScreenDirty();
 
	} else {
 
		MouseLoop(click, mousewheel);
 
	}
 
@@ -3135,18 +3136,19 @@ void CallWindowRealtimeTickEvent(uint de
 

	
 
/**
 
 * Update the continuously changing contents of the windows, such as the viewports
 
 */
 
void UpdateWindows()
 
{
 
	static uint32 last_realtime_tick = _realtime_tick;
 
	uint delta_ms = _realtime_tick - last_realtime_tick;
 
	last_realtime_tick = _realtime_tick;
 
	static std::chrono::steady_clock::time_point last_time = std::chrono::steady_clock::now();
 
	uint delta_ms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - last_time).count();
 

	
 
	if (delta_ms == 0) return;
 

	
 
	last_time = std::chrono::steady_clock::now();
 

	
 
	PerformanceMeasurer framerate(PFE_DRAWING);
 
	PerformanceAccumulator::Reset(PFE_DRAWWORLD);
 

	
 
	CallWindowRealtimeTickEvent(delta_ms);
 

	
 
	static GUITimer network_message_timer = GUITimer(1);