Thread: [java-gnome-hackers] Main loop crashes
Brought to you by:
afcowie
From: Jester <jsn...@gm...> - 2010-06-01 04:05:18
|
I really like much of java-gnome but face a serious problem that may prevent me from porting a large-scale project from swing to gtk. When I run a background thread to retrieve some data widgets with a DrawingArea go blank. A subsequent close action on any window will crash the main loop in the following way: Exception in thread "main" org.gnome.glib.FatalError: Gdk-CRITICAL gdk_window_get_position: assertion `GDK_IS_WINDOW (window)' failed at org.gnome.gtk.GtkMain.gtk_main(Native Method) at org.gnome.gtk.GtkMain.main(GtkMain.java:82) at org.gnome.gtk.Gtk.main(Gtk.java:119) at ubnz.gtk.ToolbarDemo.main(ToolbarDemo.java:326) I've tried multiple potential workarounds, but the problem persists. Any idea how to resolve this? Thanks a bunch! Jester |
From: Jester <jsn...@gm...> - 2010-06-03 02:02:45
|
Jester <jsnow561@...> writes: > > I really like much of java-gnome but face a serious problem that may prevent me > from porting a large-scale project from swing to gtk. When I run a background > thread to retrieve some data widgets with a DrawingArea go blank. A subsequent > close action on any window will crash the main loop in the following way: > > Exception in thread "main" org.gnome.glib.FatalError: Gdk-CRITICAL > gdk_window_get_position: assertion `GDK_IS_WINDOW (window)' failed > at org.gnome.gtk.GtkMain.gtk_main(Native Method) > at org.gnome.gtk.GtkMain.main(GtkMain.java:82) > at org.gnome.gtk.Gtk.main(Gtk.java:119) > at ubnz.gtk.ToolbarDemo.main(ToolbarDemo.java:326) > > I've tried multiple potential workarounds, but the problem persists. Any idea > how to resolve this? > > Thanks a bunch! > Jester > > ------------------------------------------------------------------------------ > Wow, this place sure is quiet! I'm beginning to lose faith... By the way, I've tested the issue with the release candidate for 4.0.16 which was posted recently and it shows the same problem. Would be great if somebody could shed some light on this. Thanks again, Jester |
From: Kenneth P. <ken...@gm...> - 2010-06-03 02:18:29
Attachments:
signature.asc
|
On Thu, 3 Jun 2010 02:02:18 +0000 (UTC) Jester <jsn...@gm...> wrote: > Jester <jsnow561@...> writes: > > > [snip] Perhaps you could attach a small test case that demonstrates this problem? |
From: Jester <jsn...@gm...> - 2010-06-03 02:56:50
|
Thanks for the reply. I don't see an attach button but will post a link to a test case by tomorrow. |
From: Jester <jsn...@gm...> - 2010-06-03 04:59:41
|
Here's the code that will reproduce the crash (2 classes): --- DrawingWin (main class) import org.freedesktop.cairo.Pattern; import org.gnome.gdk.Event; import org.gnome.gdk.EventExpose; import org.gnome.gdk.Rectangle; import org.gnome.gtk.DrawingArea; import org.gnome.gtk.Gtk; import org.gnome.gtk.VBox; import org.gnome.gtk.Widget; import org.gnome.gtk.Window; import org.gnome.gtk.WindowPosition; import org.freedesktop.cairo.Context; import org.freedesktop.cairo.Format; import org.freedesktop.cairo.ImageSurface; import org.gnome.gtk.PolicyType; import org.gnome.gtk.ScrolledWindow; public class DrawingWin extends Window { private ImageSurface surface; DrawingWin() { hide(); setTitle("DrawingWin"); VBox vbox = new VBox(false, 3); final DrawingArea d; d = new DrawingArea(); d.setSizeRequest(800, 800 + 400); ScrolledWindow scroll = new ScrolledWindow(); scroll.setPolicy(PolicyType.AUTOMATIC, PolicyType.AUTOMATIC); scroll.addWithViewport(d); vbox.add(scroll); add(vbox); setPosition(WindowPosition.CENTER); setSizeRequest(600, 400); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); showAll(); surface = new ImageSurface(Format.ARGB32, 800, 1200); Context im = new Context(surface); //im.setAntialias(Antialias.DEFAULT); im.setLineWidth(1.0); im.setSource(0.8, 0.8, 0.8); im.rectangle(0, 0, 800, 1200); im.fill(); im.setSource(0.0, 0.0, 0.0); im.rectangle(10, 10, 600, 400); im.stroke(); im.setSource(1.0, 1.0, 1.0); im.rectangle(10, 10, 600, 400); im.fill(); im.setSource(0.0, 0.0, 1.0); im.moveTo(25.0, 25.0); im.lineTo(50.0, 100.0); im.stroke(); d.connect(new Widget.ExposeEvent() { public boolean onExposeEvent(Widget source, EventExpose event) { System.out.println("expose action"); final Context cr; final Rectangle rect; final Pattern linear, radial; rect = event.getArea(); int canvasWidth = 800; int canvasHeight = 1400; System.out.println(rect); cr = new Context(source.getWindow()); cr.setSource(0.0, 0.8, 0.95); cr.rectangle(0, 0, canvasWidth, canvasHeight); cr.fill(); cr.setSource(surface, 0, 0); cr.paint(); System.out.println("paint"); return true; } }); } public static void main(String[] args) { Gtk.init(args); new DrawingWin(); new ThreadWin(); Gtk.main(); } } --- ThreadsWin import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.logging.Level; import java.util.logging.Logger; import org.gnome.gdk.Event; import org.gnome.gtk.Button; import org.gnome.gtk.VBox; import org.gnome.gtk.Widget; import org.gnome.gtk.Window; import org.gnome.gtk.WindowPosition; public class ThreadWin extends Window { DownloadTask t; ThreadWin() { hide(); setTitle("ThreadWin"); VBox vbox = new VBox(false, 3); Button start = new Button("Start"); start.connect(new Button.Clicked() { @Override public void onClicked(Button source) { t = new DownloadTask(); t.start(); } }); vbox.add(start); add(vbox); setPosition(WindowPosition.CENTER); setSizeRequest(140, 40); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { t.cancelTask(); return false; } }); showAll(); } private class DownloadTask extends Thread implements Runnable { boolean canceled = false; @Override public void run() { int idx = 0; while (!canceled) { System.out.println(idx); //loadDataFromFile("PWAV.q"); File f = new File(System.getProperty("user.home")); File[] files = f.listFiles(); for (int i = 0; i < files.length; i++) { f = files[i]; if (f.isFile()) { readFile(f); } } synchronized (this) { try { wait(10); } catch (InterruptedException ex) { Logger.getLogger(DrawingWin.class.getName()).log(Level.SEVERE, null, ex); } } idx++; } } void cancelTask() { canceled = true; } } void readFile(File f) { try { FileInputStream fin = new FileInputStream(f); BufferedReader in = new BufferedReader(new InputStreamReader(fin)); // do nothing here... in.close(); } catch (FileNotFoundException ex) { System.out.println(ex); } catch (IOException ex) { System.err.println(ex); } } } --- Instructions: 1. Run DrawingWin which will open two windows, DrawingWin and ThreadsWin 2. Press start which launches a thread 3. You will notice that DrawingWin goes blank (the drawing disappears) 4. Close ThreadWin by pressing the close button on the window bar 5. Close DrawingWin 6. You will see the following crash log: Exception in thread "main" org.gnome.glib.FatalError: Gdk-CRITICAL gdk_window_get_position: assertion `GDK_IS_WINDOW (window)' failed at org.gnome.gtk.GtkMain.gtk_main(Native Method) at org.gnome.gtk.GtkMain.main(GtkMain.java:82) at org.gnome.gtk.Gtk.main(Gtk.java:119) at DrawingWin.main(DrawingWin.java:119) My apologies for the slightly complicated example, but it requires two windows to trigger the assertion problem from above. Jester |