[kaffe] Bug Report with partial fix
Ross Martin
hacker@ross.interwrx.com
Thu Oct 9 20:59:02 2003
Hi Guys,
I've been trying to get kaffe's appletviewer to work with RuneScape,
which you can try as follows:
appletviewer
"http://www.runescape.com/client.cgi&world=4&plugin=0&rand=66351490"
Kaffe without patches fails to even load the applet. I've attached a
patch that fixes kaffe/applet/AppletTag.java
and java/awt/ImageLoader.java to at least get it to the load stage and
display some of the animations.
However, there is still a bug that I haven't yet figured out. For some
reason, the mouse clicks aren't
being translated to the correct position for the Panel containing the
Applet. As a result, you have to click
with the mouse 10-20 pixels too high to get the buttons to register.
I'd like some help with this last
problem, if someone could be so kind.
I've tried running kaffe's AppletViewer.class using Sun's java, and this
loaded the Applet fine and
produced the correct mouse translation. So the problem isn't in the
AppletViewer. It's probably
somewhere in kaffe's behind-the-scenes mouse event dispatch code. I
only have a vague idea how
this is supposed to work, so I'm hoping someone else could either find
the problem or help me
understand what is supposed to happen so I can better debug where it
goes wrong.
I'm using kaffe version 1.1.2...
Ross
Here's the patch for the part I fixed so far. Could someone with access
please apply it?
(If you have any problem with it, send me an email and I'll send it
directly to you as
an attachment.) What it does:
Patch to AppletTag is so it treats ':' and '/' as normal alphabetic
characters. This is necessary
to get it to treat "http://xxx.yyy.zzz" as being a single token in its
parser, which is necessary
for correct parsing of web addresses.
Patch to ImageLoader causes it to not start a new ImageFrameLoader for
Image streams that
an ImageFrameLoader can't handle, but ImageLoader handles fine.
Patch begins:
diff -ru kaffe-1.1.2-orig/libraries/javalib/java/awt/ImageLoader.java
kaffe-1.1.2/libraries/javalib/java/awt/ImageLoader.java
--- kaffe-1.1.2-orig/libraries/javalib/java/awt/ImageLoader.java
2003-10-09 18:24:42.000000000 -0700
+++ kaffe-1.1.2/libraries/javalib/java/awt/ImageLoader.java
2003-10-09 18:27:45.000000000 -0700
@@ -45,6 +45,9 @@
// give native layer a chance to do alpha channel reduction
if ( !(img.producer instanceof ImageNativeProducer) )
Toolkit.imgComplete( img.nativeData, status);
+ img.stateChange( s, 0, 0, img.width, img.height);
+ img.producer.removeConsumer( this); + img = null;
// we are done with it, prevent memory leaks
}
else if ( status == SINGLEFRAMEDONE ) {
s = ImageObserver.FRAMEBITS;
@@ -52,20 +55,26 @@
// This is a (indefinite) movie production - move it out of the
way (in its own thread)
// so that we can go on with useful work. Note that if our
producer was a ImageNativeProducer,
// the whole external image has been read in already (no IO
required, anymore)
- new ImageFrameLoader( img);
+
+ if ( img.producer instanceof ImageNativeProducer ) {
+ new ImageFrameLoader( img);
+ img.stateChange( s, 0, 0, img.width, img.height);
+ img.producer.removeConsumer( this); + img =
null; // we are done with it, prevent memory leaks
+ }
+ else {
+ img.stateChange( s, 0, 0, img.width, img.height);
+ }
}
else {
if ( (status & IMAGEERROR) != 0 ) s |= ImageObserver.ERROR;
if ( (status & IMAGEABORTED) != 0 ) s |= ImageObserver.ABORT;
+ img.stateChange( s, 0, 0, img.width, img.height);
+ img.producer.removeConsumer( this); + img = null;
// we are done with it, prevent memory leaks
}
- img.stateChange( s, 0, 0, img.width, img.height);
- // this has to be called *after* a optional ImageFrameLoader went
into action, since
- // the producer might decide to stop if it doesn't have another
consumer
- img.producer.removeConsumer( this);
- - img = null; // we are done with it, prevent memory leaks
if ( this == asyncLoader )
notify(); // in case we had an async producer
}
diff -ru kaffe-1.1.2-orig/libraries/javalib/kaffe/applet/AppletTag.java
kaffe-1.1.2/libraries/javalib/kaffe/applet/AppletTag.java
--- kaffe-1.1.2-orig/libraries/javalib/kaffe/applet/AppletTag.java
2003-10-09 18:24:43.000000000 -0700
+++ kaffe-1.1.2/libraries/javalib/kaffe/applet/AppletTag.java
2003-10-09 18:26:21.000000000 -0700
@@ -260,7 +260,8 @@
int ttype;
st.lowerCaseMode( true);
- st.ordinaryChar('/');
+ st.wordChars('/', '/');
+ st.wordChars(':', ':');
while ( (ttype = st.nextToken()) != st.TT_EOF ) {
if ( ttype == '<' ) {