<AWT Dev> Fwd: Found and solved a bug on Cursor Management on Windows platforms

Anthony Petrov anthony.petrov at oracle.com
Mon Apr 29 06:59:02 PDT 2013


Oh, I somehow missed this point, sorry. Thanks for testing this.

Could you please generate a patch against the JDK 8 AWT repository with 
your fix and post it here? You can get it by running the `hg diff` 
command in your jdk repository. Then we can review this fix. 
Alternatively, you could generate a webrev and publish it somewhere on 
the web, and provide us with a link to it so that we could review your fix.

--
best regards,
Anthony

On 04/26/13 19:59, Morvan Le Mescam wrote:
> Thanks for this anwer.
>
> I successfully rebuilt the JDK on Windows (see my first mail) so I think
> I can patch it but I don't really know how...
>
> Regards
>
>
> 2013/4/26 Anthony Petrov <anthony.petrov at oracle.com
> <mailto:anthony.petrov at oracle.com>>
>
>     Hi Morvan,
>
>     The IDC_HAND system cursor was introduced in Windows 2000. Java's
>     HAND_CURSOR seems to be introduced way before Win2K has been
>     released. Hence the need for a custom cursor back in the days.
>     Clearly, this doesn't make any sense today. We should switch to
>     using the system default cursor for this cursor type.
>
>     Would you like to prepare a patch for this issue, test it, and post
>     on this mailing list for a review? I know that building JDK on
>     Windows is not an easy task, but it can be accomplished
>     nevertheless, and the new build system has made it much simpler than
>     it was before. Please refer to this document
>
>     http://hg.openjdk.java.net/__jdk8/build/raw-file/tip/__README-builds.html
>     <http://hg.openjdk.java.net/jdk8/build/raw-file/tip/README-builds.html>
>
>     for build instructions.
>
>     --
>     best regards,
>     Anthony
>
>
>     On 04/22/2013 08:32 PM, Morvan Le Mescam wrote:
>
>         Dear all,
>
>         When developping a Swing client, I face the following problem :
>         When setting the hand cursor on Windows, I noticed that the default
>         system cursor was not used.
>
>         I analysed the problem and found the rrot cause.
>         I also made a correction and tested it on Windows 7.
>
>         This is my analyse :
>
>         When reading Java source code, it is obvious that on Windows,
>         Java does
>         not use System resources.
>
>         In the code (from
>         *jdk\src\windows\native\sun\__windows\awt_Cursor.cpp* )
>         bellow :
>
>         AwtCursor * AwtCursor::*__CreateSystemCursor*(jobject jCursor)
>
>
>         {
>
>               JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
>
>               jint type = env->GetIntField(jCursor, AwtCursor::typeID);
>
>               DASSERT(type != java_awt_Cursor_CUSTOM_CURSOR)__;
>
>               LPCTSTR winCursor;
>
>               switch (type) {
>
>                 case java_awt_Cursor_DEFAULT___CURSOR:
>
>                 default:
>
>                   winCursor = IDC_ARROW;
>
>                   break;
>
>                 case java_awt_Cursor_CROSSHAIR___CURSOR:
>
>                   winCursor = IDC_CROSS;
>
>                   break;
>
>         *[…]*
>
>         *case java_awt_Cursor_HAND_CURSOR:*
>
>         *winCursor = TEXT("HAND_CURSOR");*
>
>         *break;*
>
>                 case java_awt_Cursor_MOVE_CURSOR:
>
>                   winCursor = IDC_SIZEALL;
>
>                   break;
>
>               }
>
>         *    HCURSOR hCursor = ::LoadCursor(NULL, winCursor);*
>
>               if (*hCursor == NULL*) {
>
>                   /* Not a system cursor, check for resource. */
>
>         *hCursor =
>         ::LoadCursor(AwtToolkit::__GetInstance().GetModuleHandle(__),*
>
>         *winCursor);*
>
>
>               }
>
>               if (hCursor == NULL) {
>
>                   hCursor = ::LoadCursor(NULL, IDC_ARROW);
>
>         DASSERT(hCursor != NULL);
>
>               }
>
>               AwtCursor *awtCursor = new AwtCursor(env, hCursor, jCursor);
>
>               setPData(jCursor, ptr_to_jlong(awtCursor));
>
>               return awtCursor;
>
>         }
>
>         In the case of the HAND_CURSOR (*in red*),  Java will try to
>         load the
>
>         cursor from the system (*in blue*).
>
>         If it fails (*hCursor == NULL*) then it will try to load the
>         cursor from
>
>         its own resource (*in orange*) :
>
>         *hCursor =
>         ::LoadCursor(AwtToolkit::__GetInstance().GetModuleHandle(__),*
>
>         *winCursor);*
>
>
>         In our case, if we check in the AWTToolkit module resources, in
>         *jdk\src\windows\native\sun\__windows\awr.rc*, we find the
>         following content :
>
>
>         #include "windows.h"
>
>         // Need 2 defines so macro argument to XSTR will get expanded before
>         quoting.
>
>         #define XSTR(x) STR(x)
>
>         #define STR(x)  #x
>
>         LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
>
>         *HAND_CURSOR  CURSOR DISCARDABLE "hand.cur"*
>
>         AWT_ICON ICON    DISCARDABLE "awt.ico"
>
>         CHECK_BITMAP BITMAP  DISCARDABLE "check.bmp"
>
>         And we find that java.exe embed its own hand cursor, in
>         *jdk\src\windows\native\sun\__windows\hand.cur* : The “famous”
>         hand that
>
>         it is displayed instead of our system cursor.
>
>
>         This is the correction :
>
>         , I made the correction into the JRE source code :
>
>                 case java_awt_Cursor_HAND_CURSOR:
>
>                   /* MLM change winCursor = TEXT("HAND_CURSOR"); */
>
>                   winCursor = IDC_HAND;
>
>                   break;
>
>         I could compile and regenerate a JRE with this change :
>
>         D:\Work\Current\openjdk\build\__windows-amd64\bin>java -version
>
>         openjdk version "1.7.0-u6-unofficial"
>
>         OpenJDK Runtime Environment (build 1.7.0-u6-unofficial-b24)
>
>         OpenJDK 64-Bit Server VM (build 21.0-b17, mixed mode)
>
>         And this works !
>
>         If I change the hand cursor at System level, Java takes it into
>         account.
>
>         Last but not least question:
>
>         Why did a Sun developper, one day : winCursor = TEXT("HAND_CURSOR");
>
>         This seems so not consistent with other part of the code... So
>         there is
>         probably a good reason. Perhaps the hand cursor was not existant on
>         Windows platform when this was done ?
>
>
>         Regards
>
>
>         Morvan
>
>
>



More information about the awt-dev mailing list