On Fri, 2006-02-10 at 00:26 +0100, Mark Wielaard wrote:
> Hi Tom,
>
> On Thu, 2006-02-09 at 09:53 -0500, Thomas Fitzsimmons wrote:
> > On Thu, 2006-02-09 at 13:52 +0100, Mark Wielaard wrote:
> > > I like to debug this a bit further, but I couldn't find good
> > > documentation on the handling of (un)realized GtkComponentPeers. Does
> > > anybody have a link or an explanation of whether or not the above should
> > > ever happen?
> >
> > Yes it can happen especially in multi-threaded applications. You're
> > probably right to just ignore the paint event. It'd be useful to know
> > if hsqldb makes calls into the peers from different threads. For
> > example if it shows a window in one thread and another thread handles
> > painting on that window.
>
> No it doesn't. I was finally able to extract a simple testcase that
> shows the problem which also doesn't use any extra application Threads.
> See attached. If you update the tree to include Lillian's latest patches
> for GtkPanelPeer (which made the logic more clear to me, thanks Lillian)
> and add the following hack, you can see that the Panel doesn't seem to
> get realized. And always will print out the following after clicking on
> the button:
>
> getGraphics() called on unrealized:
> java.awt.Panel[panel0,4,25,66x25,invalid,parent=frame0,layout=java.awt.FlowLayout]
>
> I am not sure how/where the GtkPanelPeer should have been realized
> and/or whether this comes from the "delayed realization" you talked
> about (I don't actually see where this Panel will ever get realized to
> be honest).
Yes, panels are never realized because they do not have an X window
associated with them. Instead they draw on their parent's X window. So
GtkPanelPeer should probably override isRealized to check if it has a
parent and if so, if that parent is realized.
Tom
>
> The Hack (or workaround, if you only put in the return null, and not the
> dumpStack):
>
> --- gnu/java/awt/peer/gtk/GtkComponentPeer.java 9 Feb 2006 17:44:30
> -0000 1.101
> +++ gnu/java/awt/peer/gtk/GtkComponentPeer.java 9 Feb 2006 23:14:19
> -0000
> @@ -263,6 +262,13 @@
>
> public Graphics getGraphics ()
> {
> + if (! isRealized())
> + {
> + System.err.println("getGraphics() called on unrealized: " + awtWidget);
> + Thread.dumpStack();
> + return null;
> + }
> +
> if (GtkToolkit.useGraphics2D ())
> return new GdkGraphics2D (this);
> else
>
> Any insights on how to properly debug this welcome.
>
> I do have one patch to make the event passing a bit simpler. That
> doesn't change the result of this test case, but it makes it a little
> easier to follow the events that are fired. I'll post it in a second to
> the patches list.
>
> Cheers,
>
> Mark