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 <[email protected]
<mailto:[email protected]>>

    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



Reply via email to