JDK-6330539 : Mouse grab changes mouse cursor
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 6
  • Priority: P2
  • Status: Resolved
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2005-09-29
  • Updated: 2011-01-19
  • Resolved: 2006-02-07
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 6
6 b71Fixed
Related Reports
Relates :  
Description
After the mouse grab feature has been integrated, invocation of any popup reverts mouse cursor direction. This is likely somewhat outdated behavior, since neither Gnome nor KDE do it. As noted by ###@###.###:
    Also, when I get a drop down menu of any type, the mouse cursor reverses direction.
    This is not the standard anymore on Gnome and it's rather depressing when I compare
    the latest snapshot to the older one I had been working on.

Comments
SUGGESTED FIX --- XBaseWindow.java Mon Jan 16 15:05:03 2006 *** 845,886 **** XAwtState.isManualGrab()) { grabLog.fine(" Already Grabbed"); return true; } ! //6273031: PIT. Choice drop down does not close once it is right clicked to show a popup menu ! //remember previous window having grab and if it's not null ungrab it. ! XBaseWindow prevGrabWindow = XAwtState.getGrabWindow(); final int eventMask = (int) (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | ButtonMotionMask); final int ownerEvents = 1; ! int keyGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(), getContentWindow(), ownerEvents, eventMask, GrabModeAsync, ! GrabModeAsync, None, XToolkit.arrowCursor, CurrentTime); // Check grab results to be consistent with X server grab ! if (keyGrab != GrabSuccess) { XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime); XAwtState.setGrabWindow(null); grabLog.fine(" Grab Failure - mouse"); return false; } ! int ptrGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(), getContentWindow(), ownerEvents, GrabModeAsync, GrabModeAsync, CurrentTime); ! if (ptrGrab != GrabSuccess) { XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime); XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), CurrentTime); XAwtState.setGrabWindow(null); grabLog.fine(" Grab Failure - keyboard"); return false; } if (prevGrabWindow != null) { prevGrabWindow.ungrabInputImpl(); ! } XAwtState.setGrabWindow(this); grabLog.fine(" Grab - success"); return true; } finally { XToolkit.awtUnlock(); --- 845,887 ---- XAwtState.isManualGrab()) { grabLog.fine(" Already Grabbed"); return true; } ! //6273031: PIT. Choice drop down does not close once it is right clicked to show a popup menu ! //remember previous window having grab and if it's not null ungrab it. ! XBaseWindow prevGrabWindow = XAwtState.getGrabWindow(); final int eventMask = (int) (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | ButtonMotionMask); final int ownerEvents = 1; ! int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(), getContentWindow(), ownerEvents, eventMask, GrabModeAsync, ! GrabModeAsync, None, (XWM.isMotif() ? XToolkit.arrowCursor : None), ! CurrentTime); // Check grab results to be consistent with X server grab ! if (ptrGrab != GrabSuccess) { XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime); XAwtState.setGrabWindow(null); grabLog.fine(" Grab Failure - mouse"); return false; } ! int keyGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(), getContentWindow(), ownerEvents, GrabModeAsync, GrabModeAsync, CurrentTime); ! if (keyGrab != GrabSuccess) { XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime); XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), CurrentTime); XAwtState.setGrabWindow(null); grabLog.fine(" Grab Failure - keyboard"); return false; } if (prevGrabWindow != null) { prevGrabWindow.ungrabInputImpl(); ! } XAwtState.setGrabWindow(this); grabLog.fine(" Grab - success"); return true; } finally { XToolkit.awtUnlock();
18-01-2006

EVALUATION XBaseWindow.grabInput() should call XGrabPointer() with None as cursor parameter to keep mouse cursor unchanged. The same we should do in MToolkit.nativeGrab() (awt_MToolkit.c)
13-01-2006

EVALUATION need to investigate this and try to fix in mustang.
13-01-2006

EVALUATION A result of native grab usage.
30-09-2005