From d1044c036a1321d377dfe0a79ed5d39888bfd3d1 Mon Sep 17 00:00:00 2001 From: yexo Date: Sat, 3 Jul 2010 13:27:32 +0000 Subject: [PATCH] (svn r20054) -Add: framework to check for hotkeys --- projects/openttd_vs100.vcxproj | 2 + projects/openttd_vs100.vcxproj.filters | 6 ++ projects/openttd_vs80.vcproj | 8 ++ projects/openttd_vs90.vcproj | 8 ++ source.list | 2 + src/hotkeys.cpp | 15 +++ src/hotkeys.h | 125 +++++++++++++++++++++++++ 7 files changed, 166 insertions(+) create mode 100644 src/hotkeys.cpp create mode 100644 src/hotkeys.h diff --git a/projects/openttd_vs100.vcxproj b/projects/openttd_vs100.vcxproj index 5198ee4bed..6fdf426ac1 100644 --- a/projects/openttd_vs100.vcxproj +++ b/projects/openttd_vs100.vcxproj @@ -330,6 +330,7 @@ + @@ -448,6 +449,7 @@ + diff --git a/projects/openttd_vs100.vcxproj.filters b/projects/openttd_vs100.vcxproj.filters index bccaedab8b..e063b737a4 100644 --- a/projects/openttd_vs100.vcxproj.filters +++ b/projects/openttd_vs100.vcxproj.filters @@ -193,6 +193,9 @@ Source Files + + Source Files + Source Files @@ -547,6 +550,9 @@ Header Files + + Header Files + Header Files diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj index e145e1c157..febd17297b 100644 --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -583,6 +583,10 @@ RelativePath=".\..\src\highscore.cpp" > + + @@ -1059,6 +1063,10 @@ RelativePath=".\..\src\highscore.h" > + + diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj index 0d1c69c886..e21534b4fc 100644 --- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -580,6 +580,10 @@ RelativePath=".\..\src\highscore.cpp" > + + @@ -1056,6 +1060,10 @@ RelativePath=".\..\src\highscore.h" > + + diff --git a/source.list b/source.list index 48bbf2fc36..412a2c1a44 100644 --- a/source.list +++ b/source.list @@ -31,6 +31,7 @@ gfxinit.cpp ground_vehicle.cpp heightmap.cpp highscore.cpp +hotkeys.cpp ini.cpp landscape.cpp map.cpp @@ -174,6 +175,7 @@ group_type.h gui.h heightmap.h highscore.h +hotkeys.h house.h house_type.h industry.h diff --git a/src/hotkeys.cpp b/src/hotkeys.cpp new file mode 100644 index 0000000000..9e52cbaa04 --- /dev/null +++ b/src/hotkeys.cpp @@ -0,0 +1,15 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file hotkeys.cpp Implementation of hotkey related functions */ + +#include "stdafx.h" +#include "hotkeys.h" + + diff --git a/src/hotkeys.h b/src/hotkeys.h new file mode 100644 index 0000000000..0b82f0c5fc --- /dev/null +++ b/src/hotkeys.h @@ -0,0 +1,125 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file hotkeys.h Hotkey related functions. */ + +#ifndef HOTKEYS_H +#define HOTKEYS_H + +#include "core/smallvec_type.hpp" + +/** + * All data for a single hotkey. The name (for saving/loading a configfile), + * a list of keycodes and a number to help identifying this hotkey. + */ +template +struct Hotkey { + typedef void (T::*hotkey_callback)(int); + + /** + * A wrapper around the callback function. This wrapper is needed because + * the size of a pointer to a member function depends on the class + * definition. The possible solutions are to either wrap the callback + * pointer in a class and dynamically allocate memory for it like we do + * now or making all class definitions available in hotkeys.cpp. + */ + struct CallbackWrapper { + CallbackWrapper(hotkey_callback callback) : + callback(callback) + {} + hotkey_callback callback; + }; + + /** + * Create a new Hotkey object with a single default keycode. + * @param default_keycode The default keycode for this hotkey. + * @param name The name of this hotkey. + * @param num Number of this hotkey, should be unique within the hotkey list. + * @param callback The function to call if the hotkey is pressed. + */ + Hotkey(uint16 default_keycode, const char *name, int num, hotkey_callback callback = NULL) : + name(name), + num(num) + { + if (callback == NULL) { + this->callback = NULL; + } else { + this->callback = new CallbackWrapper(callback); + } + if (default_keycode != 0) *this->keycodes.Append() = default_keycode; + } + + /** + * Create a new Hotkey object with multiple default keycodes. + * @param default_keycodes An array of default keycodes terminated with 0. + * @param name The name of this hotkey. + * @param num Number of this hotkey, should be unique within the hotkey list. + * @param callback The function to call if the hotkey is pressed. + */ + Hotkey(const uint16 *default_keycodes, const char *name, int num, hotkey_callback callback = NULL) : + name(name), + num(num) + { + if (callback == NULL) { + this->callback = NULL; + } else { + this->callback = new CallbackWrapper(callback); + } + + const uint16 *keycode = default_keycodes; + while (*keycode != 0) { + this->keycodes.Include(keycode); + keycode++; + } + } + + ~Hotkey() + { + delete this->callback; + } + + /** + * Add a keycode to this hotkey, from now that keycode will be matched + * in addition to any previously added keycodes. + * @param keycode The keycode to add. + */ + void AddKeycode(uint16 keycode) + { + this->keycodes.Include(keycode); + } + + const char *name; + int num; + SmallVector keycodes; + CallbackWrapper *callback; +}; + +#define HOTKEY_LIST_END(window_class) Hotkey((uint16)0, NULL, -1) + +/** + * Check if a keycode is bound to something. + * @param list The list with hotkeys to check + * @param keycode The keycode that was pressed + * @param w The window-pointer to give to the callback function (if any). + * @return The number of the matching hotkey or -1. + */ +template +int CheckHotkeyMatch(Hotkey *list, uint16 keycode, T *w) +{ + while (list->num != -1) { + if (list->keycodes.Contains(keycode)) { + if (list->callback != NULL) (w->*(list->callback->callback))(-1); + return list->num; + } + list++; + } + return -1; +} + +#endif /* HOTKEYS_H */