(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
replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
yexo 14 years ago
parent 9be9302cdb
commit 26be68ae98

@ -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,

@ -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.

@ -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;
}
}
}

@ -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 */

@ -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 */

@ -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);
}

@ -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 */

@ -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;

@ -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);
}
/**

Loading…
Cancel
Save