Clicking widgets is broken, the focus changes at random

This commit is contained in:
pelya
2017-03-31 03:38:06 +03:00
parent 86337b4ef7
commit e5cd6ce45c
3 changed files with 14 additions and 20 deletions

View File

@@ -86,12 +86,14 @@ static Point HandleScrollbarHittest(const Scrollbar *sb, int top, int bottom, bo
* @param ma Maximum coordinate of the scroll bar. * @param ma Maximum coordinate of the scroll bar.
* @param x The X coordinate of the mouse click. * @param x The X coordinate of the mouse click.
* @param y The Y coordinate of the mouse click. * @param y The Y coordinate of the mouse click.
* @return true if scrollbar slider is pressed
*/ */
static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, int y, int mi, int ma) static bool ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, int y, int mi, int ma)
{ {
int pos; int pos;
int button_size; int button_size;
bool rtl = false; bool rtl = false;
bool sliderPressed = false;
if (sb->type == NWID_HSCROLLBAR) { if (sb->type == NWID_HSCROLLBAR) {
pos = x; pos = x;
@@ -132,10 +134,12 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in
_scrollbar_size -= button_size; _scrollbar_size -= button_size;
w->scrolling_scrollbar = sb->index; w->scrolling_scrollbar = sb->index;
_cursorpos_drag_start = _cursor.pos; _cursorpos_drag_start = _cursor.pos;
sliderPressed = true;
} }
} }
w->SetDirty(); w->SetDirty();
return sliderPressed;
} }
/** /**
@@ -145,8 +149,9 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in
* @param nw Pointer to the scrollbar widget. * @param nw Pointer to the scrollbar widget.
* @param x The X coordinate of the mouse click. * @param x The X coordinate of the mouse click.
* @param y The Y coordinate of the mouse click. * @param y The Y coordinate of the mouse click.
* @return true if scrollbar slider is pressed
*/ */
void ScrollbarClickHandler(Window *w, NWidgetCore *nw, int x, int y) bool ScrollbarClickHandler(Window *w, NWidgetCore *nw, int x, int y)
{ {
int mi, ma; int mi, ma;
@@ -159,7 +164,7 @@ void ScrollbarClickHandler(Window *w, NWidgetCore *nw, int x, int y)
} }
NWidgetScrollbar *scrollbar = dynamic_cast<NWidgetScrollbar*>(nw); NWidgetScrollbar *scrollbar = dynamic_cast<NWidgetScrollbar*>(nw);
assert(scrollbar != NULL); assert(scrollbar != NULL);
ScrollbarClickPositioning(w, scrollbar, x, y, mi, ma); return ScrollbarClickPositioning(w, scrollbar, x, y, mi, ma);
} }
/** /**

View File

@@ -646,12 +646,10 @@ static void ChangeFocusedWindow(Window *w, int x, int y)
NWidgetCore *nw = w->nested_root->GetWidgetFromPos(x, y); NWidgetCore *nw = w->nested_root->GetWidgetFromPos(x, y);
WidgetType widget_type = (nw != NULL) ? nw->type : WWT_EMPTY; WidgetType widget_type = (nw != NULL) ? nw->type : WWT_EMPTY;
bool focused_widget_changed = false;
/* If clicked on a window that previously did dot have focus */ /* If clicked on a window that previously did dot have focus */
if (_focused_window != w && // We already have focus, right? if (_focused_window != w && // We already have focus, right?
(w->window_desc->flags & WDF_NO_FOCUS) == 0 && // Don't lose focus to toolbars (w->window_desc->flags & WDF_NO_FOCUS) == 0 && // Don't lose focus to toolbars
widget_type != WWT_CLOSEBOX) { // Don't change focused window if 'X' (close button) was clicked widget_type != WWT_CLOSEBOX) { // Don't change focused window if 'X' (close button) was clicked
focused_widget_changed = true;
SetFocusedWindow(w); SetFocusedWindow(w);
} }
@@ -675,15 +673,14 @@ static void ChangeFocusedWindow(Window *w, int x, int y)
* a user has the edit box focused and then click on another window and * a user has the edit box focused and then click on another window and
* then back again on the edit box (to type some text). * then back again on the edit box (to type some text).
*/ */
focused_widget_changed |= w->SetFocusedWidget(widget_index); w->SetFocusedWidget(widget_index);
} }
// Special cases for scrollable widgets and resize button // Special cases for scrollable widgets and resize button
switch (widget_type) { switch (widget_type) {
case NWID_VSCROLLBAR: case NWID_VSCROLLBAR:
case NWID_HSCROLLBAR: case NWID_HSCROLLBAR:
_dragging_widget = true; if (ScrollbarClickHandler(w, nw, x, y)) _dragging_widget = true;
ScrollbarClickHandler(w, nw, x, y);
break; break;
case WWT_RESIZEBOX: case WWT_RESIZEBOX:
@@ -711,8 +708,6 @@ static void SendLeftClickEventToWindow(Window *w, int x, int y, int click_count)
if (w->nested_focus != NULL) nw = w->GetWidget<NWidgetCore>(w->nested_focus->index); if (w->nested_focus != NULL) nw = w->GetWidget<NWidgetCore>(w->nested_focus->index);
WidgetType widget_type = (nw != NULL) ? nw->type : WWT_EMPTY; WidgetType widget_type = (nw != NULL) ? nw->type : WWT_EMPTY;
bool focused_widget_changed = false; // Only used for OSK window
if (nw == NULL) return; // exit if clicked outside of widgets if (nw == NULL) return; // exit if clicked outside of widgets
/* don't allow any interaction if the button has been disabled */ /* don't allow any interaction if the button has been disabled */
@@ -731,7 +726,7 @@ static void SendLeftClickEventToWindow(Window *w, int x, int y, int click_count)
switch (widget_type) { switch (widget_type) {
case WWT_EDITBOX: { case WWT_EDITBOX: {
QueryString *query = w->GetQueryString(widget_index); QueryString *query = w->GetQueryString(widget_index);
if (query != NULL) query->ClickEditBox(w, pt, widget_index, click_count, focused_widget_changed); if (query != NULL) query->ClickEditBox(w, pt, widget_index, click_count, false);
break; break;
} }
@@ -827,15 +822,9 @@ static void DispatchLeftButtonDownEvent(Window *w, int x, int y, int click_count
*/ */
static void DispatchLeftButtonUpEvent(Window *w, int x, int y) static void DispatchLeftButtonUpEvent(Window *w, int x, int y)
{ {
if (_settings_client.gui.windows_titlebars || _dragging_window) return;
if (_focused_window != NULL && w->window_class != WC_MAIN_TOOLBAR && w->window_class != WC_MAIN_TOOLBAR_RIGHT) {
// Send event to the window and widget which were initially under the mouse cursor
SendLeftClickEventToWindow(_focused_window, _left_button_down_pos.x - _focused_window->left, _left_button_down_pos.y - _focused_window->top, 1);
} else {
// Special case, such as toolbar buttons
SendLeftClickEventToWindow(w, x, y, 1);
}
_dragging_widget = false; _dragging_widget = false;
if (_settings_client.gui.windows_titlebars || _dragging_window) return;
SendLeftClickEventToWindow(w, x, y, 1);
} }
/** /**

View File

@@ -912,6 +912,6 @@ extern SpecialMouseMode _special_mouse_mode;
void SetFocusedWindow(Window *w); void SetFocusedWindow(Window *w);
void ScrollbarClickHandler(Window *w, NWidgetCore *nw, int x, int y); bool ScrollbarClickHandler(Window *w, NWidgetCore *nw, int x, int y);
#endif /* WINDOW_GUI_H */ #endif /* WINDOW_GUI_H */