From 26be68ae9823b7a078c8251f70038d98961388bc Mon Sep 17 00:00:00 2001 From: yexo Date: Sat, 3 Jul 2010 21:43:44 +0000 Subject: (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 --- src/airport_gui.cpp | 9 +++++++++ src/dock_gui.cpp | 9 +++++++++ src/hotkeys.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/hotkeys.h | 6 +++++- src/rail_gui.cpp | 10 ++++++++++ src/terraform_gui.cpp | 41 ++++++++++++++++++----------------------- src/terraform_gui.h | 2 -- src/toolbar_gui.cpp | 1 - src/window.cpp | 5 ++++- 9 files changed, 91 insertions(+), 28 deletions(-) (limited to 'src') 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(&_air_toolbar_desc, TRANSPORT_AIR); } +EventState AirportToolbarGlobalHotkeys(uint16 key, uint16 keycode) +{ + int num = CheckHotkeyMatch(_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(&_build_docks_toolbar_desc, TRANSPORT_WATER); } +EventState DockToolbarGlobalHotkeys(uint16 key, uint16 keycode) +{ + int num = CheckHotkeyMatch(_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 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 *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 *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(_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::terraform_hotkeys[] = { - Hotkey('Q', "lower", TTW_LOWER_LAND), - Hotkey('W', "raise", TTW_RAISE_LAND), - Hotkey('E', "level", TTW_LEVEL_LAND), - Hotkey('D', "dynamite", TTW_DEMOLISH), + Hotkey('Q' | WKC_GLOBAL_HOTKEY, "lower", TTW_LOWER_LAND), + Hotkey('W' | WKC_GLOBAL_HOTKEY, "raise", TTW_RAISE_LAND), + Hotkey('E' | WKC_GLOBAL_HOTKEY, "level", TTW_LEVEL_LAND), + Hotkey('D' | WKC_GLOBAL_HOTKEY, "dynamite", TTW_DEMOLISH), Hotkey('U', "buyland", TTW_BUY_LAND), Hotkey('I', "trees", TTW_PLANT_TREES), Hotkey('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(_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::terraform_editor_hotkeys[] = { - Hotkey('D', "dynamite", ETTW_DEMOLISH), - Hotkey('Q', "lower", ETTW_LOWER_LAND), - Hotkey('W', "raise", ETTW_RAISE_LAND), - Hotkey('E', "level", ETTW_LEVEL_LAND), + Hotkey('D' | WKC_GLOBAL_HOTKEY, "dynamite", ETTW_DEMOLISH), + Hotkey('Q' | WKC_GLOBAL_HOTKEY, "lower", ETTW_LOWER_LAND), + Hotkey('W' | WKC_GLOBAL_HOTKEY, "raise", ETTW_RAISE_LAND), + Hotkey('E' | WKC_GLOBAL_HOTKEY, "level", ETTW_LEVEL_LAND), Hotkey('R', "rocky", ETTW_PLACE_ROCKS), Hotkey('T', "desertlighthouse", ETTW_PLACE_DESERT_LIGHTHOUSE), Hotkey('Y', "transmitter", ETTW_PLACE_TRANSMITTER), @@ -754,7 +752,6 @@ Hotkey ScenarioEditorLandscapeGeneratio Hotkey *_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(&_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(_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); } /** -- cgit v1.2.3-54-g00ecf