summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <darkvater@openttd.org>2006-11-15 21:01:19 +0000
committerDarkvater <darkvater@openttd.org>2006-11-15 21:01:19 +0000
commita353e354fddb3a242f35c7d9dcbb76ee5c92e4f1 (patch)
tree5ba9323bfd824f096f19b533df5deb1a2d4ba669
parentb713974cd885defceace4f786254fe2127158a23 (diff)
downloadopenttd-a353e354fddb3a242f35c7d9dcbb76ee5c92e4f1.tar.xz
(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)
-rw-r--r--video/cocoa_v.m3
-rw-r--r--video/sdl_v.c3
-rw-r--r--video/win32_v.c7
-rw-r--r--window.c79
-rw-r--r--window.h1
5 files changed, 66 insertions, 27 deletions
diff --git a/video/cocoa_v.m b/video/cocoa_v.m
index e10e87dc2..bf9468873 100644
--- a/video/cocoa_v.m
+++ b/video/cocoa_v.m
@@ -404,6 +404,7 @@ static void QZ_MouseMovedEvent(int x, int y)
_cursor.pos.y = y;
_cursor.dirty = true;
}
+ HandleMouseEvents();
}
@@ -417,6 +418,7 @@ static void QZ_MouseButtonEvent(int button, BOOL down)
_left_button_down = false;
_left_button_clicked = false;
}
+ HandleMouseEvents();
break;
case 1:
@@ -426,6 +428,7 @@ static void QZ_MouseButtonEvent(int button, BOOL down)
} else {
_right_button_down = false;
}
+ HandleMouseEvents();
break;
}
}
diff --git a/video/sdl_v.c b/video/sdl_v.c
index f72d620fe..0b4ae25f7 100644
--- a/video/sdl_v.c
+++ b/video/sdl_v.c
@@ -325,6 +325,7 @@ static int PollEvent(void)
_cursor.pos.y = ev.motion.y;
_cursor.dirty = true;
}
+ HandleMouseEvents();
break;
case SDL_MOUSEBUTTONDOWN:
@@ -347,6 +348,7 @@ static int PollEvent(void)
default: break;
}
+ HandleMouseEvents();
break;
case SDL_MOUSEBUTTONUP:
@@ -360,6 +362,7 @@ static int PollEvent(void)
} else if (ev.button.button == SDL_BUTTON_RIGHT) {
_right_button_down = false;
}
+ HandleMouseEvents();
break;
case SDL_ACTIVEEVENT:
diff --git a/video/win32_v.c b/video/win32_v.c
index bef30e271..1894e7a24 100644
--- a/video/win32_v.c
+++ b/video/win32_v.c
@@ -266,23 +266,27 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
case WM_LBUTTONDOWN:
SetCapture(hwnd);
_left_button_down = true;
+ HandleMouseEvents();
return 0;
case WM_LBUTTONUP:
ReleaseCapture();
_left_button_down = false;
_left_button_clicked = false;
+ HandleMouseEvents();
return 0;
case WM_RBUTTONDOWN:
SetCapture(hwnd);
_right_button_down = true;
_right_button_clicked = true;
+ HandleMouseEvents();
return 0;
case WM_RBUTTONUP:
ReleaseCapture();
_right_button_down = false;
+ HandleMouseEvents();
return 0;
case WM_MOUSELEAVE:
@@ -290,6 +294,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
_cursor.in_window = false;
if (!_left_button_down && !_right_button_down) MyShowCursor(true);
+ HandleMouseEvents();
return 0;
case WM_MOUSEMOVE: {
@@ -337,6 +342,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
_cursor.dirty = true;
}
MyShowCursor(false);
+ HandleMouseEvents();
return 0;
}
@@ -483,6 +489,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
} else if (delta > 0) {
_cursor.wheel--;
}
+ HandleMouseEvents();
return 0;
}
diff --git a/window.c b/window.c
index 6c39621bf..939ca49ba 100644
--- a/window.c
+++ b/window.c
@@ -1461,7 +1461,47 @@ void HandleKeypress(uint32 key)
extern void UpdateTileSelection(void);
extern bool VpHandlePlaceSizingDrag(void);
-static void MouseLoop(int click, int mousewheel)
+static int _input_events_this_tick = 0;
+
+static void HandleAutoscroll(void)
+{
+ Window *w;
+ ViewPort *vp;
+ int x = _cursor.pos.x;
+ int y = _cursor.pos.y;
+
+ if (_input_events_this_tick != 0) {
+ /* HandleAutoscroll is called only once per GameLoop() - so we can clear the counter here */
+ _input_events_this_tick = 0;
+ /* there were some inputs this tick, don't scroll ??? */
+ return;
+ }
+
+ if (_patches.autoscroll && _game_mode != GM_MENU && !IsGeneratingWorld()) {
+ w = FindWindowFromPt(x, y);
+ if (w == NULL || w->flags4 & WF_DISABLE_VP_SCROLL) return;
+ vp = IsPtInWindowViewport(w, x, y);
+ if (vp != NULL) {
+ x -= vp->left;
+ y -= vp->top;
+ //here allows scrolling in both x and y axis
+#define scrollspeed 3
+ if (x - 15 < 0) {
+ WP(w, vp_d).scrollpos_x += (x - 15) * scrollspeed << vp->zoom;
+ } else if (15 - (vp->width - x) > 0) {
+ WP(w, vp_d).scrollpos_x += (15 - (vp->width - x)) * scrollspeed << vp->zoom;
+ }
+ if (y - 15 < 0) {
+ WP(w, vp_d).scrollpos_y += (y - 15) * scrollspeed << vp->zoom;
+ } else if (15 - (vp->height - y) > 0) {
+ WP(w,vp_d).scrollpos_y += (15 - (vp->height - y)) * scrollspeed << vp->zoom;
+ }
+#undef scrollspeed
+ }
+ }
+}
+
+void MouseLoop(int click, int mousewheel)
{
int x,y;
Window *w;
@@ -1481,31 +1521,7 @@ static void MouseLoop(int click, int mousewheel)
x = _cursor.pos.x;
y = _cursor.pos.y;
- if (click == 0 && mousewheel == 0) {
- if (_patches.autoscroll && _game_mode != GM_MENU && !IsGeneratingWorld()) {
- w = FindWindowFromPt(x, y);
- if (w == NULL || w->flags4 & WF_DISABLE_VP_SCROLL) return;
- vp = IsPtInWindowViewport(w, x, y);
- if (vp != NULL) {
- x -= vp->left;
- y -= vp->top;
- //here allows scrolling in both x and y axis
-#define scrollspeed 3
- if (x - 15 < 0) {
- WP(w, vp_d).scrollpos_x += (x - 15) * scrollspeed << vp->zoom;
- } else if (15 - (vp->width - x) > 0) {
- WP(w, vp_d).scrollpos_x += (15 - (vp->width - x)) * scrollspeed << vp->zoom;
- }
- if (y - 15 < 0) {
- WP(w, vp_d).scrollpos_y += (y - 15) * scrollspeed << vp->zoom;
- } else if (15 - (vp->height - y) > 0) {
- WP(w,vp_d).scrollpos_y += (15 - (vp->height - y)) * scrollspeed << vp->zoom;
- }
-#undef scrollspeed
- }
- }
- return;
- }
+ if (click == 0 && mousewheel == 0) return;
w = FindWindowFromPt(x, y);
if (w == NULL) return;
@@ -1562,7 +1578,7 @@ static void MouseLoop(int click, int mousewheel)
}
}
-void InputLoop(void)
+void HandleMouseEvents(void)
{
int click;
int mousewheel;
@@ -1583,20 +1599,29 @@ void InputLoop(void)
if (_left_button_down && !_left_button_clicked) {
_left_button_clicked = true;
click = 1;
+ _input_events_this_tick++;
} else if (_right_button_clicked) {
_right_button_clicked = false;
click = 2;
+ _input_events_this_tick++;
}
mousewheel = 0;
if (_cursor.wheel) {
mousewheel = _cursor.wheel;
_cursor.wheel = 0;
+ _input_events_this_tick++;
}
MouseLoop(click, mousewheel);
}
+void InputLoop(void)
+{
+ HandleMouseEvents();
+ HandleAutoscroll();
+}
+
void UpdateWindows(void)
{
Window *w;
diff --git a/window.h b/window.h
index bf85dcff4..a7927c51a 100644
--- a/window.h
+++ b/window.h
@@ -802,6 +802,7 @@ void ResetWindowSystem(void);
int GetMenuItemIndex(const Window *w, int x, int y);
void InputLoop(void);
void HandleKeypress(uint32 key);
+void HandleMouseEvents(void);
void UpdateWindows(void);
void InvalidateWidget(const Window *w, byte widget_index);
void InvalidateThisWindowData(Window *w);