diff --git a/ChangeLog.md b/ChangeLog.md index 62ea71992..c493d8c56 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -79,6 +79,11 @@ the SSH connection timeout specified using the `ConnectTimeout` OpenSSH config file keyword was interpreted as milliseconds rather than seconds. This caused the SSH connection to fail if the timeout was too low. +16. Fixed an issue whereby the Java TurboVNC Viewer threw an +IllegalComponentStateException if "Remote desktop size" was changed to "Auto" +in the TurboVNC Viewer Options dialog while the viewer was actively receiving +framebuffer updates from a VNC server. + 2.2.9 ESR ========= diff --git a/java/com/turbovnc/vncviewer/CConn.java b/java/com/turbovnc/vncviewer/CConn.java index 6f6c1d6ae..1ad513d5c 100644 --- a/java/com/turbovnc/vncviewer/CConn.java +++ b/java/com/turbovnc/vncviewer/CConn.java @@ -1,6 +1,6 @@ /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. * Copyright 2009-2011 Pierre Ossman for Cendio AB - * Copyright (C) 2011-2023 D. R. Commander. All Rights Reserved. + * Copyright (C) 2011-2023, 2025 D. R. Commander. All Rights Reserved. * Copyright (C) 2011-2015 Brian P. Hinz * * This is free software; you can redistribute it and/or modify @@ -1763,9 +1763,11 @@ public void getOptions() { if (options.fullScreen.isSelected() != opts.fullScreen) toggleFullScreen(); - else if (recreate) - recreateViewport(); - else if (reconfigure) + else if (recreate) { + synchronized (this) { + recreateViewport(); + } + } else if (reconfigure) reconfigureAndRepaintViewport(false); if (deleteRestore) { savedState = -1; @@ -1793,7 +1795,9 @@ public void toggleToolbar() { return; showToolbar = !showToolbar; if (viewport != null) { - recreateViewport(); + synchronized (this) { + recreateViewport(); + } viewport.showToolbar(showToolbar); } menu.showToolbar.setSelected(showToolbar); @@ -1803,8 +1807,11 @@ public void toggleToolbar() { public void toggleFullScreen() { opts.fullScreen = !opts.fullScreen; menu.fullScreen.setSelected(opts.fullScreen); - if (viewport != null) - recreateViewport(true); + if (viewport != null) { + synchronized (this) { + recreateViewport(true); + } + } } public boolean shouldGrab() {