summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2010-01-06 20:17:46 +0000
committerfrosch <frosch@openttd.org>2010-01-06 20:17:46 +0000
commit70f96a3dbf536e931eeb49066e59a2e0c1af82b4 (patch)
tree32148fd51ed45c6a6d23b9726ff9c23fb821c0a2 /src
parente0bf5da9ed4a50e0a78a027830e6bee2f8855386 (diff)
downloadopenttd-70f96a3dbf536e931eeb49066e59a2e0c1af82b4.tar.xz
(svn r18744) -Fix [FS#3487-ish]: Do not toggle the sticky- and shading-button twice per mouseclick when clicking fast.
Diffstat (limited to 'src')
-rw-r--r--src/window.cpp140
1 files changed, 72 insertions, 68 deletions
diff --git a/src/window.cpp b/src/window.cpp
index 82d286d5a..e7ea47896 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -282,81 +282,84 @@ static void DispatchLeftClickEvent(Window *w, int x, int y, bool double_click)
int widget_index = nw->index; ///< Index of the widget
- /* Clicked on a widget that is not disabled.
- * So unless the clicked widget is the caption bar, change focus to this widget */
- if (widget_type != WWT_CAPTION) {
- /* Close the OSK window if a edit box loses focus */
- if (w->nested_focus != NULL && w->nested_focus->type == WWT_EDITBOX && w->nested_focus != nw && w->window_class != WC_OSK) {
- DeleteWindowById(WC_OSK, 0);
+ /* Process special buttons (only single clicks) */
+ if (!double_click) {
+ /* Clicked on a widget that is not disabled.
+ * So unless the clicked widget is the caption bar, change focus to this widget */
+ if (widget_type != WWT_CAPTION) {
+ /* Close the OSK window if a edit box loses focus */
+ if (w->nested_focus != NULL && w->nested_focus->type == WWT_EDITBOX && w->nested_focus != nw && w->window_class != WC_OSK) {
+ DeleteWindowById(WC_OSK, 0);
+ }
+
+ /* focused_widget_changed is 'now' only true if the window this widget
+ * is in gained focus. In that case it must remain true, also if the
+ * local widget focus did not change. As such it's the logical-or of
+ * both changed states.
+ *
+ * If this is not preserved, then the OSK window would be opened when
+ * 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).
+ */
+ focused_widget_changed |= w->SetFocusedWidget(widget_index);
}
- /* focused_widget_changed is 'now' only true if the window this widget
- * is in gained focus. In that case it must remain true, also if the
- * local widget focus did not change. As such it's the logical-or of
- * both changed states.
- *
- * If this is not preserved, then the OSK window would be opened when
- * 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).
- */
- focused_widget_changed |= w->SetFocusedWidget(widget_index);
- }
-
- /* Close any child drop down menus. If the button pressed was the drop down
- * list's own button, then we should not process the click any further. */
- if (HideDropDownMenu(w) == widget_index && widget_index >= 0) return;
-
- switch (widget_type) {
- /* special widget handling for buttons*/
- case WWT_PANEL | WWB_PUSHBUTTON: // WWT_PUSHBTN
- case WWT_IMGBTN | WWB_PUSHBUTTON: // WWT_PUSHIMGBTN
- case WWT_TEXTBTN | WWB_PUSHBUTTON: // WWT_PUSHTXTBTN
- w->HandleButtonClick(widget_index);
- break;
+ /* Close any child drop down menus. If the button pressed was the drop down
+ * list's own button, then we should not process the click any further. */
+ if (HideDropDownMenu(w) == widget_index && widget_index >= 0) return;
- case WWT_SCROLLBAR:
- case WWT_SCROLL2BAR:
- case WWT_HSCROLLBAR:
- ScrollbarClickHandler(w, nw, x, y);
- break;
+ switch (widget_type) {
+ /* special widget handling for buttons*/
+ case WWT_PANEL | WWB_PUSHBUTTON: // WWT_PUSHBTN
+ case WWT_IMGBTN | WWB_PUSHBUTTON: // WWT_PUSHIMGBTN
+ case WWT_TEXTBTN | WWB_PUSHBUTTON: // WWT_PUSHTXTBTN
+ w->HandleButtonClick(widget_index);
+ break;
+
+ case WWT_SCROLLBAR:
+ case WWT_SCROLL2BAR:
+ case WWT_HSCROLLBAR:
+ ScrollbarClickHandler(w, nw, x, y);
+ break;
- case WWT_EDITBOX:
- if (!focused_widget_changed) { // Only open the OSK window if clicking on an already focused edit box
- /* Open the OSK window if clicked on an edit box */
- QueryStringBaseWindow *qs = dynamic_cast<QueryStringBaseWindow *>(w);
- if (qs != NULL) {
- qs->OnOpenOSKWindow(widget_index);
+ case WWT_EDITBOX:
+ if (!focused_widget_changed) { // Only open the OSK window if clicking on an already focused edit box
+ /* Open the OSK window if clicked on an edit box */
+ QueryStringBaseWindow *qs = dynamic_cast<QueryStringBaseWindow *>(w);
+ if (qs != NULL) {
+ qs->OnOpenOSKWindow(widget_index);
+ }
}
- }
- break;
+ break;
- case WWT_CLOSEBOX: // 'X'
- delete w;
- return;
+ case WWT_CLOSEBOX: // 'X'
+ delete w;
+ return;
- case WWT_CAPTION: // 'Title bar'
- StartWindowDrag(w);
- return;
+ case WWT_CAPTION: // 'Title bar'
+ StartWindowDrag(w);
+ return;
- case WWT_RESIZEBOX:
- /* When the resize widget is on the left size of the window
- * we assume that that button is used to resize to the left. */
- StartWindowSizing(w, (int)nw->pos_x < (w->width / 2));
- nw->SetDirty(w);
- return;
+ case WWT_RESIZEBOX:
+ /* When the resize widget is on the left size of the window
+ * we assume that that button is used to resize to the left. */
+ StartWindowSizing(w, (int)nw->pos_x < (w->width / 2));
+ nw->SetDirty(w);
+ return;
- case WWT_SHADEBOX:
- nw->SetDirty(w);
- w->SetShaded(!w->IsShaded());
- return;
+ case WWT_SHADEBOX:
+ nw->SetDirty(w);
+ w->SetShaded(!w->IsShaded());
+ return;
- case WWT_STICKYBOX:
- w->flags4 ^= WF_STICKY;
- nw->SetDirty(w);
- return;
+ case WWT_STICKYBOX:
+ w->flags4 ^= WF_STICKY;
+ nw->SetDirty(w);
+ return;
- default:
- break;
+ default:
+ break;
+ }
}
/* Widget has no index, so the window is not interested in it. */
@@ -2118,12 +2121,13 @@ static void MouseLoop(MouseClick click, int mousewheel)
}
} else {
switch (click) {
- case MC_DOUBLE_LEFT:
- DispatchLeftClickEvent(w, x - w->left, y - w->top, true);
- if (_mouseover_last_w == NULL) break; // The window got removed.
- /* fallthough, and also give a single-click for backwards compatibility */
case MC_LEFT:
+ case MC_DOUBLE_LEFT:
DispatchLeftClickEvent(w, x - w->left, y - w->top, false);
+ if (click == MC_DOUBLE_LEFT && _mouseover_last_w != NULL) {
+ /* Issue the doubleclick, if the window was not removed */
+ DispatchLeftClickEvent(w, x - w->left, y - w->top, true);
+ }
break;
default: