[PATCH] 7160951: ActionListener called twice for JMenuItem using ScreenMenuBar
Leonid Romanov
leonid.romanov at oracle.com
Wed Sep 5 10:05:47 PDT 2012
Hi, Marco
Why do we need [menuKey isEqualToString:eventKey] check? If Cocoa has called our action callback and the type of the event which triggered that call is NSKeyDown, doesn't it mean we can be sure that a shortcut has been pressed?
On Sep 4, 2012, at 6:11 PM, Sergey Bylokhov <Sergey.Bylokhov at oracle.com> wrote:
> Hi, Marco.
> After the changes, shortcuts in the simple awt menu(not swing) continue to work?
>
> Thanks.
>
> 04.09.2012 17:42, Marco Dinacci wrote:
>> Hello,
>>
>> The following patch, based on changeset 0b236cc20500 (jdk7u8-b05 tag),
>> fixes http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7160951
>>
>> The patch checks whether the NSEvent received in the NSMenuItem
>> callback coincides with the NSMenuItem accelerator. If it does, it
>> doesn't call the Java callback.
>>
>> # HG changeset patch
>> # User Marco Dinacci <marco.dinacci at gmail.com>
>> # Date 1346764262 -3600
>> # Node ID c451e0ad537c9856ccc7be5488360070ba657142
>> # Parent 57d81e01a61fb8be46ef792dce63b0aa2a88992d
>> Fix bug #7160951
>>
>> diff --git a/src/macosx/native/sun/awt/CMenuItem.m
>> b/src/macosx/native/sun/awt/CMenuItem.m
>> --- a/src/macosx/native/sun/awt/CMenuItem.m
>> +++ b/src/macosx/native/sun/awt/CMenuItem.m
>> @@ -82,22 +82,36 @@ JNF_COCOA_ENTER(env);
>> } else {
>> 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;
>> + NSEventType type = [currEvent type];
>> + if (type == NSKeyDown) {
>> + NSString *menuKey = [sender keyEquivalent];
>> + NSString *eventKey = [currEvent characters];
>> +
>> + if (![menuKey isEqualToString:eventKey]) {
>> + // Only send the event if the NSEvent characters do not
>> + // coincides with the NSMenuItem keyEquivalent.
>>
>> - JNFCallVoidMethod(env, fPeer, jm_handleAction,
>> UTC(currEvent), javaModifiers); // AWT_THREADING Safe (event)
>> + 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;
>> +
>> + JNFCallVoidMethod(env, fPeer, jm_handleAction,
>> UTC(currEvent), javaModifiers); // AWT_THREADING Safe (event)
>> + }
>> + } else {
>> + JNFCallVoidMethod(env, fPeer, jm_handleAction,
>> UTC(currEvent), javaModifiers); // AWT_THREADING Safe (event)
>> + }
>> +
>> }
>> JNF_COCOA_EXIT(env);
>> }
>>
>> - (void) setJavaLabel:(NSString *)theLabel shortcut:(NSString
>> *)theKeyEquivalent modifierMask:(jint)modifiers {
>> AWT_ASSERT_NOT_APPKIT_THREAD;
>>
>> NSUInteger modifierMask = 0;
>> exporting patch:
>> <fdopen>
>>
>>
>> Best,
>> Marco
> `
>
> --
> Best regards, Sergey.
>
More information about the macosx-port-dev
mailing list