diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs
index 9b2d5b83e9..fc7d673431 100644
--- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs
+++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs
@@ -198,13 +198,7 @@ namespace OpenRA.Widgets
{
if (e.Event == KeyInputEvent.Down)
{
- if (e.Key >= Keycode.NUMBER_0 && e.Key <= Keycode.NUMBER_9)
- {
- var group = (int)e.Key - (int)Keycode.NUMBER_0;
- World.Selection.DoControlGroup(World, worldRenderer, group, e.Modifiers, e.MultiTapCount);
- return true;
- }
- else if (Hotkey.FromKeyInput(e) == Game.Settings.Keys.PauseKey && World.LocalPlayer != null) // Disable pausing for spectators
+ if (Hotkey.FromKeyInput(e) == Game.Settings.Keys.PauseKey && World.LocalPlayer != null) // Disable pausing for spectators
World.SetPauseState(!World.Paused);
else if (Hotkey.FromKeyInput(e) == Game.Settings.Keys.SelectAllUnitsKey)
{
diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index 29356da817..751ef99f70 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -490,6 +490,7 @@
+
diff --git a/OpenRA.Mods.RA/Widgets/Logic/ControlGroupLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ControlGroupLogic.cs
new file mode 100644
index 0000000000..09353fd932
--- /dev/null
+++ b/OpenRA.Mods.RA/Widgets/Logic/ControlGroupLogic.cs
@@ -0,0 +1,35 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using OpenRA.Graphics;
+using OpenRA.Widgets;
+
+namespace OpenRA.Mods.RA.Widgets.Logic
+{
+ public class ControlGroupLogic
+ {
+ [ObjectCreator.UseCtor]
+ public ControlGroupLogic(Widget widget, World world, WorldRenderer worldRenderer)
+ {
+ var keyhandler = widget.Get("CONTROLGROUP_KEYHANDLER");
+ keyhandler.OnKeyPress = e =>
+ {
+ if (e.Key >= Keycode.NUMBER_0 && e.Key <= Keycode.NUMBER_9)
+ {
+ var group = (int)e.Key - (int)Keycode.NUMBER_0;
+ world.Selection.DoControlGroup(world, worldRenderer, group, e.Modifiers, e.MultiTapCount);
+ return true;
+ }
+
+ return false;
+ };
+ }
+ }
+}
diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml
index 7a98ec4073..6869282c68 100644
--- a/mods/cnc/chrome/ingame.yaml
+++ b/mods/cnc/chrome/ingame.yaml
@@ -175,6 +175,8 @@ Container@OBSERVER_WIDGETS:
Container@PLAYER_WIDGETS:
Children:
+ LogicKeyListener@CONTROLGROUP_KEYHANDLER:
+ Logic:ControlGroupLogic
LogicTicker@SIDEBAR_TICKER:
WorldCommand:
Width:WINDOW_RIGHT
diff --git a/mods/d2k/chrome/ingame-player.yaml b/mods/d2k/chrome/ingame-player.yaml
index 2d4731e64f..b4b2c54a68 100644
--- a/mods/d2k/chrome/ingame-player.yaml
+++ b/mods/d2k/chrome/ingame-player.yaml
@@ -1,5 +1,7 @@
Container@PLAYER_WIDGETS:
Children:
+ LogicKeyListener@CONTROLGROUP_KEYHANDLER:
+ Logic:ControlGroupLogic
LogicTicker@SIDEBAR_TICKER:
Button@INGAME_DIPLOMACY_BUTTON:
X:162
diff --git a/mods/ra/chrome/ingame-player.yaml b/mods/ra/chrome/ingame-player.yaml
index 7f1313dddb..e50f119644 100644
--- a/mods/ra/chrome/ingame-player.yaml
+++ b/mods/ra/chrome/ingame-player.yaml
@@ -1,5 +1,7 @@
Container@PLAYER_WIDGETS:
Children:
+ LogicKeyListener@CONTROLGROUP_KEYHANDLER:
+ Logic:ControlGroupLogic
LogicTicker@SIDEBAR_TICKER:
Button@INGAME_DIPLOMACY_BUTTON:
X:162