From 0a98b031808cdd902dd6bbe247fd81ff313ad0f1 Mon Sep 17 00:00:00 2001 From: pfps Date: Wed, 8 Feb 2017 23:36:47 +0000 Subject: [PATCH] move some focus stuff into GUI thread to try to fix crash --- .../java/forge/screens/match/CMatchUI.java | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index d86499e434b..05eb88b7d6a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -566,31 +566,36 @@ public final class CMatchUI final FButton toFocus = enable1 && focus1 ? btn1 : (enable2 ? btn2 : null); + //pfps This seems wrong so I've commented it out for now and put a replacement in the runnable // Remove focusable so the right button grabs focus properly - //pfps This seems wrong so I've commented it out for now and replaced it //if (toFocus == btn2) //btn1.setFocusable(false); //else if (toFocus == btn1) //btn2.setFocusable(false); - btn2.setFocusable(enable2); // order may matter here - btn1.setFocusable(enable1); - btn2.setEnabled(enable2); - btn1.setEnabled(enable1); - // ensure we don't steal focus from an overlay - if (toFocus != null) { - final Runnable focusRoutine = new Runnable() { - @Override - public final void run() { + btn1.setEnabled(enable1); + btn2.setEnabled(enable2); + + final Runnable focusRoutine = new Runnable() { + @Override + public final void run() { + // The only button that is focusable is the enabled default button + // This prevents the user from somehow focusing on on some other button + // and then using the keyboard to try to select it + btn1.setFocusable(enable1 && focus1 ); + btn2.setFocusable(enable2 && !focus1); + // ensure we don't steal focus from an overlay + if (toFocus != null) { toFocus.requestFocus(); // focus here even if another window has focus - shouldn't have to do it this way but some popups grab window focus } + } }; - if (FThreads.isGuiThread()) { // run this now whether in EDT or not so that it doesn't clobber later stuff - FThreads.invokeInEdtNowOrLater(focusRoutine); - } else { - FThreads.invokeInEdtAndWait(focusRoutine); - }; - } + + if (FThreads.isGuiThread()) { // run this now whether in EDT or not so that it doesn't clobber later stuff + FThreads.invokeInEdtNowOrLater(focusRoutine); + } else { + FThreads.invokeInEdtAndWait(focusRoutine); + }; } @Override