977 } 978 public void handleKeyRelease(XEvent xev) { 979 } 980 public void handleExposeEvent(XEvent xev) { 981 } 982 /** 983 * Activate automatic grab on first ButtonPress, 984 * deactivate on full mouse release 985 */ 986 public void handleButtonPressRelease(XEvent xev) { 987 XButtonEvent xbe = xev.get_xbutton(); 988 /* 989 * Ignore the buttons above 20 due to the bit limit for 990 * InputEvent.BUTTON_DOWN_MASK. 991 * One more bit is reserved for FIRST_HIGH_BIT. 992 */ 993 if (xbe.get_button() > SunToolkit.MAX_BUTTONS_SUPPORTED) { 994 return; 995 } 996 int buttonState = 0; 997 final int buttonsNumber = ((SunToolkit)(Toolkit.getDefaultToolkit())).getNumberOfButtons(); 998 for (int i = 0; i<buttonsNumber; i++){ 999 buttonState |= (xbe.get_state() & XConstants.buttonsMask[i]); 1000 } 1001 switch (xev.get_type()) { 1002 case XConstants.ButtonPress: 1003 if (buttonState == 0) { 1004 XWindowPeer parent = getToplevelXWindow(); 1005 // See 6385277, 6981400. 1006 if (parent != null && parent.isFocusableWindow()) { 1007 // A click in a client area drops the actual focused window retaining. 1008 parent.setActualFocusedWindow(null); 1009 parent.requestWindowFocus(xbe.get_time(), true); 1010 } 1011 XAwtState.setAutoGrabWindow(this); 1012 } 1013 break; 1014 case XConstants.ButtonRelease: 1015 if (isFullRelease(buttonState, xbe.get_button())) { 1016 XAwtState.setAutoGrabWindow(null); 1017 } 1018 break; 1019 } 1020 } 1021 public void handleMotionNotify(XEvent xev) { 1022 } 1023 public void handleXCrossingEvent(XEvent xev) { 1024 } 1025 public void handleConfigureNotifyEvent(XEvent xev) { 1026 XConfigureEvent xe = xev.get_xconfigure(); 1027 insLog.finer("Configure, {0}", xe); 1028 x = xe.get_x(); 1029 y = xe.get_y(); 1030 width = xe.get_width(); 1031 height = xe.get_height(); 1032 } 1033 /** 1034 * Checks ButtonRelease released all Mouse buttons 1035 */ 1036 static boolean isFullRelease(int buttonState, int button) { 1037 final int buttonsNumber = ((SunToolkit)(Toolkit.getDefaultToolkit())).getNumberOfButtons(); 1038 1039 if (button < 0 || button > buttonsNumber) { 1040 return buttonState == 0; 1041 } else { 1042 return buttonState == XConstants.buttonsMask[button - 1]; 1043 } 1044 } 1045 1046 static boolean isGrabbedEvent(XEvent ev, XBaseWindow target) { 1047 switch (ev.get_type()) { 1048 case XConstants.ButtonPress: 1049 case XConstants.ButtonRelease: 1050 case XConstants.MotionNotify: 1051 case XConstants.KeyPress: 1052 case XConstants.KeyRelease: 1053 return true; 1054 case XConstants.LeaveNotify: 1055 case XConstants.EnterNotify: 1056 // We shouldn't dispatch this events to the grabbed components (see 6317481) 1057 // But this logic is important if the grabbed component is top-level (see realSync) 1058 return (target instanceof XWindowPeer); 1059 default: 1060 return false; 1061 } 1062 } | 977 } 978 public void handleKeyRelease(XEvent xev) { 979 } 980 public void handleExposeEvent(XEvent xev) { 981 } 982 /** 983 * Activate automatic grab on first ButtonPress, 984 * deactivate on full mouse release 985 */ 986 public void handleButtonPressRelease(XEvent xev) { 987 XButtonEvent xbe = xev.get_xbutton(); 988 /* 989 * Ignore the buttons above 20 due to the bit limit for 990 * InputEvent.BUTTON_DOWN_MASK. 991 * One more bit is reserved for FIRST_HIGH_BIT. 992 */ 993 if (xbe.get_button() > SunToolkit.MAX_BUTTONS_SUPPORTED) { 994 return; 995 } 996 int buttonState = 0; 997 buttonState = xbe.get_state() & XConstants.ALL_BUTTONS_MASK; 998 switch (xev.get_type()) { 999 case XConstants.ButtonPress: 1000 if (buttonState == 0) { 1001 XWindowPeer parent = getToplevelXWindow(); 1002 // See 6385277, 6981400. 1003 if (parent != null && parent.isFocusableWindow()) { 1004 // A click in a client area drops the actual focused window retaining. 1005 parent.setActualFocusedWindow(null); 1006 parent.requestWindowFocus(xbe.get_time(), true); 1007 } 1008 XAwtState.setAutoGrabWindow(this); 1009 } 1010 break; 1011 case XConstants.ButtonRelease: 1012 if (isFullRelease(buttonState, xbe.get_button())) { 1013 XAwtState.setAutoGrabWindow(null); 1014 } 1015 break; 1016 } 1017 } 1018 public void handleMotionNotify(XEvent xev) { 1019 } 1020 public void handleXCrossingEvent(XEvent xev) { 1021 } 1022 public void handleConfigureNotifyEvent(XEvent xev) { 1023 XConfigureEvent xe = xev.get_xconfigure(); 1024 insLog.finer("Configure, {0}", xe); 1025 x = xe.get_x(); 1026 y = xe.get_y(); 1027 width = xe.get_width(); 1028 height = xe.get_height(); 1029 } 1030 /** 1031 * Checks ButtonRelease released all Mouse buttons 1032 */ 1033 static boolean isFullRelease(int buttonState, int button) { 1034 final int buttonsNumber = XToolkit.getNumberOfButtonsForMask(); 1035 1036 if (button < 0 || button > buttonsNumber) { 1037 return buttonState == 0; 1038 } else { 1039 return buttonState == XlibUtil.getButtonMask(button); 1040 } 1041 } 1042 1043 static boolean isGrabbedEvent(XEvent ev, XBaseWindow target) { 1044 switch (ev.get_type()) { 1045 case XConstants.ButtonPress: 1046 case XConstants.ButtonRelease: 1047 case XConstants.MotionNotify: 1048 case XConstants.KeyPress: 1049 case XConstants.KeyRelease: 1050 return true; 1051 case XConstants.LeaveNotify: 1052 case XConstants.EnterNotify: 1053 // We shouldn't dispatch this events to the grabbed components (see 6317481) 1054 // But this logic is important if the grabbed component is top-level (see realSync) 1055 return (target instanceof XWindowPeer); 1056 default: 1057 return false; 1058 } 1059 } |