Hi Morvan,

build-dev@ is the wrong mailing list for this topic. It belongs to awt-...@openjdk.java.net only. Please re-post this message there.

--
best regards,
Anthony

On 04/17/2013 09:01 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