Community
Participate
Working Groups
Using SWT 3.3.2.v3349d The bug: On GTK, Printers.getPrinterList() is causing key events to be fired. The javadoc on this method seems to indicate that it is a read-only method, so it should not be firing change events in any circumstance. Consequences: On my system, this caused the class file editor to try to dispose itself on creation. Here's the problematic bit of the stack trace: org.eclipse.ui.internal.keys.WorkbenchKeyboard$KeyDownFilter.handleEvent(WorkbenchKeyboard.java:126) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66) at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1423) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1100) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1125) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1110) at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1137) at org.eclipse.swt.widgets.Widget.gtk_key_press_event(Widget.java:663) at org.eclipse.swt.widgets.Control.gtk_key_press_event(Control.java:2533) at org.eclipse.swt.widgets.Composite.gtk_key_press_event(Composite.java:679) at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:1486) at org.eclipse.swt.widgets.Control.windowProc(Control.java:4234) at org.eclipse.swt.widgets.Display.windowProc(Display.java:3973) at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method) at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(OS.java:5593) at org.eclipse.swt.widgets.Display.eventProc(Display.java:1192) at org.eclipse.swt.internal.gtk.OS._gtk_enumerate_printers(Native Method) at org.eclipse.swt.internal.gtk.OS.gtk_enumerate_printers(OS.java:6260) at org.eclipse.swt.printing.Printer.getPrinterList(Printer.java:79) Full stack trace follows: org.eclipse.ui.PartInitException: Warning: Blocked recursive attempt by part org.eclipse.jdt.ui.ClassFileEditor to dispose itself during creation at org.eclipse.ui.internal.WorkbenchPartReference.dispose(WorkbenchPartReference.java:655) at org.eclipse.ui.internal.WorkbenchPage.disposePart(WorkbenchPage.java:1604) at org.eclipse.ui.internal.WorkbenchPage.handleDeferredEvents(WorkbenchPage.java:1354) at org.eclipse.ui.internal.WorkbenchPage.deferUpdates(WorkbenchPage.java:1338) at org.eclipse.ui.internal.WorkbenchPage.closeEditors(WorkbenchPage.java:1312) at org.eclipse.ui.internal.WorkbenchPage.closeEditor(WorkbenchPage.java:1367) at org.eclipse.ui.internal.tweaklets.TabBehaviourMRU.reuseInternalEditor(TabBehaviourMRU.java:114) at org.eclipse.ui.internal.EditorManager.reuseInternalEditor(EditorManager.java:832) at org.eclipse.ui.internal.EditorManager.openEditorFromDescriptor(EditorManager.java:645) at org.eclipse.ui.internal.EditorManager.openEditor(EditorManager.java:634) at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2737) at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2651) at org.eclipse.ui.internal.WorkbenchPage.access$13(WorkbenchPage.java:2643) at org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:2595) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67) at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2590) at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2574) at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2565) at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:299) at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:173) at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:194) at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:152) at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:272) at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:244) at org.eclipse.jface.action.Action.runWithEvent(Action.java:498) at org.eclipse.ui.commands.ActionHandler.execute(ActionHandler.java:185) at org.eclipse.ui.internal.handlers.LegacyHandlerWrapper.execute(LegacyHandlerWrapper.java:109) at org.eclipse.core.commands.Command.executeWithChecks(Command.java:475) at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:429) at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:165) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.executeCommand(WorkbenchKeyboard.java:470) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.press(WorkbenchKeyboard.java:821) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.processKeyEvent(WorkbenchKeyboard.java:879) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.filterKeySequenceBindings(WorkbenchKeyboard.java:568) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.access$3(WorkbenchKeyboard.java:510) at org.eclipse.ui.internal.keys.WorkbenchKeyboard$KeyDownFilter.handleEvent(WorkbenchKeyboard.java:126) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66) at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1423) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1100) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1125) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1110) at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1137) at org.eclipse.swt.widgets.Widget.gtk_key_press_event(Widget.java:663) at org.eclipse.swt.widgets.Control.gtk_key_press_event(Control.java:2533) at org.eclipse.swt.widgets.Composite.gtk_key_press_event(Composite.java:679) at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:1486) at org.eclipse.swt.widgets.Control.windowProc(Control.java:4234) at org.eclipse.swt.widgets.Display.windowProc(Display.java:3973) at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method) at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(OS.java:5593) at org.eclipse.swt.widgets.Display.eventProc(Display.java:1192) at org.eclipse.swt.internal.gtk.OS._gtk_enumerate_printers(Native Method) at org.eclipse.swt.internal.gtk.OS.gtk_enumerate_printers(OS.java:6260) at org.eclipse.swt.printing.Printer.getPrinterList(Printer.java:79) at org.eclipse.jface.text.TextViewer.isPrintable(TextViewer.java:4135) at org.eclipse.jface.text.TextViewer.canDoOperation(TextViewer.java:3672) at org.eclipse.jface.text.source.SourceViewer.canDoOperation(SourceViewer.java:667) at org.eclipse.jface.text.source.projection.ProjectionViewer.canDoOperation(ProjectionViewer.java:1531) at org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer.canDoOperation(JavaSourceViewer.java:193) at org.eclipse.ui.texteditor.TextOperationAction.update(TextOperationAction.java:157) at org.eclipse.ui.texteditor.TextOperationAction.<init>(TextOperationAction.java:103) at org.eclipse.ui.texteditor.AbstractTextEditor.createActions(AbstractTextEditor.java:5430) at org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.createActions(AbstractDecoratedTextEditor.java:1029) at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.createActions(JavaEditor.java:2259) at org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditor.createActions(ClassFileEditor.java:527) at org.eclipse.ui.texteditor.AbstractTextEditor.createPartControl(AbstractTextEditor.java:3339) at org.eclipse.ui.texteditor.StatusTextEditor.createPartControl(StatusTextEditor.java:53) at org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.createPartControl(AbstractDecoratedTextEditor.java:378) at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.createPartControl(JavaEditor.java:2618) at org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditor.createPartControl(ClassFileEditor.java:708) at org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:661) at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:426) at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:592) at org.eclipse.ui.internal.EditorReference.getEditor(EditorReference.java:263) at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2739) at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2651) at org.eclipse.ui.internal.WorkbenchPage.access$13(WorkbenchPage.java:2643) at org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:2595) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67) at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2590) at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2574) at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2565) at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:299) at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:173) at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:194) at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:152) at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:272) at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:244) at org.eclipse.jface.action.Action.runWithEvent(Action.java:498) at org.eclipse.ui.commands.ActionHandler.execute(ActionHandler.java:185) at org.eclipse.ui.internal.handlers.LegacyHandlerWrapper.execute(LegacyHandlerWrapper.java:109) at org.eclipse.core.commands.Command.executeWithChecks(Command.java:475) at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:429) at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:165) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.executeCommand(WorkbenchKeyboard.java:470) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.press(WorkbenchKeyboard.java:821) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.processKeyEvent(WorkbenchKeyboard.java:879) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.filterKeySequenceBindings(WorkbenchKeyboard.java:568) at org.eclipse.ui.internal.keys.WorkbenchKeyboard.access$3(WorkbenchKeyboard.java:510) at org.eclipse.ui.internal.keys.WorkbenchKeyboard$KeyDownFilter.handleEvent(WorkbenchKeyboard.java:126) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66) at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1423) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1100) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1125) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1110) at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1137) at org.eclipse.swt.widgets.Widget.gtk_key_press_event(Widget.java:663) at org.eclipse.swt.widgets.Control.gtk_key_press_event(Control.java:2533) at org.eclipse.swt.widgets.Composite.gtk_key_press_event(Composite.java:679) at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:1486) at org.eclipse.swt.widgets.Control.windowProc(Control.java:4234) at org.eclipse.swt.widgets.Display.windowProc(Display.java:3973) at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method) at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(OS.java:5593) at org.eclipse.swt.widgets.Display.eventProc(Display.java:1192) at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method) at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(OS.java:1487) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2969) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2389) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2353) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2219) at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:289) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:461) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:106) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:169) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:615) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:508) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:447) at org.eclipse.equinox.launcher.Main.run(Main.java:1173)
Lord.
The following SWT-only snippet works for me, i.e. there aren't any spurious keydown events getting fired... I am on the latest SWT (post 3.4 M6) and my Linux is OpenClient 2.1. Can you try running this on your Linux and see if you get any keydown events printed to the Console? Thanks. import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.layout.*; import org.eclipse.swt.printing.*; public class TestGetPrinterList2 { public static void main(String[] args) { Display display = new Display(); display.addFilter(SWT.KeyDown, new Listener() { public void handleEvent(Event event) { System.out.println("\nkey press event=" + new KeyEvent(event)); } }); Shell shell = new Shell (display); shell.setText("TestGetPrinterList"); shell.setLayout(new FillLayout()); Button button = new Button (shell, SWT.PUSH); button.setText("List Printers"); button.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { // Test listPrinters API System.out.println("\nLooking for printers..."); PrinterData printerList[] = Printer.getPrinterList(); int printerCount = printerList.length; System.out.println("\nThere are: " + printerCount + " printers."); if (printerCount > 0) System.out.println("\nPrinter List: "); for (int p = 0; p < printerList.length; p++) { System.out.println("\t" + p + ": " + printerList[p]); } } }); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }
Also, does the problem occur on a recent Eclipse build?
Bogdan, can you confirm that you made some significant changes to Printer.getPrinterList() since Eclipse 3.3 shipped? If so, do you recall if those changes were backported into 3.3.2? Stefan, what version of Linux & GTK are you running on your system?
Some changes were made to getPrinterList: - handle calling getPrinterList without creating a display - added a disablePrinting flag Both of these were *not* ported into 3.3.2 but I'm not sure they would have any effect for this particular bug.
> there aren't any spurious keydown events getting fired... The events might not have been spurious (I don't recall if I used a hotkey to open the editor or not). The problem here is /when/ they were fired - not /that/ they were fired.
It's clear from Stefan's stack that we (GTK) have a bug. We need to investigate blocking events like we have to do for the clipboard and other places where GTK runs a free event loop.
> Stefan, what version of Linux & GTK are you running on your system? Sorry, didn't notice this question the first time around. I'm currently running Kubuntu 8.04 with the KDE 4.0 packages installed. The package manager may have updated some package versions since I filed this, but I think the versions would have been pretty close to the current Kubuntu defaults. My current kernel version is: 2.6.24-17-generic #1 SMP Thu May 1 14:31:33 UTC 2008 i686 GNU/Linux
Is this bug still relevant? I would say no but who knows.
> I would say no but who knows. I'm really not sure. I don't see any code in OS.java that would suppress "free" event loops, but I also haven't seen it occur since I filed it years ago. Feel free to close if the info above isn't helpful.
Closing. If there is an issue it deserves new bug where it can be tracked properly.
Thanks, Alex. Thanks, Stefan. Closed is good.