Bug 87410 - [Browser] Display.addFilter, MenuItem.setAccelerator, SWT.KeyDown inconsistencies
Summary: [Browser] Display.addFilter, MenuItem.setAccelerator, SWT.KeyDown inconsisten...
Status: NEW
Alias: None
Product: Platform
Classification: Eclipse Project
Component: SWT (show other bugs)
Version: 3.1   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Grant Gayed CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-03-08 12:12 EST by Christophe Cornu CLA
Modified: 2019-09-06 16:16 EDT (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Christophe Cornu CLA 2005-03-08 12:12:23 EST
What is the expected order for KeyDown coming from Display.addFilter, related 
MenuItem accelerator event and SWT.KeyDown emitted by a widget?

Case 1 - show that MenuItem.setAccelerator and Display.addFilter must not be 
mixed

1. Run snippet below on Windows
2. Give focus to text widget (left side)
3. Press CTRL N

Result:
Display KeyDown character  keyCode 262144
menuitem accelerator

Interpretation:
Display.addFilter emitted KeyDown for the CTRL keydown.
Menu item accelerator was fired when the N keydown was pressed.
Display.addFilter never emitted KeyDown for the N.

This means the menu item accelerator wins over someone trying to use 
Display.addFilter to fake accelerators. If no menu item accelerator is set, 
Display.addFilter fires the expected 2 keydown events:
Display KeyDown character keyCode 262144
Display KeyDown character keyCode 110


Case 2. Show that OLE/ActiveX fires too many Display.addFilter events

1. Run snippet below on Windows
2. Give focus to Browser widget (left side)
3. Press key 'f'

Display KeyDown character f keyCode 102
Display KeyDown character f keyCode 102
Browser KeyDown character f keyCode 102

There should only be one Display KeyDown event. The results are the same even 
if the Browser widget does not handle the TranslateAccelerator callback from 
MSHTML. Veronika: how can we test this on an activeX either than IE?

Here are the stack traces for each of these events:
Display KeyDown character f keyCode 102
java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1064)
	at PRBrowser$1.handleEvent(PRBrowser.java:13)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
	at org.eclipse.swt.widgets.Display.filterEvent(Display.java:777)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:841)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:866)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:851)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:879)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:875)
	at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1181)
	at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:3121)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:3024)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:3466)
	at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1624)
	at org.eclipse.swt.ole.win32.OleFrame.getMsgProc(OleFrame.java:214)
	at org.eclipse.swt.internal.win32.OS.PeekMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.PeekMessage(OS.java:2071)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2522)
	at PRBrowser.main(PRBrowser.java:42)
Display KeyDown character f keyCode 102
java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1064)
	at PRBrowser$1.handleEvent(PRBrowser.java:13)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
	at org.eclipse.swt.widgets.Display.filterEvent(Display.java:777)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:841)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:866)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:851)
	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:659)
	at org.eclipse.swt.browser.Browser$1.handleEvent(Browser.java:178)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:842)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:866)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:851)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:879)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:875)
	at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1181)
	at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:3121)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:3024)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:3466)
	at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1624)
	at org.eclipse.swt.ole.win32.OleFrame.getMsgProc(OleFrame.java:214)
	at org.eclipse.swt.internal.win32.OS.PeekMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.PeekMessage(OS.java:2071)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2522)
	at PRBrowser.main(PRBrowser.java:42)
Browser KeyDown character f keyCode 102
java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1064)
	at PRBrowser$3.handleEvent(PRBrowser.java:35)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:842)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:866)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:851)
	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:659)
	at org.eclipse.swt.browser.Browser$1.handleEvent(Browser.java:178)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:842)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:866)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:851)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:879)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:875)
	at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1181)
	at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:3121)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:3024)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:3466)
	at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1624)
	at org.eclipse.swt.ole.win32.OleFrame.getMsgProc(OleFrame.java:214)
	at org.eclipse.swt.internal.win32.OS.PeekMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.PeekMessage(OS.java:2071)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2522)
	at PRBrowser.main(PRBrowser.java:42)
Comment 1 Christophe Cornu CLA 2005-03-08 15:24:45 EST
Snippet:
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.browser.*;

public class PRBrowser {

	public static void main(String[] args) {
		Display display = new Display();
		display.addFilter(SWT.KeyDown, new Listener() {
			public void handleEvent(Event e) {
				System.err.println("Display KeyDown 
character "+e.character+" keyCode "+e.keyCode);
				Thread.dumpStack();
			}
		});

		Shell shell = new Shell(display);
		Menu bar = new Menu(shell, SWT.BAR);
		MenuItem item = new MenuItem(bar, SWT.CASCADE);
		item.setAccelerator(SWT.CONTROL | 'n');
		item.addListener(SWT.Selection, new Listener(){
			public void handleEvent(Event e) {
				System.out.println("menuitem accelerator");
			}
		});
		item.setText("My Menu");
		shell.setMenuBar(bar);
		shell.setText("PRBrowser");
		shell.setLayout(new FillLayout());
		Text text = new Text(shell, SWT.NONE);
		Browser browser = new Browser(shell, SWT.NONE);
		browser.addListener(SWT.KeyDown,  new Listener() {
			public void handleEvent(Event e) {
				System.err.println("Browser KeyDown 
character "+e.character+" keyCode "+e.keyCode);
				Thread.dumpStack();
			}
		});
		browser.setText("<html><body>Hello</body></html>");
		shell.open();
		
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}		
	}
}
Comment 2 Christophe Cornu CLA 2005-03-08 15:28:52 EST
About Case 2:
The extra Display.addFilter keydown event is coming from notifyListeners 
invoked in the Browser widget for each keydown:

				case SWT.KeyDown:
				case SWT.KeyUp: {
					notifyListeners(e.type, e);
					break;

So that could be a problem for every custom widget?
Comment 3 Steve Northover CLA 2005-03-29 21:04:40 EST
Vikki and SN to understand the problem and fix it.  I thought that we saw this 
once already when hacking the original "allow key in embedded controls" fix.
Comment 4 Steve Northover CLA 2007-06-14 17:58:10 EDT
This is almost certainly fixed.  The order is that accelerators come first, then filters, then key down to a widget.

In OLE, by definition, the current order is accelerators, OLE control, filters, then key down.  This is the correct way that keys are processed for OLE, but there was some talk of overriding this to let filters and key down run before the OLE control.  It's not clear that this is even possible.

Grant to verify that the browser part of this bug is fixed and close.
Comment 5 Eclipse Webmaster CLA 2019-09-06 16:16:34 EDT
This bug hasn't had any activity in quite some time. Maybe the problem got resolved, was a duplicate of something else, or became less pressing for some reason - or maybe it's still relevant but just hasn't been looked at yet.

If you have further information on the current state of the bug, please add it. The information can be, for example, that the problem still occurs, that you still want the feature, that more information is needed, or that the bug is (for whatever reason) no longer relevant.