1
0
Fork 0

(svn r7157) -Fix [FS#221, SF1168820]: Some mouse events possibly lost under high CPU load, handle

mouse input right away instead of waiting for GameLoop. (KUDr)
release/0.5
Darkvater 2006-11-15 21:01:19 +00:00
parent b713974cd8
commit a353e354fd
5 changed files with 66 additions and 27 deletions

View File

@ -404,6 +404,7 @@ static void QZ_MouseMovedEvent(int x, int y)
_cursor.pos.y = y; _cursor.pos.y = y;
_cursor.dirty = true; _cursor.dirty = true;
} }
HandleMouseEvents();
} }
@ -417,6 +418,7 @@ static void QZ_MouseButtonEvent(int button, BOOL down)
_left_button_down = false; _left_button_down = false;
_left_button_clicked = false; _left_button_clicked = false;
} }
HandleMouseEvents();
break; break;
case 1: case 1:
@ -426,6 +428,7 @@ static void QZ_MouseButtonEvent(int button, BOOL down)
} else { } else {
_right_button_down = false; _right_button_down = false;
} }
HandleMouseEvents();
break; break;
} }
} }

View File

@ -325,6 +325,7 @@ static int PollEvent(void)
_cursor.pos.y = ev.motion.y; _cursor.pos.y = ev.motion.y;
_cursor.dirty = true; _cursor.dirty = true;
} }
HandleMouseEvents();
break; break;
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
@ -347,6 +348,7 @@ static int PollEvent(void)
default: break; default: break;
} }
HandleMouseEvents();
break; break;
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
@ -360,6 +362,7 @@ static int PollEvent(void)
} else if (ev.button.button == SDL_BUTTON_RIGHT) { } else if (ev.button.button == SDL_BUTTON_RIGHT) {
_right_button_down = false; _right_button_down = false;
} }
HandleMouseEvents();
break; break;
case SDL_ACTIVEEVENT: case SDL_ACTIVEEVENT:

View File

@ -266,23 +266,27 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
case WM_LBUTTONDOWN: case WM_LBUTTONDOWN:
SetCapture(hwnd); SetCapture(hwnd);
_left_button_down = true; _left_button_down = true;
HandleMouseEvents();
return 0; return 0;
case WM_LBUTTONUP: case WM_LBUTTONUP:
ReleaseCapture(); ReleaseCapture();
_left_button_down = false; _left_button_down = false;
_left_button_clicked = false; _left_button_clicked = false;
HandleMouseEvents();
return 0; return 0;
case WM_RBUTTONDOWN: case WM_RBUTTONDOWN:
SetCapture(hwnd); SetCapture(hwnd);
_right_button_down = true; _right_button_down = true;
_right_button_clicked = true; _right_button_clicked = true;
HandleMouseEvents();
return 0; return 0;
case WM_RBUTTONUP: case WM_RBUTTONUP:
ReleaseCapture(); ReleaseCapture();
_right_button_down = false; _right_button_down = false;
HandleMouseEvents();
return 0; return 0;
case WM_MOUSELEAVE: case WM_MOUSELEAVE:
@ -290,6 +294,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
_cursor.in_window = false; _cursor.in_window = false;
if (!_left_button_down && !_right_button_down) MyShowCursor(true); if (!_left_button_down && !_right_button_down) MyShowCursor(true);
HandleMouseEvents();
return 0; return 0;
case WM_MOUSEMOVE: { case WM_MOUSEMOVE: {
@ -337,6 +342,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
_cursor.dirty = true; _cursor.dirty = true;
} }
MyShowCursor(false); MyShowCursor(false);
HandleMouseEvents();
return 0; return 0;
} }
@ -483,6 +489,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
} else if (delta > 0) { } else if (delta > 0) {
_cursor.wheel--; _cursor.wheel--;
} }
HandleMouseEvents();
return 0; return 0;
} }

View File

@ -1461,27 +1461,22 @@ void HandleKeypress(uint32 key)
extern void UpdateTileSelection(void); extern void UpdateTileSelection(void);
extern bool VpHandlePlaceSizingDrag(void); extern bool VpHandlePlaceSizingDrag(void);
static void MouseLoop(int click, int mousewheel) static int _input_events_this_tick = 0;
static void HandleAutoscroll(void)
{ {
int x,y;
Window *w; Window *w;
ViewPort *vp; ViewPort *vp;
int x = _cursor.pos.x;
int y = _cursor.pos.y;
DecreaseWindowCounters(); if (_input_events_this_tick != 0) {
HandlePlacePresize(); /* HandleAutoscroll is called only once per GameLoop() - so we can clear the counter here */
UpdateTileSelection(); _input_events_this_tick = 0;
if (!VpHandlePlaceSizingDrag()) return; /* there were some inputs this tick, don't scroll ??? */
if (!HandleDragDrop()) return; return;
if (!HandlePopupMenu()) return; }
if (!HandleWindowDragging()) return;
if (!HandleScrollbarScrolling()) return;
if (!HandleViewportScroll()) return;
if (!HandleMouseOver()) return;
x = _cursor.pos.x;
y = _cursor.pos.y;
if (click == 0 && mousewheel == 0) {
if (_patches.autoscroll && _game_mode != GM_MENU && !IsGeneratingWorld()) { if (_patches.autoscroll && _game_mode != GM_MENU && !IsGeneratingWorld()) {
w = FindWindowFromPt(x, y); w = FindWindowFromPt(x, y);
if (w == NULL || w->flags4 & WF_DISABLE_VP_SCROLL) return; if (w == NULL || w->flags4 & WF_DISABLE_VP_SCROLL) return;
@ -1504,8 +1499,29 @@ static void MouseLoop(int click, int mousewheel)
#undef scrollspeed #undef scrollspeed
} }
} }
return; }
}
void MouseLoop(int click, int mousewheel)
{
int x,y;
Window *w;
ViewPort *vp;
DecreaseWindowCounters();
HandlePlacePresize();
UpdateTileSelection();
if (!VpHandlePlaceSizingDrag()) return;
if (!HandleDragDrop()) return;
if (!HandlePopupMenu()) return;
if (!HandleWindowDragging()) return;
if (!HandleScrollbarScrolling()) return;
if (!HandleViewportScroll()) return;
if (!HandleMouseOver()) return;
x = _cursor.pos.x;
y = _cursor.pos.y;
if (click == 0 && mousewheel == 0) return;
w = FindWindowFromPt(x, y); w = FindWindowFromPt(x, y);
if (w == NULL) return; if (w == NULL) return;
@ -1562,7 +1578,7 @@ static void MouseLoop(int click, int mousewheel)
} }
} }
void InputLoop(void) void HandleMouseEvents(void)
{ {
int click; int click;
int mousewheel; int mousewheel;
@ -1583,20 +1599,29 @@ void InputLoop(void)
if (_left_button_down && !_left_button_clicked) { if (_left_button_down && !_left_button_clicked) {
_left_button_clicked = true; _left_button_clicked = true;
click = 1; click = 1;
_input_events_this_tick++;
} else if (_right_button_clicked) { } else if (_right_button_clicked) {
_right_button_clicked = false; _right_button_clicked = false;
click = 2; click = 2;
_input_events_this_tick++;
} }
mousewheel = 0; mousewheel = 0;
if (_cursor.wheel) { if (_cursor.wheel) {
mousewheel = _cursor.wheel; mousewheel = _cursor.wheel;
_cursor.wheel = 0; _cursor.wheel = 0;
_input_events_this_tick++;
} }
MouseLoop(click, mousewheel); MouseLoop(click, mousewheel);
} }
void InputLoop(void)
{
HandleMouseEvents();
HandleAutoscroll();
}
void UpdateWindows(void) void UpdateWindows(void)
{ {
Window *w; Window *w;

View File

@ -802,6 +802,7 @@ void ResetWindowSystem(void);
int GetMenuItemIndex(const Window *w, int x, int y); int GetMenuItemIndex(const Window *w, int x, int y);
void InputLoop(void); void InputLoop(void);
void HandleKeypress(uint32 key); void HandleKeypress(uint32 key);
void HandleMouseEvents(void);
void UpdateWindows(void); void UpdateWindows(void);
void InvalidateWidget(const Window *w, byte widget_index); void InvalidateWidget(const Window *w, byte widget_index);
void InvalidateThisWindowData(Window *w); void InvalidateThisWindowData(Window *w);