mirror of https://github.com/OpenTTD/OpenTTD
(svn r12694) -Fix: do not call the mouse over callback on already deleted windows.
parent
2310557716
commit
04138ddffc
|
@ -22,7 +22,8 @@
|
||||||
|
|
||||||
#include "table/sprites.h"
|
#include "table/sprites.h"
|
||||||
|
|
||||||
static Point _drag_delta; //< delta between mouse cursor and upper left corner of dragged window
|
static Point _drag_delta; ///< delta between mouse cursor and upper left corner of dragged window
|
||||||
|
static Window *_mouseover_last_w = NULL; ///< Window of the last MOUSEOVER event
|
||||||
|
|
||||||
static Window _windows[MAX_NUMBER_OF_WINDOWS];
|
static Window _windows[MAX_NUMBER_OF_WINDOWS];
|
||||||
|
|
||||||
|
@ -423,6 +424,9 @@ void DeleteWindow(Window *w)
|
||||||
w->widget_count = 0;
|
w->widget_count = 0;
|
||||||
w->parent = NULL;
|
w->parent = NULL;
|
||||||
|
|
||||||
|
/* Prevent Mouseover() from resetting mouse-over coordinates on a non-existing window */
|
||||||
|
if (_mouseover_last_w == w) _mouseover_last_w = NULL;
|
||||||
|
|
||||||
/* Find the window in the z-array, and effectively remove it
|
/* Find the window in the z-array, and effectively remove it
|
||||||
* by moving all windows after it one to the left */
|
* by moving all windows after it one to the left */
|
||||||
Window **wz = FindWindowZPosition(w);
|
Window **wz = FindWindowZPosition(w);
|
||||||
|
@ -1197,20 +1201,21 @@ static bool HandlePopupMenu()
|
||||||
|
|
||||||
static bool HandleMouseOver()
|
static bool HandleMouseOver()
|
||||||
{
|
{
|
||||||
Window *w;
|
|
||||||
WindowEvent e;
|
WindowEvent e;
|
||||||
static Window *last_w = NULL;
|
|
||||||
|
|
||||||
w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y);
|
Window *w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y);
|
||||||
|
|
||||||
/* We changed window, put a MOUSEOVER event to the last window */
|
/* We changed window, put a MOUSEOVER event to the last window */
|
||||||
if (last_w != NULL && last_w != w) {
|
if (_mouseover_last_w != NULL && _mouseover_last_w != w) {
|
||||||
|
/* Reset mouse-over coordinates of previous window */
|
||||||
e.event = WE_MOUSEOVER;
|
e.event = WE_MOUSEOVER;
|
||||||
e.we.mouseover.pt.x = -1;
|
e.we.mouseover.pt.x = -1;
|
||||||
e.we.mouseover.pt.y = -1;
|
e.we.mouseover.pt.y = -1;
|
||||||
if (last_w->wndproc) last_w->wndproc(last_w, &e);
|
if (_mouseover_last_w->wndproc != NULL) _mouseover_last_w->wndproc(_mouseover_last_w, &e);
|
||||||
}
|
}
|
||||||
last_w = w;
|
|
||||||
|
/* _mouseover_last_w will get reset when the window is deleted, see DeleteWindow() */
|
||||||
|
_mouseover_last_w = w;
|
||||||
|
|
||||||
if (w != NULL) {
|
if (w != NULL) {
|
||||||
/* send an event in client coordinates. */
|
/* send an event in client coordinates. */
|
||||||
|
|
Loading…
Reference in New Issue