diff options
Diffstat (limited to 'gnu/java/awt/peer/gtk/GtkComponentPeer.java')
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkComponentPeer.java | 115 |
1 files changed, 63 insertions, 52 deletions
diff --git a/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/gnu/java/awt/peer/gtk/GtkComponentPeer.java index fe0dae70d..9c23fa30a 100644 --- a/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -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. @@ -46,10 +47,10 @@ import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; +import java.awt.EventQueue; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.Image; import java.awt.Insets; @@ -87,8 +88,6 @@ public class GtkComponentPeer extends GtkGenericPeer 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 */ @@ -303,29 +302,29 @@ public class GtkComponentPeer extends GtkGenericPeer { case PaintEvent.PAINT: case PaintEvent.UPDATE: - { - try - { - Graphics g = getGraphics (); - - // Some peers like GtkFileDialogPeer are repainted by Gtk itself - if (g == null) - break; - - g.setClip (((PaintEvent) event).getUpdateRect()); - - if (id == PaintEvent.PAINT) - awtComponent.paint (g); - else - awtComponent.update (g); - - g.dispose (); - } - catch (InternalError e) - { - System.err.println (e); - } - } + { + try + { + Graphics g = getGraphics(); + + if (!awtComponent.isShowing() || awtComponent.getWidth() < 1 + || awtComponent.getHeight() < 1 || g == null) + break; + + g.setClip(((PaintEvent) event).getUpdateRect()); + + if (id == PaintEvent.PAINT) + awtComponent.paint(g); + else + awtComponent.update(g); + + g.dispose(); + } + catch (InternalError e) + { + System.err.println(e); + } + } break; case KeyEvent.KEY_PRESSED: ke = (KeyEvent) event; @@ -383,19 +382,30 @@ public class GtkComponentPeer extends GtkGenericPeer if (x == 0 && y == 0 && width == 0 && height == 0) return; - repaintTimer.schedule(new RepaintTimerTask(x, y, width, height), tm); + 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 +413,12 @@ public class GtkComponentPeer extends GtkGenericPeer 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 () @@ -443,26 +459,17 @@ public class GtkComponentPeer extends GtkGenericPeer // non-lightweight. boolean lightweightChild = false; Insets i; - while (parent.isLightweight ()) + while (parent.isLightweight()) { - lightweightChild = true; + lightweightChild = true; - next_parent = parent.getParent (); + next_parent = parent.getParent(); - i = ((Container) parent).getInsets (); + i = ((Container) parent).getInsets(); + new_x += parent.getX() + i.left; + new_y += parent.getY() + i.top; - if (next_parent instanceof Window) - { - new_x += i.left; - new_y += i.top; - } - else - { - new_x += parent.getX () + i.left; - new_y += parent.getY () + i.top; - } - - parent = next_parent; + parent = next_parent; } // We only need to convert from Java to GTK coordinates if we're @@ -571,6 +578,8 @@ public class GtkComponentPeer extends GtkGenericPeer KeyEvent keyEvent = new KeyEvent (awtComponent, id, when, mods, keyCode, keyChar, keyLocation); + EventQueue q = q(); + // Also post a KEY_TYPED event if keyEvent is a key press that // doesn't represent an action or modifier key. if (keyEvent.getID () == KeyEvent.KEY_PRESSED @@ -579,15 +588,17 @@ public class GtkComponentPeer extends GtkGenericPeer && keyCode != KeyEvent.VK_CONTROL && keyCode != KeyEvent.VK_ALT)) { - synchronized (q) - { - q().postEvent (keyEvent); - q().postEvent (new KeyEvent (awtComponent, KeyEvent.KEY_TYPED, when, mods, - KeyEvent.VK_UNDEFINED, keyChar, keyLocation)); + synchronized(q) + { + q.postEvent(keyEvent); + keyEvent = new KeyEvent(awtComponent, KeyEvent.KEY_TYPED, when, + mods, KeyEvent.VK_UNDEFINED, keyChar, + keyLocation); + q.postEvent(keyEvent); } } else - q().postEvent (keyEvent); + q.postEvent(keyEvent); } protected void postFocusEvent (int id, boolean temporary) |