Hi Sergey,
as a workaround resetting the internal windows state will do.
Question is - do we use OpenGL framework
anywhere aside of OSX? I doubt we do. And does new Metal framework
exhibit this problem? I know this
question is probably not for you specifically, but still.
Anyways - shouldn't we add some specific comments about what this
code is workaround for so we don't
forget to clean it up later when the main problem is gone (one way or
another)?
/Alex
On 03-Feb-20 5:07, Sergey Bylokhov wrote:
Hello.
Please review the fix for jdk/client.
Bug: https://bugs.openjdk.java.net/browse/JDK-8040630
Fix: http://cr.openjdk.java.net/~serb/8040630/webrev.00
This change is intended to fix the flickering of popup menus on
macOS. The root cause of the problem is that the native windows
for popup menus are cached internally. So when we show such a
cached window to the user he will see old content till the moment
we draw the new one.
As a fix we could
- Drop the internal state(surface) of the window which contains the
old content, as suggested in the current fix we set its size to 1x1
pixels.
- Clean the old content by something like graphics.clearRect(), but
since the draw operation is asynchronous it is possible it will
not be completed when the user will see the popup.
- Drop the caching completely, I am not sure that we really needed it,
I have checked the performance PopupFactory.getPopup() when the
cache is enabled/disabled and did not found a big difference. But
since I plan to backport this to jdk11, I would like to minimize the
fix, and drop the cache sometime later.
Notes:
- The easiest way to reproduce the bug is to run SwingSet2, and
quickly open/reopen the "File" and "Look and feel" menu.
- The bug is not really macOS specific, but java2D OGL pipeline"
specific where the actual draw operations are asynchronous.