--- a/src/macosx/native/sun/awt/AWTEvent.h Fri Oct 05 14:58:35 2012 +0400
+++ b/src/macosx/native/sun/awt/AWTEvent.h Tue Oct 09 17:03:54 2012 +0400
@@ -33,5 +33,7 @@ void DeliverJavaMouseEvent(JNIEnv *env,
void DeliverJavaMouseEvent(JNIEnv *env, NSEvent *event, jobject peer);
void SendAdditionalJavaEvents(JNIEnv *env, NSEvent *nsEvent, jobject peer);
jint GetJavaMouseModifiers(NSInteger button, NSUInteger modifierFlags);
+jint NsKeyModifiersToJavaModifiers(NSUInteger nsFlags, BOOL isExtMods);
+NSUInteger JavaModifiersToNsKeyModifiers(jint javaModifiers, BOOL isExtMods);
#endif /* __AWTEVENT_H */
--- a/src/macosx/native/sun/awt/AWTEvent.m Fri Oct 05 14:58:35 2012 +0400
+++ b/src/macosx/native/sun/awt/AWTEvent.m Tue Oct 09 17:03:54 2012 +0400
@@ -244,6 +244,7 @@ static struct _nsKeyToJavaModifier
//NSUInteger cgsRightMask;
unsigned short leftKeyCode;
unsigned short rightKeyCode;
+ jint javaExtMask;
jint javaMask;
jint javaKey;
}
@@ -253,6 +254,7 @@ const nsKeyToJavaModifierTable[] =
NSAlphaShiftKeyMask,
0,
0,
+ 0, // no Java equivalent
0, // no Java equivalent
java_awt_event_KeyEvent_VK_CAPS_LOCK
},
@@ -263,6 +265,7 @@ const nsKeyToJavaModifierTable[] =
56,
60,
java_awt_event_InputEvent_SHIFT_DOWN_MASK,
+ java_awt_event_InputEvent_SHIFT_MASK,
java_awt_event_KeyEvent_VK_SHIFT
},
{
@@ -272,6 +275,7 @@ const nsKeyToJavaModifierTable[] =
59,
62,
java_awt_event_InputEvent_CTRL_DOWN_MASK,
+ java_awt_event_InputEvent_CTRL_MASK,
java_awt_event_KeyEvent_VK_CONTROL
},
{
@@ -281,6 +285,7 @@ const nsKeyToJavaModifierTable[] =
58,
61,
java_awt_event_InputEvent_ALT_DOWN_MASK,
+ java_awt_event_InputEvent_ALT_MASK,
java_awt_event_KeyEvent_VK_ALT
},
{
@@ -290,6 +295,7 @@ const nsKeyToJavaModifierTable[] =
55,
54,
java_awt_event_InputEvent_META_DOWN_MASK,
+ java_awt_event_InputEvent_META_MASK,
java_awt_event_KeyEvent_VK_META
},
// NSNumericPadKeyMask
@@ -298,10 +304,11 @@ const nsKeyToJavaModifierTable[] =
0,
0,
0, // no Java equivalent
+ 0, // no Java equivalent
java_awt_event_KeyEvent_VK_HELP
},
// NSFunctionKeyMask
- {0, 0, 0, 0, 0}
+ {0, 0, 0, 0, 0, 0}
};
/*
@@ -491,20 +498,46 @@ NsKeyModifiersToJavaKeyInfo(NSUInteger n
/*
* This returns the java modifiers for a key NSEvent.
*/
-static jint
-NsKeyModifiersToJavaModifiers(NSUInteger nsFlags)
+jint NsKeyModifiersToJavaModifiers(NSUInteger nsFlags, BOOL isExtMods)
{
jint javaModifiers = 0;
const struct _nsKeyToJavaModifier* cur;
for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) {
if ((cur->nsMask & nsFlags) != 0) {
- javaModifiers |= cur->javaMask;
+ javaModifiers |= isExtMods? cur->javaExtMask : cur->javaMask;
}
}
return javaModifiers;
}
+
+/*
+ * This returns the NSEvent flags for java key modifiers.
+ */
+NSUInteger JavaModifiersToNsKeyModifiers(jint javaModifiers, BOOL isExtMods)
+{
+ NSUInteger nsFlags = 0;
+ const struct _nsKeyToJavaModifier* cur;
+
+ for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) {
+ jint mask = isExtMods? cur->javaExtMask : cur->javaMask;
+ if ((mask & javaModifiers) != 0) {
+ nsFlags |= cur->nsMask;
+ }
+ }
+
+ // special case
+ jint mask = isExtMods? java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK :
+ java_awt_event_InputEvent_ALT_GRAPH_MASK;
+
+ if ((mask & javaModifiers) != 0) {
+ nsFlags |= NSAlternateKeyMask;
+ }
+
+ return nsFlags;
+}
+
/*
* Returns the correct java character for a key event. Most unicode
@@ -517,7 +550,7 @@ GetJavaCharacter(NSEvent *event, unsigne
unichar returnValue = java_awt_event_KeyEvent_CHAR_UNDEFINED;
NSString *chars = nil;
unichar testChar = 0, testDeadChar = 0;
- jint javaModifiers = NsKeyModifiersToJavaModifiers([event modifierFlags]);
+ jint javaModifiers = NsKeyModifiersToJavaModifiers([event modifierFlags], TRUE);
switch ([event type]) {
case NSFlagsChanged:
@@ -657,7 +690,7 @@ DeliverJavaKeyEvent(JNIEnv *env, NSEvent
testChar = [chars characterAtIndex:0];
}
- javaModifiers = NsKeyModifiersToJavaModifiers([event modifierFlags]);
+ javaModifiers = NsKeyModifiersToJavaModifiers([event modifierFlags], TRUE);
if (javaModifiers == 0) {
// TODO: dead key chars
// testDeadChar = GetDeadKeyCharacter(event);
@@ -692,7 +725,7 @@ jint GetJavaMouseModifiers(NSInteger but
jint GetJavaMouseModifiers(NSInteger button, NSUInteger modifierFlags)
{
// Mousing needs the key modifiers
- jint modifiers = NsKeyModifiersToJavaModifiers(modifierFlags);
+ jint modifiers = NsKeyModifiersToJavaModifiers(modifierFlags, TRUE);
/*
@@ -788,7 +821,7 @@ DeliverKeyTypedEvents(JNIEnv *env, NSEve
jint javaKeyCode, javaKeyLocation;
BOOL postsTyped = NO;
unichar testChar, testDeadChar = 0;
- jint javaModifiers = NsKeyModifiersToJavaModifiers([nsEvent modifierFlags]);
+ jint javaModifiers = NsKeyModifiersToJavaModifiers([nsEvent modifierFlags], TRUE);
if (javaModifiers == 0) {
testDeadChar = [nsEvent deadKeyCharacter];
@@ -984,7 +1017,7 @@ Java_sun_lwawt_macosx_event_NSEvent_nsTo
JNF_COCOA_ENTER(env);
- jmodifiers = NsKeyModifiersToJavaModifiers(modifierFlags);
+ jmodifiers = NsKeyModifiersToJavaModifiers(modifierFlags, TRUE);
JNF_COCOA_EXIT(env);
--- a/src/macosx/native/sun/awt/CDragSource.m Fri Oct 05 14:58:35 2012 +0400
+++ b/src/macosx/native/sun/awt/CDragSource.m Tue Oct 09 17:03:54 2012 +0400
@@ -460,7 +460,7 @@ static BOOL sNeedsEnter;
}
// Convert fModifiers (extModifiers) to NS:
- NSUInteger modifiers = [DnDUtilities mapJavaExtModifiersToNSKeyModifiers:fModifiers];
+ NSUInteger modifiers = JavaModifiersToNsKeyModifiers(fModifiers, TRUE);
// Just a dummy value ...
NSInteger eventNumber = 0;
@@ -658,7 +658,7 @@ JNF_COCOA_ENTER(env);
}
// b) drag actions (key modifiers) have changed:
- jint modifiers = [DnDUtilities currentJavaExtKeyModifiers];
+ jint modifiers = NsKeyModifiersToJavaModifiers([NSEvent modifierFlags], YES);
if (fDragKeyModifiers != modifiers) {
NSDragOperation currentOp = [DnDUtilities nsDragOperationForModifiers:[NSEvent modifierFlags]];
NSDragOperation allowedOp = [DnDUtilities mapJavaDragOperationToNS:fSourceActions] & currentOp;
--- a/src/macosx/native/sun/awt/CMenuItem.m Fri Oct 05 14:58:35 2012 +0400
+++ b/src/macosx/native/sun/awt/CMenuItem.m Tue Oct 09 17:03:54 2012 +0400
@@ -70,6 +70,18 @@ AWT_ASSERT_APPKIT_THREAD;
JNIEnv *env = [ThreadUtilities getJNIEnv];
JNF_COCOA_ENTER(env);
+ // If we are called as a result of user pressing a shorcut, do nothing,
+ // because AWTView has already sent corresponding key event to the Java
+ // layer from performKeyEquivalent
+ NSEvent *currEvent = [[NSApplication sharedApplication] currentEvent];
+ if ([currEvent type] == NSKeyDown) {
+ NSString *menuKey = [sender keyEquivalent];
+ NSString *eventKey = [currEvent characters];
+ if ([menuKey isEqualToString:eventKey]) {
+ return;
+ }
+ }
+
if (fIsCheckbox) {
static JNF_CLASS_CACHE(jc_CCheckboxMenuItem, "sun/lwawt/macosx/CCheckboxMenuItem");
static JNF_MEMBER_CACHE(jm_ckHandleAction, jc_CCheckboxMenuItem, "handleAction", "(Z)V");
@@ -83,14 +95,8 @@ JNF_COCOA_ENTER(env);
static JNF_CLASS_CACHE(jc_CMenuItem, "sun/lwawt/macosx/CMenuItem");
static JNF_MEMBER_CACHE(jm_handleAction, jc_CMenuItem, "handleAction", "(JI)V"); // AWT_THREADING Safe (event)
- NSEvent *currEvent = [[NSApplication sharedApplication] currentEvent];
NSUInteger modifiers = [currEvent modifierFlags];
- jint javaModifiers = 0;
-
- if ((modifiers & NSCommandKeyMask) != 0) javaModifiers |= java_awt_Event_META_MASK;
- if ((modifiers & NSShiftKeyMask) != 0) javaModifiers |= java_awt_Event_SHIFT_MASK;
- if ((modifiers & NSControlKeyMask) != 0) javaModifiers |= java_awt_Event_CTRL_MASK;
- if ((modifiers & NSAlternateKeyMask) != 0) javaModifiers |= java_awt_Event_ALT_MASK;
+ jint javaModifiers = NsKeyModifiersToJavaModifiers(modifiers, NO);
JNFCallVoidMethod(env, fPeer, jm_handleAction, UTC(currEvent), javaModifiers); // AWT_THREADING Safe (event)
}
@@ -117,10 +123,7 @@ AWT_ASSERT_NOT_APPKIT_THREAD;
modifiers &= ~java_awt_event_KeyEvent_SHIFT_MASK;
}
- if ((modifiers & java_awt_event_KeyEvent_SHIFT_MASK) != 0) modifierMask |= NSShiftKeyMask;
- if ((modifiers & java_awt_event_KeyEvent_CTRL_MASK) != 0) modifierMask |= NSControlKeyMask;
- if ((modifiers & java_awt_event_KeyEvent_ALT_MASK) != 0) modifierMask |= NSAlternateKeyMask;
- if ((modifiers & java_awt_event_KeyEvent_META_MASK) != 0) modifierMask |= NSCommandKeyMask;
+ modifierMask = JavaModifiersToNsKeyModifiers(modifiers, NO);
}
[JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
--- a/src/macosx/native/sun/awt/DnDUtilities.h Fri Oct 05 14:58:35 2012 +0400
+++ b/src/macosx/native/sun/awt/DnDUtilities.h Tue Oct 09 17:03:54 2012 +0400
@@ -42,16 +42,12 @@
+ (jint)narrowJavaDropActions:(jint)actions;
// Mouse and key modifiers mapping:
-+ (NSUInteger)mapJavaExtModifiersToNSKeyModifiers:(jint)modifiers;
+ (NSUInteger)mapJavaExtModifiersToNSMouseDownButtons:(jint)modifiers;
+ (NSUInteger)mapJavaExtModifiersToNSMouseUpButtons:(jint)modifiers;
// Specialized key and mouse modifiers mapping (for operationChanged)
+ (jint)extractJavaExtKeyModifiersFromJavaExtModifiers:(jint)modifiers;
+ (jint)extractJavaExtMouseModifiersFromJavaExtModifiers:(jint)modifiers;
-
-// Get the current keyboard modifier keys as java modifiers (for operationChanged)
-+ (jint)currentJavaExtKeyModifiers;
// Getting the state of the current Drag
+ (NSDragOperation)nsDragOperationForModifiers:(NSUInteger)modifiers;
--- a/src/macosx/native/sun/awt/DnDUtilities.m Fri Oct 05 14:58:35 2012 +0400
+++ b/src/macosx/native/sun/awt/DnDUtilities.m Tue Oct 09 17:03:54 2012 +0400
@@ -161,28 +161,6 @@ There are several problems with Drag and
}
// Mouse and key modifiers mapping:
-+ (NSUInteger)mapJavaExtModifiersToNSKeyModifiers:(jint)modifiers
-{
- NSUInteger result = 0;
-
- if ((modifiers & java_awt_event_InputEvent_SHIFT_DOWN_MASK) != 0)
- result |= NSShiftKeyMask;
-
- if ((modifiers & java_awt_event_InputEvent_CTRL_DOWN_MASK) != 0)
- result |= NSControlKeyMask;
-
- if ((modifiers & java_awt_event_InputEvent_META_DOWN_MASK) != 0)
- result |= NSCommandKeyMask;
-
- if ((modifiers & java_awt_event_InputEvent_ALT_DOWN_MASK) != 0)
- result |= NSAlternateKeyMask;
-
- if ((modifiers & java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK) != 0)
- result |= NSAlternateKeyMask;
-
- return result;
-}
-
+ (NSUInteger)mapJavaExtModifiersToNSMouseDownButtons:(jint)modifiers
{
NSUInteger result = NSLeftMouseDown;
@@ -245,32 +223,6 @@ There are several problems with Drag and
return modifiers & mask;
}
-
-+ (jint)currentJavaExtKeyModifiers
-{
- NSUInteger modifiers = [NSEvent modifierFlags];
- jint jmodifiers = 0;
-
- if(modifiers & NSShiftKeyMask) {
- jmodifiers |= java_awt_event_InputEvent_SHIFT_DOWN_MASK;
- }
-
- if(modifiers & NSControlKeyMask) {
- jmodifiers |= java_awt_event_InputEvent_CTRL_DOWN_MASK;
- }
-
- if(modifiers & NSAlternateKeyMask) {
- jmodifiers |= java_awt_event_InputEvent_ALT_DOWN_MASK;
- }
-
- if(modifiers & NSCommandKeyMask) {
- jmodifiers |= java_awt_event_InputEvent_META_DOWN_MASK;
- }
-
- return jmodifiers;
-}
-
-
+ (NSDragOperation) nsDragOperationForModifiers:(NSUInteger)modifiers {
// Java first