From b5f92056eeb9a3c2581ab2be664e0e98ccfc50bf Mon Sep 17 00:00:00 2001
From: Thomas Winwood <twwinwood@gmail.com>
Date: Fri, 5 Apr 2019 20:22:04 +0100
Subject: [PATCH 1/2] Fix number of cards Taigam lets you dig through (#5682)

---
 Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java b/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java
index 86f837ebf1..10f37ba6ec 100644
--- a/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java
+++ b/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java
@@ -54,7 +54,7 @@ public final class TaigamSidisisHand extends CardImpl {
         this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SkipDrawStepEffect()));
 
         // At the beginning of your upkeep, look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard.
-        this.addAbility(new BeginningOfUpkeepTriggeredAbility(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1),
+        this.addAbility(new BeginningOfUpkeepTriggeredAbility(new LookLibraryAndPickControllerEffect(new StaticValue(3), false, new StaticValue(1),
                 StaticFilters.FILTER_CARD, Zone.GRAVEYARD, false, false, false, Zone.HAND, false), TargetController.YOU, false));
 
         // {B}, {T}, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn.

From 1dbf5ba1833df85d167cfe69694911ae02e6924d Mon Sep 17 00:00:00 2001
From: Oleg Agafonov <jaydi85@gmail.com>
Date: Sat, 6 Apr 2019 01:02:47 +0400
Subject: [PATCH 2/2] * UI: improved hotkeys:   * added support for characters
 keys (no more skip hits in chat or search windows while typing, #4676);   *
 fixed that user can activate skip button in choose dialogs;   * fixed that
 mouse clicks outside from chat fields can't reset the focus;

---
 .../java/mage/client/dialog/MageDialog.java   | 12 ++++++
 .../main/java/mage/client/game/GamePanel.java | 38 +++++++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/Mage.Client/src/main/java/mage/client/dialog/MageDialog.java b/Mage.Client/src/main/java/mage/client/dialog/MageDialog.java
index 72e4a3b64e..7c932ef941 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/MageDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/MageDialog.java
@@ -33,6 +33,18 @@ public class MageDialog extends javax.swing.JInternalFrame {
 
     }
 
+    public static boolean isModalDialogActivated() {
+        for (JInternalFrame frame : MageFrame.getDesktop().getAllFrames()) {
+            if (frame instanceof MageDialog) {
+                MageDialog md = (MageDialog) frame;
+                if (md.isVisible() && md.isModal()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
     public static void printFramesOrder(String name) {
         ///*
         JInternalFrame[] frames = MageFrame.getDesktop().getAllFrames();
diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java
index 4370c59f4a..f585548caf 100644
--- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java
@@ -1615,6 +1615,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F8_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 btnToggleMacroActionPerformed(actionEvent);
             }
         });
@@ -1624,6 +1625,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F3_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 restorePriorityActionPerformed(actionEvent);
             }
         });
@@ -1651,6 +1653,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F4_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 btnEndTurnActionPerformed(actionEvent);
             }
         });
@@ -1668,6 +1671,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F5_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 btnUntilEndOfTurnActionPerformed(actionEvent);
             }
         });
@@ -1677,6 +1681,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F6_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 btnEndTurnSkipStackActionPerformed(actionEvent);
             }
         });
@@ -1694,6 +1699,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F7_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 btnUntilNextMainPhaseActionPerformed(actionEvent);
             }
         });
@@ -1711,6 +1717,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F9_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 btnPassPriorityUntilNextYourTurnActionPerformed(actionEvent);
             }
         });
@@ -1728,6 +1735,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F11_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 btnSkipToEndStepBeforeYourTurnActionPerformed(actionEvent);
             }
         });
@@ -1745,6 +1753,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F10_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 btnPassPriorityUntilStackResolvedActionPerformed(actionEvent);
             }
         });
@@ -1767,6 +1776,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("F2_PRESS", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 if (feedbackPanel != null) {
                     feedbackPanel.pressOKYesOrDone();
                 }
@@ -1778,6 +1788,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("ENLARGE", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 ActionCallback callback = Plugins.instance.getActionCallback();
                 ((MageActionCallback) callback).enlargeCard(EnlargeMode.NORMAL);
             }
@@ -1788,6 +1799,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("ENLARGE_SOURCE", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 ActionCallback callback = Plugins.instance.getActionCallback();
                 ((MageActionCallback) callback).enlargeCard(EnlargeMode.ALTERNATE);
             }
@@ -1798,6 +1810,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("BIG_IMAGE", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 imagePanelState = !imagePanelState;
                 if (!imagePanelState) {
                     jSplitPane0.resetToPreferredSizes();
@@ -1813,6 +1826,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("USEFIRSTMANAABILITY", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 SessionHandler.sendPlayerAction(PlayerAction.USE_FIRST_MANA_ABILITY_ON, gameId, null);
                 setMenuStates(
                         PreferencesDialog.getCachedValue(KEY_GAME_MANA_AUTOPAYMENT, "true").equals("true"),
@@ -1837,6 +1851,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("ENLARGE_RELEASE", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 ActionCallback callback = Plugins.instance.getActionCallback();
                 ((MageActionCallback) callback).hideEnlargedCard();
             }
@@ -1847,6 +1862,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.getActionMap().put("USEFIRSTMANAABILITY_RELEASE", new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
+                if (isUserImputActive()) return;
                 SessionHandler.sendPlayerAction(PlayerAction.USE_FIRST_MANA_ABILITY_OFF, gameId, null);
                 setMenuStates(
                         PreferencesDialog.getCachedValue(KEY_GAME_MANA_AUTOPAYMENT, "true").equals("true"),
@@ -2218,6 +2234,21 @@ public final class GamePanel extends javax.swing.JPanel {
         updateSkipButtons();
     }
 
+    private boolean isChatInputUnderCursor(Point p) {
+        Component c = this.getComponentAt(p);
+        return gameChatPanel.getTxtMessageInputComponent().equals(c) || userChatPanel.getTxtMessageInputComponent().equals(c);
+    }
+
+    private boolean isChatInputActive() {
+        Component c = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+        return gameChatPanel.getTxtMessageInputComponent().equals(c) || userChatPanel.getTxtMessageInputComponent().equals(c);
+    }
+
+    private boolean isUserImputActive() {
+        // any imput or choose dialog active (need to disable skip buttons in dialogs and chat)
+        return MageDialog.isModalDialogActivated() || isChatInputActive();
+    }
+
     private void btnUntilEndOfTurnActionPerformed(java.awt.event.ActionEvent evt) {
         SessionHandler.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_TURN_END_STEP, gameId, null);
         skipButtons.activateSkipButton(KEY_CONTROL_END_STEP);
@@ -2481,6 +2512,13 @@ public final class GamePanel extends javax.swing.JPanel {
             boolean isActionEvent = false;
             if (id == MouseEvent.MOUSE_PRESSED) {
                 isActionEvent = true;
+                // clear chat focus on click
+                if (event instanceof MouseEvent) {
+                    MouseEvent me = (MouseEvent) event;
+                    if (isChatInputActive() && !isChatInputUnderCursor(me.getPoint())) {
+                        KeyboardFocusManager.getCurrentKeyboardFocusManager().clearFocusOwner();
+                    }
+                }
             } else if (id == KeyEvent.KEY_PRESSED) {
                 KeyEvent key = (KeyEvent) event;
                 int keyCode = key.getKeyCode();