summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryexo <yexo@openttd.org>2010-07-03 21:43:44 +0000
committeryexo <yexo@openttd.org>2010-07-03 21:43:44 +0000
commit26be68ae9823b7a078c8251f70038d98961388bc (patch)
treedcd4778a53008b1805224ae3143dd7511adb3b20
parent9be9302cdbe5e23ad7565e7d76b9ac2414fb0796 (diff)
downloadopenttd-26be68ae9823b7a078c8251f70038d98961388bc.tar.xz
(svn r20070) -Feature: when none of the open windows handles a keypress, try all toolbars for global hotkeys
Users that have run a version between r20056 and r20068 should delete their hotkeys.cfg to reset the terraform toolbar hotkeys to default
-rw-r--r--src/airport_gui.cpp9
-rw-r--r--src/dock_gui.cpp9
-rw-r--r--src/hotkeys.cpp36
-rw-r--r--src/hotkeys.h6
-rw-r--r--src/rail_gui.cpp10
-rw-r--r--src/terraform_gui.cpp41
-rw-r--r--src/terraform_gui.h2
-rw-r--r--src/toolbar_gui.cpp1
-rw-r--r--src/window.cpp5
9 files changed, 91 insertions, 28 deletions
diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp
index 942f50180..4e2b5712b 100644
--- a/src/airport_gui.cpp
+++ b/src/airport_gui.cpp
@@ -176,6 +176,15 @@ void ShowBuildAirToolbar()
AllocateWindowDescFront<BuildAirToolbarWindow>(&_air_toolbar_desc, TRANSPORT_AIR);
}
+EventState AirportToolbarGlobalHotkeys(uint16 key, uint16 keycode)
+{
+ int num = CheckHotkeyMatch<BuildAirToolbarWindow>(_airtoolbar_hotkeys, keycode, NULL, true);
+ if (num == -1) return ES_NOT_HANDLED;
+ ShowBuildAirToolbar();
+ Window *w = FindWindowByClass(WC_BUILD_TOOLBAR);
+ return w->OnKeyPress(key, keycode);
+}
+
/** Airport widgets in the airport picker window. */
enum AirportPickerWidgets {
BAIRW_CLASS_DROPDOWN,
diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp
index 72e2b234d..54756608f 100644
--- a/src/dock_gui.cpp
+++ b/src/dock_gui.cpp
@@ -302,6 +302,15 @@ void ShowBuildDocksToolbar()
AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_toolbar_desc, TRANSPORT_WATER);
}
+EventState DockToolbarGlobalHotkeys(uint16 key, uint16 keycode)
+{
+ int num = CheckHotkeyMatch<BuildDocksToolbarWindow>(_dockstoolbar_hotkeys, keycode, NULL, true);
+ if (num == -1) return ES_NOT_HANDLED;
+ ShowBuildDocksToolbar();
+ Window *w = FindWindowByClass(WC_BUILD_TOOLBAR);
+ return w->OnKeyPress(key, keycode);
+}
+
/**
* Nested widget parts of docks toolbar, scenario editor version.
* Positions of #DTW_DEPOT, #DTW_STATION, and #DTW_BUOY widgets have changed.
diff --git a/src/hotkeys.cpp b/src/hotkeys.cpp
index eefe96adb..14fb292c2 100644
--- a/src/hotkeys.cpp
+++ b/src/hotkeys.cpp
@@ -10,10 +10,12 @@
/** @file hotkeys.cpp Implementation of hotkey related functions */
#include "stdafx.h"
+#include "openttd.h"
#include "hotkeys.h"
#include "ini_type.h"
#include "string_func.h"
#include "gfx_type.h"
+#include "window_gui.h"
#include <string.h>
char *_hotkeys_file;
@@ -284,3 +286,37 @@ void SaveHotkeysToConfig()
SaveLoadHotkeys(true);
}
+typedef EventState GlobalHotkeyHandler(uint16, uint16);
+
+GlobalHotkeyHandler RailToolbarGlobalHotkeys;
+GlobalHotkeyHandler DockToolbarGlobalHotkeys;
+GlobalHotkeyHandler AirportToolbarGlobalHotkeys;
+GlobalHotkeyHandler TerraformToolbarGlobalHotkeys;
+GlobalHotkeyHandler TerraformToolbarEditorGlobalHotkeys;
+
+
+GlobalHotkeyHandler *_global_hotkey_handlers[] = {
+ RailToolbarGlobalHotkeys,
+ DockToolbarGlobalHotkeys,
+ AirportToolbarGlobalHotkeys,
+ TerraformToolbarGlobalHotkeys,
+};
+
+GlobalHotkeyHandler *_global_hotkey_handlers_editor[] = {
+ TerraformToolbarEditorGlobalHotkeys,
+};
+
+
+void HandleGlobalHotkeys(uint16 key, uint16 keycode)
+{
+ if (_game_mode == GM_NORMAL) {
+ for (uint i = 0; i < lengthof(_global_hotkey_handlers); i++) {
+ if (_global_hotkey_handlers[i](key, keycode) == ES_HANDLED) return;
+ }
+ } else if (_game_mode == GM_EDITOR) {
+ for (uint i = 0; i < lengthof(_global_hotkey_handlers_editor); i++) {
+ if (_global_hotkey_handlers_editor[i](key, keycode) == ES_HANDLED) return;
+ }
+ }
+}
+
diff --git a/src/hotkeys.h b/src/hotkeys.h
index e63cc573f..240894b8d 100644
--- a/src/hotkeys.h
+++ b/src/hotkeys.h
@@ -13,6 +13,7 @@
#define HOTKEYS_H
#include "core/smallvec_type.hpp"
+#include "gfx_type.h"
/**
* All data for a single hotkey. The name (for saving/loading a configfile),
@@ -115,7 +116,7 @@ int CheckHotkeyMatch(Hotkey<T> *list, uint16 keycode, T *w, bool global_only = f
{
while (list->num != -1) {
if (list->keycodes.Contains(keycode | WKC_GLOBAL_HOTKEY) || (!global_only && list->keycodes.Contains(keycode))) {
- if (list->callback != NULL) (w->*(list->callback->callback))(-1);
+ if (!global_only && list->callback != NULL) (w->*(list->callback->callback))(-1);
return list->num;
}
list++;
@@ -126,4 +127,7 @@ int CheckHotkeyMatch(Hotkey<T> *list, uint16 keycode, T *w, bool global_only = f
void LoadHotkeysFromConfig();
void SaveHotkeysToConfig();
+
+void HandleGlobalHotkeys(uint16 key, uint16 keycode);
+
#endif /* HOTKEYS_H */
diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp
index 66e8528d0..8d206389c 100644
--- a/src/rail_gui.cpp
+++ b/src/rail_gui.cpp
@@ -910,6 +910,16 @@ void ShowBuildRailToolbar(RailType railtype)
_remove_button_clicked = false;
}
+EventState RailToolbarGlobalHotkeys(uint16 key, uint16 keycode)
+{
+ extern RailType _last_built_railtype;
+ int num = CheckHotkeyMatch<BuildRailToolbarWindow>(_railtoolbar_hotkeys, keycode, NULL, true);
+ if (num == -1) return ES_NOT_HANDLED;
+ ShowBuildRailToolbar(_last_built_railtype);
+ Window *w = FindWindowByClass(WC_BUILD_TOOLBAR);
+ return w->OnKeyPress(key, keycode);
+}
+
/* TODO: For custom stations, respect their allowed platforms/lengths bitmasks!
* --pasky */
diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp
index f4a9426a3..7d708c2fe 100644
--- a/src/terraform_gui.cpp
+++ b/src/terraform_gui.cpp
@@ -286,10 +286,10 @@ struct TerraformToolbarWindow : Window {
};
Hotkey<TerraformToolbarWindow> TerraformToolbarWindow::terraform_hotkeys[] = {
- Hotkey<TerraformToolbarWindow>('Q', "lower", TTW_LOWER_LAND),
- Hotkey<TerraformToolbarWindow>('W', "raise", TTW_RAISE_LAND),
- Hotkey<TerraformToolbarWindow>('E', "level", TTW_LEVEL_LAND),
- Hotkey<TerraformToolbarWindow>('D', "dynamite", TTW_DEMOLISH),
+ Hotkey<TerraformToolbarWindow>('Q' | WKC_GLOBAL_HOTKEY, "lower", TTW_LOWER_LAND),
+ Hotkey<TerraformToolbarWindow>('W' | WKC_GLOBAL_HOTKEY, "raise", TTW_RAISE_LAND),
+ Hotkey<TerraformToolbarWindow>('E' | WKC_GLOBAL_HOTKEY, "level", TTW_LEVEL_LAND),
+ Hotkey<TerraformToolbarWindow>('D' | WKC_GLOBAL_HOTKEY, "dynamite", TTW_DEMOLISH),
Hotkey<TerraformToolbarWindow>('U', "buyland", TTW_BUY_LAND),
Hotkey<TerraformToolbarWindow>('I', "trees", TTW_PLANT_TREES),
Hotkey<TerraformToolbarWindow>('O', "placesign", TTW_PLACE_SIGN),
@@ -355,14 +355,12 @@ Window *ShowTerraformToolbar(Window *link)
return w;
}
-void ShowTerraformToolbarWithTool(uint16 key, uint16 keycode)
+EventState TerraformToolbarGlobalHotkeys(uint16 key, uint16 keycode)
{
- Window *w = FindWindowById(WC_SCEN_LAND_GEN, 0);
-
- if (w == NULL) w = ShowTerraformToolbar(NULL);
- if (w == NULL) return;
-
- w->OnKeyPress(key, keycode);
+ int num = CheckHotkeyMatch<TerraformToolbarWindow>(_terraform_hotkeys, keycode, NULL, true);
+ if (num == -1) return ES_NOT_HANDLED;
+ Window *w = ShowTerraformToolbar(NULL);
+ return w->OnKeyPress(key, keycode);
}
static byte _terraform_size = 1;
@@ -742,10 +740,10 @@ struct ScenarioEditorLandscapeGenerationWindow : Window {
};
Hotkey<ScenarioEditorLandscapeGenerationWindow> ScenarioEditorLandscapeGenerationWindow::terraform_editor_hotkeys[] = {
- Hotkey<ScenarioEditorLandscapeGenerationWindow>('D', "dynamite", ETTW_DEMOLISH),
- Hotkey<ScenarioEditorLandscapeGenerationWindow>('Q', "lower", ETTW_LOWER_LAND),
- Hotkey<ScenarioEditorLandscapeGenerationWindow>('W', "raise", ETTW_RAISE_LAND),
- Hotkey<ScenarioEditorLandscapeGenerationWindow>('E', "level", ETTW_LEVEL_LAND),
+ Hotkey<ScenarioEditorLandscapeGenerationWindow>('D' | WKC_GLOBAL_HOTKEY, "dynamite", ETTW_DEMOLISH),
+ Hotkey<ScenarioEditorLandscapeGenerationWindow>('Q' | WKC_GLOBAL_HOTKEY, "lower", ETTW_LOWER_LAND),
+ Hotkey<ScenarioEditorLandscapeGenerationWindow>('W' | WKC_GLOBAL_HOTKEY, "raise", ETTW_RAISE_LAND),
+ Hotkey<ScenarioEditorLandscapeGenerationWindow>('E' | WKC_GLOBAL_HOTKEY, "level", ETTW_LEVEL_LAND),
Hotkey<ScenarioEditorLandscapeGenerationWindow>('R', "rocky", ETTW_PLACE_ROCKS),
Hotkey<ScenarioEditorLandscapeGenerationWindow>('T', "desertlighthouse", ETTW_PLACE_DESERT_LIGHTHOUSE),
Hotkey<ScenarioEditorLandscapeGenerationWindow>('Y', "transmitter", ETTW_PLACE_TRANSMITTER),
@@ -754,7 +752,6 @@ Hotkey<ScenarioEditorLandscapeGenerationWindow> ScenarioEditorLandscapeGeneratio
Hotkey<ScenarioEditorLandscapeGenerationWindow> *_terraform_editor_hotkeys = ScenarioEditorLandscapeGenerationWindow::terraform_editor_hotkeys;
-
static const WindowDesc _scen_edit_land_gen_desc(
WDP_AUTO, 0, 0,
WC_SCEN_LAND_GEN, WC_NONE,
@@ -767,12 +764,10 @@ Window *ShowEditorTerraformToolbar()
return AllocateWindowDescFront<ScenarioEditorLandscapeGenerationWindow>(&_scen_edit_land_gen_desc, 0);
}
-void ShowEditorTerraformToolbarWithTool(uint16 key, uint16 keycode)
+EventState TerraformToolbarEditorGlobalHotkeys(uint16 key, uint16 keycode)
{
- Window *w = FindWindowById(WC_SCEN_LAND_GEN, 0);
-
- if (w == NULL) w = ShowEditorTerraformToolbar();
- if (w == NULL) return;
-
- w->OnKeyPress(key, keycode);
+ int num = CheckHotkeyMatch<ScenarioEditorLandscapeGenerationWindow>(_terraform_editor_hotkeys, keycode, NULL, true);
+ if (num == -1) return ES_NOT_HANDLED;
+ Window *w = ShowEditorTerraformToolbar();
+ return w->OnKeyPress(key, keycode);
}
diff --git a/src/terraform_gui.h b/src/terraform_gui.h
index c6ea5f51e..d611e297e 100644
--- a/src/terraform_gui.h
+++ b/src/terraform_gui.h
@@ -15,8 +15,6 @@
#include "window_type.h"
Window *ShowTerraformToolbar(Window *link = NULL);
-void ShowTerraformToolbarWithTool(uint16 key, uint16 keycode);
Window *ShowEditorTerraformToolbar();
-void ShowEditorTerraformToolbarWithTool(uint16 key, uint16 keycode);
#endif /* GUI_H */
diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp
index a7b036471..25b8adcd9 100644
--- a/src/toolbar_gui.cpp
+++ b/src/toolbar_gui.cpp
@@ -1602,7 +1602,6 @@ public:
case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break;
case 'L': ShowEditorTerraformToolbar(); break;
- case 'Q': case 'W': case 'E': case 'D': ShowEditorTerraformToolbarWithTool(key, keycode); break;
case 'M': ShowSmallMap(); break;
case 'V': ShowExtraViewPortWindow(); break;
default: return ES_NOT_HANDLED;
diff --git a/src/window.cpp b/src/window.cpp
index f15293ea3..2379f173b 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -32,6 +32,7 @@
#include "strings_func.h"
#include "settings_type.h"
#include "newgrf_debug.h"
+#include "hotkeys.h"
#include "table/sprites.h"
@@ -1955,7 +1956,9 @@ void HandleKeypress(uint32 raw_key)
w = FindWindowById(WC_MAIN_TOOLBAR, 0);
/* When there is no toolbar w is null, check for that */
- if (w != NULL) w->OnKeyPress(key, keycode);
+ if (w != NULL && w->OnKeyPress(key, keycode) == ES_HANDLED) return;
+
+ HandleGlobalHotkeys(key, keycode);
}
/**