Hi, While debugging some awt gtk+ peer issues I noticed that we always route repaint events through 2 queues. First we create a Timer and put it in there. Second we put it in the actual system event queue. If the repaint is requested immediately that is overkill. And looking at a couple of sample programs it looks like delayed repaints are not that often requested at all. So this patch defers the creation of the Timer till the first time a delayed repaint request is actually made. And it immediately posts the repaint event to the system event queue if no delay is asked for.
2006-02-09 Mark Wielaard <[EMAIL PROTECTED]> * gnu/java/awt/peer/gtk/GtkComponentPeer.java (repaintTimer): Removed field. (repaint): Immediately post to queue when tm <= 0, otherwise call RepaintTimerTask.schedule(). (RepaintTimerTask): Make static. (RepaintTimerTask.repaintTimer): New static final field. (RepaintTimerTask.awtComponent): New field. (schedule): New static method. OK to commit? Cheers, Mark
Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v retrieving revision 1.101 diff -u -r1.101 GtkComponentPeer.java --- 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:29:38 -0000 @@ -1,5 +1,6 @@ /* GtkComponentPeer.java -- Implements ComponentPeer with GTK - Copyright (C) 1998, 1999, 2002, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2002, 2004, 2005, 2006 + Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -87,8 +88,6 @@ boolean isInRepaint; - static final Timer repaintTimer = new Timer (true); - /* this isEnabled differs from Component.isEnabled, in that it knows if a parent is disabled. In that case Component.isEnabled may return true, but our isEnabled will always return false */ @@ -383,19 +389,32 @@ if (x == 0 && y == 0 && width == 0 && height == 0) return; - repaintTimer.schedule(new RepaintTimerTask(x, y, width, height), tm); + System.err.println("UPDATE: " + awtComponent); + Thread.dumpStack(); + if (tm <= 0) + q().postEvent(new PaintEvent(awtComponent, PaintEvent.UPDATE, + new Rectangle(x, y, width, height))); + else + RepaintTimerTask.schedule(tm, x, y, width, height, awtComponent); } - private class RepaintTimerTask extends TimerTask + /** + * Used for scheduling delayed paint updates on the event queue. + */ + private static class RepaintTimerTask extends TimerTask { + private static final Timer repaintTimer = new Timer(true); + private int x, y, width, height; + private Component awtComponent; - RepaintTimerTask(int x, int y, int width, int height) + RepaintTimerTask(Component c, int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; + this.awtComponent = c; } public void run() @@ -403,6 +422,12 @@ q().postEvent (new PaintEvent (awtComponent, PaintEvent.UPDATE, new Rectangle (x, y, width, height))); } + + static void schedule(long tm, int x, int y, int width, int height, + Component c) + { + repaintTimer.schedule(new RepaintTimerTask(c, x, y, width, height), tm); + } } public void requestFocus ()
signature.asc
Description: This is a digitally signed message part