Skip to content

Commit 229e996

Browse files
committed
If JavaFX processes a shortcut it is not sent on to the system menu bar
1 parent 1bdb93c commit 229e996

File tree

11 files changed

+56
-37
lines changed

11 files changed

+56
-37
lines changed

modules/javafx.graphics/src/main/java/com/sun/glass/ui/View.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ public abstract class View {
6565
public static class EventHandler {
6666
public void handleViewEvent(View view, long time, int type) {
6767
}
68-
public void handleKeyEvent(View view, long time, int action,
68+
public boolean handleKeyEvent(View view, long time, int action,
6969
int keyCode, char[] keyChars, int modifiers) {
70+
return false;
7071
}
7172
public void handleMenuEvent(View view, int x, int y, int xAbs,
7273
int yAbs, boolean isKeyboardTrigger) {
@@ -545,11 +546,12 @@ private void handleViewEvent(long time, int type) {
545546
}
546547
}
547548

548-
private void handleKeyEvent(long time, int action,
549+
private boolean handleKeyEvent(long time, int action,
549550
int keyCode, char[] keyChars, int modifiers) {
550551
if (shouldHandleEvent()) {
551-
this.eventHandler.handleKeyEvent(this, time, action, keyCode, keyChars, modifiers);
552+
return this.eventHandler.handleKeyEvent(this, time, action, keyCode, keyChars, modifiers);
552553
}
554+
return false;
553555
}
554556

555557
private void handleMouseEvent(long time, int type, int button, int x, int y,
@@ -975,6 +977,10 @@ protected void notifyKey(int type, int keyCode, char[] keyChars, int modifiers)
975977
handleKeyEvent(System.nanoTime(), type, keyCode, keyChars, modifiers);
976978
}
977979

980+
protected boolean notifyKeyAndReturnConsumed(int type, int keyCode, char[] keyChars, int modifiers) {
981+
return handleKeyEvent(System.nanoTime(), type, keyCode, keyChars, modifiers);
982+
}
983+
978984
protected void notifyInputMethod(String text, int[] clauseBoundary,
979985
int[] attrBoundary, byte[] attrValue,
980986
int committedTextLength, int caretPos, int visiblePos) {

modules/javafx.graphics/src/main/java/com/sun/javafx/scene/SceneHelper.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ public static void enableInputMethodEvents(Scene scene, boolean enable) {
5353
sceneAccessor.enableInputMethodEvents(scene, enable);
5454
}
5555

56-
public static void processKeyEvent(Scene scene, KeyEvent e) {
57-
sceneAccessor.processKeyEvent(scene, e);
56+
public static boolean processKeyEvent(Scene scene, KeyEvent e) {
57+
return sceneAccessor.processKeyEvent(scene, e);
5858
}
5959

6060
public static void processMouseEvent(Scene scene, MouseEvent e) {
@@ -118,7 +118,7 @@ public static SceneAccessor getSceneAccessor() {
118118
public interface SceneAccessor {
119119
void enableInputMethodEvents(Scene scene, boolean enable);
120120

121-
void processKeyEvent(Scene scene, KeyEvent e);
121+
boolean processKeyEvent(Scene scene, KeyEvent e);
122122

123123
void processMouseEvent(Scene scene, MouseEvent e);
124124

modules/javafx.graphics/src/main/java/com/sun/javafx/tk/TKSceneListener.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void mouseEvent(EventType<MouseEvent> type, double x, double y, double sc
6464
/**
6565
* Pass a key event to the scene to handle
6666
*/
67-
public void keyEvent(KeyEvent keyEvent);
67+
public boolean keyEvent(KeyEvent keyEvent);
6868

6969
/**
7070
* Pass an input method event to the scene to handle

modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/GlassViewEventHandler.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ private static EventType<javafx.scene.input.KeyEvent> keyEventType(int glassType
147147
}
148148

149149
private final KeyEventNotification keyNotification = new KeyEventNotification();
150-
private class KeyEventNotification implements PrivilegedAction<Void> {
150+
private class KeyEventNotification implements PrivilegedAction<Boolean> {
151151
View view;
152152
long time;
153153
int type;
@@ -158,11 +158,12 @@ private class KeyEventNotification implements PrivilegedAction<Void> {
158158
private KeyCode lastKeyCode;
159159

160160
@Override
161-
public Void run() {
161+
public Boolean run() {
162162
if (PULSE_LOGGING_ENABLED) {
163163
PulseLogger.newInput(keyEventType(type).toString());
164164
}
165165
WindowStage stage = scene.getWindowStage();
166+
Boolean consumed = false;
166167
try {
167168
boolean shiftDown = (modifiers & KeyEvent.MODIFIER_SHIFT) != 0;
168169
boolean controlDown = (modifiers & KeyEvent.MODIFIER_CONTROL) != 0;
@@ -215,7 +216,7 @@ public Void run() {
215216
}
216217
}
217218
if (scene.sceneListener != null) {
218-
scene.sceneListener.keyEvent(keyEvent);
219+
consumed = scene.sceneListener.keyEvent(keyEvent);
219220
}
220221
break;
221222
default:
@@ -231,12 +232,12 @@ public Void run() {
231232
PulseLogger.newInput(null);
232233
}
233234
}
234-
return null;
235+
return consumed;
235236
}
236237
}
237238

238239
@SuppressWarnings("removal")
239-
@Override public void handleKeyEvent(View view, long time, int type, int key,
240+
@Override public boolean handleKeyEvent(View view, long time, int type, int key,
240241
char[] chars, int modifiers)
241242
{
242243
keyNotification.view = view;
@@ -246,9 +247,10 @@ public Void run() {
246247
keyNotification.chars = chars;
247248
keyNotification.modifiers = modifiers;
248249

249-
QuantumToolkit.runWithoutRenderLock(() -> {
250+
final boolean consumed = QuantumToolkit.runWithoutRenderLock(() -> {
250251
return AccessController.doPrivileged(keyNotification, scene.getAccessControlContext());
251252
});
253+
return consumed;
252254
}
253255

254256
private static EventType<javafx.scene.input.MouseEvent> mouseEventType(int glassType) {

modules/javafx.graphics/src/main/java/javafx/scene/Scene.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.sun.javafx.css.StyleManager;
3636
import com.sun.javafx.cursor.CursorFrame;
3737
import com.sun.javafx.event.EventQueue;
38+
import com.sun.javafx.event.EventUtil;
3839
import com.sun.javafx.geom.PickRay;
3940
import com.sun.javafx.geom.Vec3d;
4041
import com.sun.javafx.geom.transform.BaseTransform;
@@ -399,8 +400,8 @@ public void enableInputMethodEvents(Scene scene, boolean enable) {
399400
}
400401

401402
@Override
402-
public void processKeyEvent(Scene scene, KeyEvent e) {
403-
scene.processKeyEvent(e);
403+
public boolean processKeyEvent(Scene scene, KeyEvent e) {
404+
return scene.processKeyEvent(e);
404405
}
405406

406407
@Override
@@ -2181,7 +2182,7 @@ private void focusIneligible(Node node) {
21812182
traverse(node, Direction.NEXT, TraversalMethod.DEFAULT);
21822183
}
21832184

2184-
void processKeyEvent(KeyEvent e) {
2185+
boolean processKeyEvent(KeyEvent e) {
21852186
if (dndGesture != null) {
21862187
if (!dndGesture.processKey(e)) {
21872188
dndGesture = null;
@@ -2192,9 +2193,11 @@ void processKeyEvent(KeyEvent e) {
21922193
final EventTarget eventTarget =
21932194
(sceneFocusOwner != null && sceneFocusOwner.getScene() == Scene.this) ? sceneFocusOwner : Scene.this;
21942195

2196+
if (eventTarget == null) return false;
2197+
21952198
// send the key event to the current focus owner or to scene if
21962199
// the focus owner is not set
2197-
Event.fireEvent(eventTarget, e);
2200+
return EventUtil.fireEvent(eventTarget, e) == null;
21982201
}
21992202

22002203
void requestFocus(Node node, boolean focusVisible) {
@@ -2713,9 +2716,9 @@ public void mouseEvent(EventType<MouseEvent> type, double x, double y, double sc
27132716

27142717

27152718
@Override
2716-
public void keyEvent(KeyEvent keyEvent)
2719+
public boolean keyEvent(KeyEvent keyEvent)
27172720
{
2718-
processKeyEvent(keyEvent);
2721+
return processKeyEvent(keyEvent);
27192722
}
27202723

27212724
@Override

modules/javafx.graphics/src/main/native-glass/mac/GlassStatics.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ extern jmethodID jWindowNotifyDelegatePtr;
6161
extern jmethodID jViewNotifyEvent;
6262
extern jmethodID jViewNotifyRepaint;
6363
extern jmethodID jViewNotifyResize;
64-
extern jmethodID jViewNotifyKey;
64+
extern jmethodID jViewNotifyKeyAndReturnConsumed;
6565
extern jmethodID jViewNotifyMouse;
6666
extern jmethodID jViewNotifyMenu;
6767
extern jmethodID jViewNotifyInputMethod;

modules/javafx.graphics/src/main/native-glass/mac/GlassStatics.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
jmethodID jViewNotifyEvent = NULL;
6464
jmethodID jViewNotifyRepaint = NULL;
6565
jmethodID jViewNotifyResize = NULL;
66-
jmethodID jViewNotifyKey = NULL;
66+
jmethodID jViewNotifyKeyAndReturnConsumed= NULL;
6767
jmethodID jViewNotifyMouse = NULL;
6868
jmethodID jViewNotifyMenu = NULL;
6969
jmethodID jViewNotifyInputMethod = NULL;

modules/javafx.graphics/src/main/native-glass/mac/GlassView.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@
106106
if ((*env)->ExceptionCheck(env)) return;
107107
}
108108

109-
if (jViewNotifyKey == NULL)
109+
if (jViewNotifyKeyAndReturnConsumed == NULL)
110110
{
111-
jViewNotifyKey = (*env)->GetMethodID(env, jViewClass, "notifyKey", "(II[CI)V");
111+
jViewNotifyKeyAndReturnConsumed = (*env)->GetMethodID(env, jViewClass, "notifyKeyAndReturnConsumed", "(II[CI)Z");
112112
if ((*env)->ExceptionCheck(env)) return;
113113
}
114114

modules/javafx.graphics/src/main/native-glass/mac/GlassView3D.m

+10-9
Original file line numberDiff line numberDiff line change
@@ -486,13 +486,13 @@ - (BOOL)performKeyEquivalent:(NSEvent *)theEvent
486486
jcharArray jKeyChars = GetJavaKeyChars(env, theEvent);
487487
jint jModifiers = GetJavaModifiers(theEvent);
488488

489-
(*env)->CallVoidMethod(env, self->_delegate->jView, jViewNotifyKey,
490-
com_sun_glass_events_KeyEvent_PRESS,
491-
uch, jKeyChars, jModifiers);
492-
(*env)->CallVoidMethod(env, self->_delegate->jView, jViewNotifyKey,
493-
com_sun_glass_events_KeyEvent_TYPED,
494-
uch, jKeyChars, jModifiers);
495-
(*env)->CallVoidMethod(env, self->_delegate->jView, jViewNotifyKey,
489+
(*env)->CallBooleanMethod(env, self->_delegate->jView, jViewNotifyKeyAndReturnConsumed,
490+
com_sun_glass_events_KeyEvent_PRESS,
491+
uch, jKeyChars, jModifiers);
492+
(*env)->CallBooleanMethod(env, self->_delegate->jView, jViewNotifyKeyAndReturnConsumed,
493+
com_sun_glass_events_KeyEvent_TYPED,
494+
uch, jKeyChars, jModifiers);
495+
(*env)->CallBooleanMethod(env, self->_delegate->jView, jViewNotifyKeyAndReturnConsumed,
496496
com_sun_glass_events_KeyEvent_RELEASE,
497497
uch, jKeyChars, jModifiers);
498498
(*env)->DeleteLocalRef(env, jKeyChars);
@@ -502,9 +502,10 @@ - (BOOL)performKeyEquivalent:(NSEvent *)theEvent
502502
return YES;
503503
}
504504
}
505-
[self->_delegate sendJavaKeyEvent:theEvent isDown:YES];
505+
506+
BOOL result = [self->_delegate sendJavaKeyEvent:theEvent isDown:YES];
506507
[fsWindow release];
507-
return NO; // return NO to allow system-default processing of Cmd+Q, etc.
508+
return result;
508509
}
509510

510511
- (void)keyDown:(NSEvent *)theEvent

modules/javafx.graphics/src/main/native-glass/mac/GlassViewDelegate.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ typedef enum GestureMaskType {
8989
- (void)sendJavaMouseEvent:(NSEvent *)theEvent;
9090
- (void)resetMouseTracking;
9191
- (void)sendJavaMenuEvent:(NSEvent *)theEvent;
92-
- (void)sendJavaKeyEvent:(NSEvent *)event isDown:(BOOL)isDown;
92+
- (BOOL)sendJavaKeyEvent:(NSEvent *)event isDown:(BOOL)isDown;
9393
- (void)sendJavaModifierKeyEvent:(NSEvent *)theEvent;
9494
- (void)sendJavaGestureEvent:(NSEvent *)theEvent type:(int)type;
9595
- (void)sendJavaGestureBeginEvent:(NSEvent *)theEvent;

modules/javafx.graphics/src/main/native-glass/mac/GlassViewDelegate.m

+11-4
Original file line numberDiff line numberDiff line change
@@ -674,16 +674,16 @@ - (void)resetMouseTracking
674674

675675
// RT-11707: zero out the keycode for TYPED events
676676
#define SEND_KEY_EVENT(type) \
677-
(*env)->CallVoidMethod(env, self->jView, jViewNotifyKey, (type), \
677+
jboolean thisEventWasConsumed = (*env)->CallBooleanMethod(env, self->jView, jViewNotifyKeyAndReturnConsumed, (type), \
678678
(type) == com_sun_glass_events_KeyEvent_TYPED ? 0 : jKeyCode, \
679679
jKeyChars, jModifiers); \
680680
GLASS_CHECK_EXCEPTION(env);
681681

682-
- (void)sendJavaKeyEvent:(NSEvent *)theEvent isDown:(BOOL)isDown
682+
- (BOOL)sendJavaKeyEvent:(NSEvent *)theEvent isDown:(BOOL)isDown
683683
{
684684
if (theEvent == s_lastKeyEvent) {
685685
// this must be a keyDown: generated by performKeyEquivalent: which returns NO by design
686-
return;
686+
return NO;
687687
}
688688
[s_lastKeyEvent release];
689689
s_lastKeyEvent = [theEvent retain];
@@ -694,13 +694,18 @@ - (void)sendJavaKeyEvent:(NSEvent *)theEvent isDown:(BOOL)isDown
694694
jcharArray jKeyChars = GetJavaKeyChars(env, theEvent);
695695
jint jModifiers = GetJavaModifiers(theEvent);
696696

697+
// This routine returns YES if the PRESS event was consumed. This is
698+
// used to ensure that performKeyEquivalent doesn't allow an event
699+
// to be processed by both JavaFX and the system menus.
700+
jboolean wasConsumed = false;
697701
if (!isDown)
698702
{
699703
SEND_KEY_EVENT(com_sun_glass_events_KeyEvent_RELEASE);
700704
}
701705
else
702706
{
703707
SEND_KEY_EVENT(com_sun_glass_events_KeyEvent_PRESS);
708+
wasConsumed = thisEventWasConsumed;
704709

705710
// TYPED events should only be sent for printable characters. Thus we avoid
706711
// sending them for navigation keys. Perhaps this logic could be enhanced.
@@ -720,10 +725,12 @@ - (void)sendJavaKeyEvent:(NSEvent *)theEvent isDown:(BOOL)isDown
720725

721726
(*env)->DeleteLocalRef(env, jKeyChars);
722727
GLASS_CHECK_EXCEPTION(env);
728+
729+
return wasConsumed ? YES : NO;
723730
}
724731

725732
#define SEND_MODIFIER_KEY_EVENT_WITH_TYPE(type, vkCode) \
726-
(*env)->CallVoidMethod(env, self->jView, jViewNotifyKey, \
733+
(*env)->CallBooleanMethod(env, self->jView, jViewNotifyKeyAndReturnConsumed, \
727734
(type), \
728735
(vkCode), \
729736
jKeyChars, jModifiers);

0 commit comments

Comments
 (0)