Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 226560 - Printers.getPrinterList() is causing events to be fired
Summary: Printers.getPrinterList() is causing events to be fired
Status: CLOSED WONTFIX
Alias: None
Product: Platform
Classification: Eclipse Project
Component: SWT (show other bugs)
Version: 3.4   Edit
Hardware: PC Linux
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Carolyn MacLeod CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-04-10 12:22 EDT by Stefan Xenos CLA
Modified: 2017-01-05 16:50 EST (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Stefan Xenos CLA 2008-04-10 12:22:40 EDT
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)
Comment 1 Steve Northover CLA 2008-04-10 13:54:36 EDT
Lord.
Comment 2 Carolyn MacLeod CLA 2008-04-10 17:10:07 EDT
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();
}
}
Comment 3 Carolyn MacLeod CLA 2008-04-10 17:11:48 EDT
Also, does the problem occur on a recent Eclipse build?
Comment 4 Carolyn MacLeod CLA 2008-04-10 17:17:20 EDT
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?
Comment 5 Bogdan Gheorghe CLA 2008-04-10 17:24:30 EDT
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. 
Comment 6 Stefan Xenos CLA 2008-04-11 11:37:32 EDT
> 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.
Comment 7 Steve Northover CLA 2008-04-11 11:45:35 EDT
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.
Comment 8 Stefan Xenos CLA 2008-07-29 12:51:55 EDT
> 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
Comment 9 Alexander Kurtakov CLA 2017-01-05 15:31:17 EST
Is this bug still relevant? I would say no but who knows.
Comment 10 Stefan Xenos CLA 2017-01-05 16:06:31 EST
> 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.
Comment 11 Alexander Kurtakov CLA 2017-01-05 16:38:59 EST
Closing. If there is an issue it deserves new bug where it can be tracked properly.
Comment 12 Carolyn MacLeod CLA 2017-01-05 16:50:12 EST
Thanks, Alex. Thanks, Stefan. Closed is good.