From 8b10d1c2ea3b7c50e9a4c4e19dd8cdd8186f32d0 Mon Sep 17 00:00:00 2001 From: Amartya Parijat Date: Mon, 8 Dec 2025 13:46:32 +0100 Subject: [PATCH 1/2] Make Widget:filters public The method Widget:filters is made public in this commit as it is used by many children classes implementing it and having it package protected prevents the children outside the package to use it. --- .../Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java | 2 +- .../Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java | 2 +- .../Eclipse SWT/win32/org/eclipse/swt/widgets/Widget.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java index 4e42aa8920d..8f8dad46b6c 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java @@ -870,7 +870,7 @@ NSRect expansionFrameWithFrame_inView(long id, long sel, NSRect cellRect, long v return result; } -boolean filters (int eventType) { +public boolean filters (int eventType) { return display.filters (eventType); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java index 46fabc5b44a..163c7fc1217 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java @@ -1194,7 +1194,7 @@ long filterProc(long xEvent, long gdkEvent, long data2) { return 0; } -boolean filters (int eventType) { +public boolean filters (int eventType) { return display.filters (eventType); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Widget.java index 6799dc19047..20f366d7ffb 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Widget.java @@ -510,7 +510,7 @@ void error (int code) { SWT.error(code); } -boolean filters (int eventType) { +public boolean filters (int eventType) { return display.filters (eventType); } From a7c24dfef287e6d5e103f9ef0704cfcc29b713ca Mon Sep 17 00:00:00 2001 From: Amartya Parijat Date: Mon, 8 Dec 2025 13:48:03 +0100 Subject: [PATCH 2/2] Edge browser sends KeyEvent asynchronously Edge:handleAcceleratorKeyPressed must handle Browser:sendKeyEvent asynchronously as KeyEvent's Listeners can cause deadlock. Hence, the Handled of this event is set if there exists a listener for the event or a Display filter. --- .../win32/org/eclipse/swt/browser/Edge.java | 9 ++++-- .../org/eclipse/swt/widgets/Display.java | 28 ++++++++++++++++- .../cocoa/org/eclipse/swt/widgets/Widget.java | 2 +- .../gtk/org/eclipse/swt/widgets/Display.java | 28 ++++++++++++++++- .../gtk/org/eclipse/swt/widgets/Widget.java | 2 +- .../org/eclipse/swt/widgets/Display.java | 30 ++++++++++++++++++- .../win32/org/eclipse/swt/widgets/Widget.java | 2 +- 7 files changed, 92 insertions(+), 9 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java index edf1de646f8..da84ea4ba1b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java @@ -1573,9 +1573,12 @@ int handleAcceleratorKeyPressed(long pView, long pArgs) { return COM.S_OK; } - if (!sendKeyEvent(keyEvent)) { - args.put_Handled(true); - } + asyncExec(() -> { + sendKeyEvent(keyEvent); + }); + + boolean hasListener = browser.getListeners(keyEvent.type).length != 0 || browser.getDisplay().filters(keyEvent.type); + args.put_Handled(hasListener); } else { keyEvent.type = SWT.KeyUp; browser.notifyListeners (keyEvent.type, keyEvent); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java index dc2caec0293..82a230fa748 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java @@ -1224,7 +1224,33 @@ boolean filterEvent (Event event) { return false; } -boolean filters (int eventType) { +/** + * Checks for if there exists a listener in the collection of listeners who will + * be notified when an event of the given type occurs anywhere in a widget. The event type is one of the event constants + * defined in class SWT. When the event does occur, + * the listener is notified by sending it the handleEvent() + * message. + * + *

+ * Filters are listeners which are registered at display level by calling {@link Display#addFilter(int, Listener)}. These listeners are triggered when there happens an event of the type they are registered with, anywhere in an SWT application. + *

+ * + *

+ * Needs to be public as the consumers of display can register a filter from any package using public method addFilter and might need to check if there exists a filter for an event. + *

+ * + * @param eventType the type of an event to check if there exists a listener registered using addFilter + * @return true if there exists a listener which reacts to the eventType otherwise false + * + * @see Listener + * @see SWT + * @see #addFilter + * @see #removeFilter + * @see #removeListener + * + * @since 3.133 + */ +public boolean filters (int eventType) { if (filterTable == null) return false; return filterTable.hooks (eventType); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java index 8f8dad46b6c..4e42aa8920d 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java @@ -870,7 +870,7 @@ NSRect expansionFrameWithFrame_inView(long id, long sel, NSRect cellRect, long v return result; } -public boolean filters (int eventType) { +boolean filters (int eventType) { return display.filters (eventType); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java index 132f293b132..5d5180b7ab9 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java @@ -1987,7 +1987,33 @@ boolean filterEvent (Event event) { return false; } -boolean filters (int eventType) { +/** + * Checks for if there exists a listener in the collection of listeners who will + * be notified when an event of the given type occurs anywhere in a widget. The event type is one of the event constants + * defined in class SWT. When the event does occur, + * the listener is notified by sending it the handleEvent() + * message. + * + *

+ * Filters are listeners which are registered at display level by calling {@link Display#addFilter(int, Listener)}. These listeners are triggered when there happens an event of the type they are registered with, anywhere in an SWT application. + *

+ * + *

+ * Needs to be public as the consumers of display can register a filter from any package using public method addFilter and might need to check if there exists a filter for an event. + *

+ * + * @param eventType the type of an event to check if there exists a listener registered using addFilter + * @return true if there exists a listener which reacts to the eventType otherwise false + * + * @see Listener + * @see SWT + * @see #addFilter + * @see #removeFilter + * @see #removeListener + * + * @since 3.133 + */ +public boolean filters (int eventType) { if (filterTable == null) return false; return filterTable.hooks (eventType); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java index 163c7fc1217..46fabc5b44a 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java @@ -1194,7 +1194,7 @@ long filterProc(long xEvent, long gdkEvent, long data2) { return 0; } -public boolean filters (int eventType) { +boolean filters (int eventType) { return display.filters (eventType); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java index 84b1c94fd7b..0b707e9c8a6 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java @@ -1347,7 +1347,35 @@ boolean filterEvent (Event event) { return false; } -boolean filters (int eventType) { + + +/** + * Checks for if there exists a listener in the collection of listeners who will + * be notified when an event of the given type occurs anywhere in a widget. The event type is one of the event constants + * defined in class SWT. When the event does occur, + * the listener is notified by sending it the handleEvent() + * message. + * + *

+ * Filters are listeners which are registered at display level by calling {@link Display#addFilter(int, Listener)}. These listeners are triggered when there happens an event of the type they are registered with, anywhere in an SWT application. + *

+ * + *

+ * Needs to be public as the consumers of display can register a filter from any package using public method addFilter and might need to check if there exists a filter for an event. + *

+ * + * @param eventType the type of an event to check if there exists a listener registered using addFilter + * @return true if there exists a listener which reacts to the eventType otherwise false + * + * @see Listener + * @see SWT + * @see #addFilter + * @see #removeFilter + * @see #removeListener + * + * @since 3.133 + */ +public boolean filters (int eventType) { if (filterTable == null) return false; return filterTable.hooks (eventType); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Widget.java index 20f366d7ffb..6799dc19047 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Widget.java @@ -510,7 +510,7 @@ void error (int code) { SWT.error(code); } -public boolean filters (int eventType) { +boolean filters (int eventType) { return display.filters (eventType); }