diff --git a/plugins/hotkeys.cpp b/plugins/hotkeys.cpp index 609941573..133325cce 100644 --- a/plugins/hotkeys.cpp +++ b/plugins/hotkeys.cpp @@ -26,7 +26,6 @@ static const string INVOKE_HOTKEYS_COMMAND = "hotkeys"; static const std::string MENU_SCREEN_FOCUS_STRING = "dfhack/lua/hotkeys/menu"; static bool valid = false; // whether the following two vars contain valid data -static string current_focus; static map current_bindings; static vector sorted_keys; @@ -38,14 +37,13 @@ static bool can_invoke(const string &cmdline, df::viewscreen *screen) { } static int cleanupHotkeys(lua_State *) { - DEBUG(log).print("cleaning up old stub keybindings for %s\n", current_focus.c_str()); + DEBUG(log).print("cleaning up old stub keybindings for:\n %s\n", join_strings("\n", Gui::getFocusStrings(Gui::getCurViewscreen(true))).c_str()); std::for_each(sorted_keys.begin(), sorted_keys.end(), [](const string &sym) { string keyspec = sym + "@" + MENU_SCREEN_FOCUS_STRING; DEBUG(log).print("clearing keybinding: %s\n", keyspec.c_str()); Core::getInstance().ClearKeyBindings(keyspec); }); valid = false; - current_focus = ""; sorted_keys.clear(); current_bindings.clear(); return 0; @@ -89,8 +87,7 @@ static void find_active_keybindings(df::viewscreen *screen, bool filtermenu) { } valid_keys.push_back("`"); - - current_focus = Gui::getFocusStrings(screen)[0]; + vector focusStrings = Gui::getFocusStrings(screen); for (int shifted = 0; shifted < 2; shifted++) { for (int alt = 0; alt < 2; alt++) { for (int ctrl = 0; ctrl < 2; ctrl++) { @@ -112,9 +109,11 @@ static void find_active_keybindings(df::viewscreen *screen, bool filtermenu) { vector tokens; split_string(&tokens, *invoke_cmd, ":"); string focus = tokens[0].substr(1); - if (prefix_matches(focus, current_focus)) { - auto cmdline = trim(tokens[1]); - add_binding_if_valid(sym, cmdline, screen, filtermenu); + for(string focusString : focusStrings) { + if (prefix_matches(toLower(focus), toLower(focusString))) { + auto cmdline = trim(tokens[1]); + add_binding_if_valid(sym, cmdline, screen, filtermenu); + } } } } @@ -145,8 +144,8 @@ static void list(color_ostream &out) { if (!valid) find_active_keybindings(Gui::getCurViewscreen(true), false); - out.print("Valid keybindings for the current screen (%s)\n", - current_focus.c_str()); + out.print("Valid keybindings for the current focus:\n %s\n", + join_strings("\n", Gui::getFocusStrings(Gui::getCurViewscreen(true))).c_str()); std::for_each(sorted_keys.begin(), sorted_keys.end(), [&](const string &sym) { out.print("%s: %s\n", sym.c_str(), current_bindings[sym].c_str()); });