Index: binaries/data/mods/public/gui/common/tab_buttons.xml =================================================================== --- binaries/data/mods/public/gui/common/tab_buttons.xml +++ binaries/data/mods/public/gui/common/tab_buttons.xml @@ -1,11 +1,11 @@ - selectNextTab(1); + selectNextTab(1); - selectNextTab(-1); + selectNextTab(-1); Index: binaries/data/mods/public/gui/session/hotkeys/misc.xml =================================================================== --- binaries/data/mods/public/gui/session/hotkeys/misc.xml +++ binaries/data/mods/public/gui/session/hotkeys/misc.xml @@ -76,11 +76,11 @@ - unloadAll(); + unloadAll(); - stopUnits(g_Selection.toList()); + stopUnits(g_Selection.toList()); @@ -106,11 +106,11 @@ - findIdleUnit(g_MilitaryTypes); + findIdleUnit(g_MilitaryTypes); - findIdleUnit(["!Domestic"]); + findIdleUnit(["!Domestic"]); Index: binaries/data/mods/public/gui/session/hotkeys/training.xml =================================================================== --- binaries/data/mods/public/gui/session/hotkeys/training.xml +++ binaries/data/mods/public/gui/session/hotkeys/training.xml @@ -2,36 +2,36 @@ - addTrainingByPosition(0); + addTrainingByPosition(0); - addTrainingByPosition(1); + addTrainingByPosition(1); - addTrainingByPosition(2); + addTrainingByPosition(2); - addTrainingByPosition(3); + addTrainingByPosition(3); - addTrainingByPosition(4); + addTrainingByPosition(4); - addTrainingByPosition(5); + addTrainingByPosition(5); - addTrainingByPosition(6); + addTrainingByPosition(6); Index: binaries/data/mods/public/gui/session/minimap_panel.xml =================================================================== --- binaries/data/mods/public/gui/session/minimap_panel.xml +++ binaries/data/mods/public/gui/session/minimap_panel.xml @@ -27,7 +27,7 @@ sprite_over="stretched:session/minimap-idle-highlight.png" sprite_disabled="stretched:session/minimap-idle-disabled.png" > - findIdleUnit(g_WorkerTypes); + findIdleUnit(g_WorkerTypes); Index: binaries/data/mods/public/gui/session/unit_actions.js =================================================================== --- binaries/data/mods/public/gui/session/unit_actions.js +++ binaries/data/mods/public/gui/session/unit_actions.js @@ -1169,7 +1169,8 @@ }, "execute": function(entStates) { - // TODO: Would be nicer to cycle between the rallypoints of multiple entities instead of just using the first + // TODO: Would be nicer to cycle between the rallypoints of multiple entities instead of just using the first, + // this would require Keydown event on the hotkey let focusTarget; for (let entState of entStates) if (entState.rallyPoint && entState.rallyPoint.position) Index: binaries/data/mods/public/gui/summary/summary.xml =================================================================== --- binaries/data/mods/public/gui/summary/summary.xml +++ binaries/data/mods/public/gui/summary/summary.xml @@ -17,11 +17,11 @@ - selectNextTab(1); + selectNextTab(1); - selectNextTab(-1); + selectNextTab(-1); Index: source/gui/CGUI.cpp =================================================================== --- source/gui/CGUI.cpp +++ source/gui/CGUI.cpp @@ -81,8 +81,12 @@ HotkeyInputHandler(ev); ret = IN_HANDLED; - if (ev->ev.type == SDL_HOTKEYDOWN) + // On keydown send 1 or 2 messages depending on repeat flag. This does not work on linux + // for special keys (shift, alt, ctrl), since the linux keyboard event manager sends the KEYDOWN only once. + if (ev->ev.type == SDL_HOTKEYDOWN && (int)ev->ev.user.data2 == 0) obj->SendEvent(GUIM_PRESSED, "press"); + if (ev->ev.type == SDL_HOTKEYDOWN) + obj->SendEvent(GUIM_PRESSED, "keydown"); else obj->SendEvent(GUIM_RELEASED, "release"); } Index: source/ps/Hotkey.cpp =================================================================== --- source/ps/Hotkey.cpp +++ source/ps/Hotkey.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2017 Wildfire Games. +/* Copyright (C) 2018 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -214,6 +214,9 @@ SDL_Event_ phantom; phantom.ev.type = ((ev->ev.type == SDL_KEYDOWN) || (ev->ev.type == SDL_MOUSEBUTTONDOWN)) ? SDL_KEYDOWN : SDL_KEYUP; + if (phantom.ev.type == SDL_KEYDOWN) + phantom.ev.key.repeat = ev->ev.key.repeat; + if ((keycode == SDLK_LSHIFT) || (keycode == SDLK_RSHIFT)) { phantom.ev.key.keysym.sym = (SDL_Keycode)UNIFIED_SHIFT; @@ -307,6 +310,7 @@ SDL_Event_ hotkeyNotification; hotkeyNotification.ev.type = SDL_HOTKEYDOWN; hotkeyNotification.ev.user.data1 = const_cast(closestMapNames[i]); + hotkeyNotification.ev.user.data2 = (void*)(ev->ev.type == SDL_KEYDOWN ? ev->ev.key.repeat : 0); in_push_priority_event(&hotkeyNotification); }