RFR: JDK-8255439: System Tray icons get corrupted when windows scaling changes [v8]
Phil Race
prr at openjdk.java.net
Fri May 13 22:12:58 UTC 2022
On Fri, 13 May 2022 18:01:47 GMT, Harshitha Onkar <duke at openjdk.java.net> wrote:
>> In Windows, when desktop scaling is changed the tray icons was distorted/blurred a bit each time scaling changes.
>>
>> With the proposed fix, the tray icon scales according to on-the-fly DPI scale settings. A test case has been added which adds a MRI icon to system tray, to observe the icon scaling when DPI is changed. Since the scale cannot be programmatically changed (for dynamic on-the-fly scale changes), I have used a manual test case to test this scenario.
>>
>> When DPI changes usually two messages are sent by windows -
>>
>> - [WM_DPICHANGED](https://docs.microsoft.com/en-us/windows/win32/hidpi/wm-dpichanged)
>> - [WMPOSCHANGING](https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-windowposchanging)
>>
>> I'm triggering an update on tray icons on receiving WMPOSCHANGING msg through the Tray icon's Window Procedure. Triggering an update on WM_DPICHANGED was still causing the icons to be distorted, hence WMPOSCHANGING is being used as the message to trigger the update.
>
> Harshitha Onkar has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 11 additional commits since the last revision:
>
> - Merge branch 'master' into WinTrayIcon
> - reverted SystemTray changes
> - new changes - trayicon update triggered in WmTaskbarCreated
> - trayicon update triggered on taskbar reload
> - test case exit issue fix
> - formatting changes
> - resized instruction window and formatted line lengths
> - removed whitespaces error due to CRLF
> - removed whitespace error
> - added manual to test case
> - ... and 1 more: https://git.openjdk.java.net/jdk/compare/f228d55a...60391f28
src/java.desktop/windows/native/libawt/windows/awt_TrayIcon.cpp line 239:
> 237: env->ExceptionDescribe();
> 238: env->ExceptionClear();
> 239: }
Reduce this to ExceptionClear()
(1) ExceptionDescribe() per the docs https://docs.oracle.com/en/java/javase/17/docs/specs/jni/functions.html#exceptions
prints a message .. which we don't want .. it is meant for debugging not production and FWIW it clears the pending exception so any time you see Describe() followed by Clear() the code seems odd (well pointless)
2) safe_ExceptionOccurred is only useful if you are coming from a JNI method that uses C++ exception handling. Here the call originates from native doesn't it ? And we don't return to Java since it is a native event loop.
Ah I see we also have it called from _initIDs. Well I think for simplicity my advice stands.
So JUST env->ExceptionClear() will do
-------------
PR: https://git.openjdk.java.net/jdk/pull/8441
More information about the client-libs-dev
mailing list